亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄 搜索
閱讀前篇 簡(jiǎn)介 Yii 是什么 從 Yii 1.1 升級(jí) 入門 安裝 Yii 運(yùn)行應(yīng)用 第一次問(wèn)候 使用Forms 數(shù)據(jù)庫(kù)應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過(guò)濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請(qǐng)求處理 運(yùn)行概述 啟動(dòng)引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請(qǐng)求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯(cuò)誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動(dòng)加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫(kù)工作 數(shù)據(jù)庫(kù)訪問(wèn) (Data Access Objects) 查詢生成器(Query Builder) 活動(dòng)記錄(Active Record) 數(shù)據(jù)庫(kù)遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗(yàn)證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復(fù)合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(yè)(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實(shí)踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁(yè)面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯(cuò)誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測(cè)試 概述(Overview) 配置測(cè)試環(huán)境(Testing environment setup) 單元測(cè)試(Unit Tests) 功能測(cè)試(Function Tests) 驗(yàn)收測(cè)試(Acceptance Tests) 測(cè)試夾具(Fixtures) 高級(jí)專題 高級(jí)應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺(tái)命令 核心驗(yàn)證器(Core Validators) 國(guó)際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
文字

性能優(yōu)化

性能優(yōu)化

有許多因素影響你的 Web 應(yīng)用程序的性能。有些是環(huán)境,有些是你的代碼,而其他一些與 Yii 本身有關(guān)。 在本節(jié)中,我們將列舉這些因素并解釋如何通過(guò)調(diào)整這些因素來(lái)提高應(yīng)用程序的性能。

優(yōu)化你的 PHP 環(huán)境

一個(gè)好的 PHP 環(huán)境是非常重要的。為了得到最大的性能,

  • 使用最新穩(wěn)定版本的 PHP 。 PHP 的主要版本可能帶來(lái)顯著的性能提升。
  • 啟用字節(jié)碼緩存?Opcache(PHP 5.5或更高版本)或?APC?(PHP 5.4或更早版本)。字節(jié)碼緩存省去了每次解析和加載 PHP 腳本所帶來(lái)的開銷。

禁用調(diào)試模式

對(duì)于運(yùn)行在生產(chǎn)環(huán)境中的應(yīng)用程序,你應(yīng)該禁用調(diào)試模式。 Yii 中使用名為?YII_DEBUG?的常量來(lái)定義調(diào)試模式是否應(yīng)被激活。 若啟用了調(diào)試模式,Yii 將需要額外的時(shí)間來(lái)產(chǎn)生和記錄調(diào)試信息。

你可以將下面的代碼行放在?入口腳本?的開頭來(lái)禁用調(diào)試模式:

defined('YII_DEBUG') or define('YII_DEBUG', false);

提示:?YII_DEBUG?的默認(rèn)值是 false 。所以如果你確信你不在你應(yīng)用程序代碼中別的地方更改其默認(rèn)值, 你可以簡(jiǎn)單地刪除上述行來(lái)禁用調(diào)試模式。

使用緩存技術(shù)

你可以使用各種緩存技術(shù)來(lái)提高應(yīng)用程序的性能。例如,如果你的應(yīng)用程序允許用戶以 Markdown 格式輸入文字, 你可以考慮緩存解析后的 Markdown 內(nèi)容,避免每個(gè)請(qǐng)求都重復(fù)解析相同的 Markdown 文本。 請(qǐng)參閱?緩存?一節(jié),了解 Yii 提供的緩存支持。

開啟 Schema 緩存

Schema 緩存是一個(gè)特殊的緩存功能,每當(dāng)你使用活動(dòng)記錄時(shí)應(yīng)該要開啟這個(gè)緩存功能。如你所知, 活動(dòng)記錄能智能檢測(cè)數(shù)據(jù)庫(kù)對(duì)象的集合(例如列名、列類型、約束)而不需要手動(dòng)地描述它們。活動(dòng)記錄是通過(guò)執(zhí)行額外的SQL查詢來(lái)獲得該信息。 通過(guò)啟用 Schema 緩存,檢索到的數(shù)據(jù)庫(kù)對(duì)象的集合將被保存在緩存中并在將來(lái)的請(qǐng)求中重用。

要開啟 Schema 緩存,需要配置一個(gè)?cache?應(yīng)用組件來(lái)儲(chǔ)存 Schema 信息, 并在?配置?中設(shè)置 yii\db\Connection::enableSchemaCache 為?true?:

return [
    // ...
    'components' => [
        // ...
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=mydatabase',
            'username' => 'root',
            'password' => '',
            'enableSchemaCache' => true,

            // Duration of schema cache.
            'schemaCacheDuration' => 3600,

            // Name of the cache component used to store schema information
            'schemaCache' => 'cache',
        ],
    ],
];

