性能優(yōu)化(Performance Tuning)

2018-02-24 15:40 更新

性能優(yōu)化

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

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

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

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

禁用調(diào)試模式

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

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

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

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

使用緩存技術(shù)

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

開啟 Schema 緩存

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

要開啟 Schema 緩存,需要配置一個?cache?應(yīng)用組件來儲存 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',
        ],
    ],
];

合并和壓縮資源文件

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

優(yōu)化會話存儲

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

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ù)庫來存儲會話數(shù)據(jù)。默認(rèn)情況下,它會使用?db?應(yīng)用組件連接數(shù)據(jù)庫并將會話數(shù)據(jù)存儲在?session?表。 因此,你必須創(chuàng)建如下的?session?表,

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

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

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

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

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

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

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

使用普通數(shù)組

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

class PostController extends Controller
{
    public function actionIndex()
    {
        $posts = Post::find()->limit(100)->asArray()->all();

        return $this->render('index', ['posts' => $posts]);
    }
}

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

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

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

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

composer dumpautoload -o

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

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

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

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

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

性能分析

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

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號