合并和壓縮資源文件

一個(gè)復(fù)雜的網(wǎng)頁(yè)往往包括許多 CSS 和 JavaScript 資源文件。為減少 HTTP 請(qǐng)求的數(shù)量和這些資源總下載的大小,應(yīng)考慮將它們合并成一個(gè)單一的文件并壓縮。 這可大大提高頁(yè)面加載時(shí)間,且減少了服務(wù)器負(fù)載。想了解更多細(xì)節(jié),請(qǐng)參閱前端資源部分。

優(yōu)化會(huì)話存儲(chǔ)

默認(rèn)會(huì)話數(shù)據(jù)被存儲(chǔ)在文件中。這是好的對(duì)處于發(fā)展項(xiàng)目或小型項(xiàng)目。但是,當(dāng)涉及要處理大量并發(fā)請(qǐng)求時(shí),最好使用其他的會(huì)話存儲(chǔ)方式,比如數(shù)據(jù)庫(kù)。 Yii 支持各種會(huì)話存儲(chǔ)。你可以通過(guò)在配置中配置?session?組件來(lái)使用這些存儲(chǔ),如下代碼:

return [
    // ...
    'components' => [
        'session' => [
            'class' => 'yii\web\DbSession',

            // Set the following if you want to use DB component other than
            // default 'db'.
            // 'db' => 'mydb',

            // To override default session table, set the following
            // 'sessionTable' => 'my_session',
        ],
    ],
];

以上配置是使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)會(huì)話數(shù)據(jù)。默認(rèn)情況下,它會(huì)使用?db?應(yīng)用組件連接數(shù)據(jù)庫(kù)并將會(huì)話數(shù)據(jù)存儲(chǔ)在?session?表。 因此,你必須創(chuàng)建如下的?session?表,

CREATE TABLE session (
    id CHAR(40) NOT NULL PRIMARY KEY,
    expire INTEGER,
    data BLOB
)

你也可以通過(guò)使用緩存來(lái)存儲(chǔ)會(huì)話數(shù)據(jù) yii\web\CacheSession 。理論上講,你可以使用只要支持?jǐn)?shù)據(jù)緩存。 但是請(qǐng)注意,某些緩存的存儲(chǔ)當(dāng)達(dá)到存儲(chǔ)限制會(huì)清除緩存數(shù)據(jù)。出于這個(gè)原因,你應(yīng)主要在不存在存儲(chǔ)限制時(shí)才使用這些緩存存儲(chǔ)。 如果你的服務(wù)器支持?Redis,強(qiáng)烈建議你通過(guò)使用 yii\redis\Session 來(lái)作為會(huì)話存儲(chǔ)。

優(yōu)化數(shù)據(jù)庫(kù)

執(zhí)行數(shù)據(jù)庫(kù)查詢并從數(shù)據(jù)庫(kù)中取出數(shù)據(jù)往往是一個(gè) Web 應(yīng)用程序主要的性能瓶頸。 盡管使用數(shù)據(jù)緩存技術(shù)可以緩解性能下降,但它并不完全解決這個(gè)問(wèn)題。 當(dāng)數(shù)據(jù)庫(kù)包含大量的數(shù)據(jù)且緩存數(shù)據(jù)是無(wú)效的,獲取最新的數(shù)據(jù)可能是最耗性能的假如在沒有適當(dāng)?shù)卦O(shè)計(jì)數(shù)據(jù)庫(kù)和查詢條件。

一般來(lái)說(shuō),提高數(shù)據(jù)庫(kù)查詢的性能是創(chuàng)建索引。例如,如果你需要找一個(gè)用戶表的“用戶名”,你應(yīng)該為“用戶名”創(chuàng)建一個(gè)索引。 注意,盡管索引可以使選擇查詢的速度快得多,但它會(huì)減慢插入、更新和刪除的查詢。

對(duì)于復(fù)雜的數(shù)據(jù)庫(kù)查詢,建議你創(chuàng)建數(shù)據(jù)庫(kù)視圖來(lái)保存查詢分析和準(zhǔn)備的時(shí)間。

最后,在“SELECT”中使用“LIMIT”查詢。這可以避免從數(shù)據(jù)庫(kù)中取出大量數(shù)據(jù)。

使用普通數(shù)組

盡管活動(dòng)記錄對(duì)象使用起來(lái)非常方便,但當(dāng)你需要從數(shù)據(jù)庫(kù)中檢索大量數(shù)據(jù)時(shí)它的效率不如使用普通的數(shù)組。 在這種情況下,你可以考慮在使用活動(dòng)記錄查詢數(shù)據(jù)時(shí)調(diào)用?asArray()?,使檢索到的數(shù)據(jù)被表示為數(shù)組而不是笨重的活動(dòng)記錄對(duì)象。例如,

class PostController extends Controller{
    public function actionIndex()
    {
        $posts = Post::find()->limit(100)->asArray()->all();
        
        return $this->render('index', ['posts' => $posts]);
    }
}

在上述代碼中,$posts 將被表中的行填充形成數(shù)組。每一行是一個(gè)普通的數(shù)組。要訪問(wèn) 第 i 行的?title?列,你可以使用表達(dá)式$post[$i]['title']?。

你也可以使用DAO以數(shù)組的方式來(lái)構(gòu)建查詢和檢索數(shù)據(jù)。

優(yōu)化 Composer 自動(dòng)加載

因?yàn)?Composer 自動(dòng)加載用于加載大多數(shù)第三方類文件,應(yīng)考慮對(duì)其進(jìn)行優(yōu)化,通過(guò)執(zhí)行以下命令:

composer dumpautoload -o

處理離線數(shù)據(jù)

當(dāng)一個(gè)請(qǐng)求涉及到一些資源密集操作,你應(yīng)該想辦法在無(wú)需用戶等待他們完成脫機(jī)模式時(shí)來(lái)執(zhí)行這些操作。

有兩種方法可以離線數(shù)據(jù)處理:推和拉。

在拉中,只要有請(qǐng)求涉及到一些復(fù)雜的操作,你創(chuàng)建一個(gè)任務(wù),并將其保存在永久存儲(chǔ),例如數(shù)據(jù)庫(kù)。然后,使用一個(gè)單獨(dú)的進(jìn)程(如 cron 作業(yè))拉任務(wù),并進(jìn)行處理。 這種方法很容易實(shí)現(xiàn),但它也有一些缺點(diǎn)。例如,該任務(wù)過(guò)程中需要定期地從任務(wù)存儲(chǔ)拉。如果拉頻率太低,這些任務(wù)可以延遲處理; 但是如果頻率過(guò)高,將引起的高開銷。

在推中,你可以使用消息隊(duì)列(如 RabbitMQ ,ActiveMQ , Amazon SQS 等)來(lái)管理任務(wù)。 每當(dāng)一個(gè)新的任務(wù)放在隊(duì)列中,它會(huì)啟動(dòng)或者通知任務(wù)處理過(guò)程去觸發(fā)任務(wù)處理。

性能分析

你應(yīng)該配置你的代碼來(lái)找出性能缺陷,并相應(yīng)地采取適當(dāng)措施。 以下分析工具可能是有用的:

  • Yii debug toolbar and debugger
  • XDebug profiler
  • XHProf
上一篇: 下一篇: