W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
有許多因素影響你的 Web 應用程序的性能。有些是環(huán)境,有些是你的代碼,而其他一些與 Yii 本身有關。 在本節(jié)中,我們將列舉這些因素并解釋如何通過調整這些因素來提高應用程序的性能。
一個好的 PHP 環(huán)境是非常重要的。為了得到最大的性能,
對于運行在生產環(huán)境中的應用程序,你應該禁用調試模式。 Yii 中使用名為?YII_DEBUG
?的常量來定義調試模式是否應被激活。 若啟用了調試模式,Yii 將需要額外的時間來產生和記錄調試信息。
你可以將下面的代碼行放在?入口腳本?的開頭來禁用調試模式:
defined('YII_DEBUG') or define('YII_DEBUG', false);
提示:?
YII_DEBUG
?的默認值是 false 。所以如果你確信你不在你應用程序代碼中別的地方更改其默認值, 你可以簡單地刪除上述行來禁用調試模式。
你可以使用各種緩存技術來提高應用程序的性能。例如,如果你的應用程序允許用戶以 Markdown 格式輸入文字, 你可以考慮緩存解析后的 Markdown 內容,避免每個請求都重復解析相同的 Markdown 文本。 請參閱?緩存?一節(jié),了解 Yii 提供的緩存支持。
Schema 緩存是一個特殊的緩存功能,每當你使用活動記錄時應該要開啟這個緩存功能。如你所知, 活動記錄能智能檢測數(shù)據庫對象的集合(例如列名、列類型、約束)而不需要手動地描述它們?;顒佑涗浭峭ㄟ^執(zhí)行額外的SQL查詢來獲得該信息。 通過啟用 Schema 緩存,檢索到的數(shù)據庫對象的集合將被保存在緩存中并在將來的請求中重用。
要開啟 Schema 緩存,需要配置一個?cache
?應用組件來儲存 Schema 信息, 并在?配置?中設置 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',
],
],
];
一個復雜的網頁往往包括許多 CSS 和 JavaScript 資源文件。為減少 HTTP 請求的數(shù)量和這些資源總下載的大小,應考慮將它們合并成一個單一的文件并壓縮。 這可大大提高頁面加載時間,且減少了服務器負載。想了解更多細節(jié),請參閱前端資源部分。
默認會話數(shù)據被存儲在文件中。這是好的對處于發(fā)展項目或小型項目。但是,當涉及要處理大量并發(fā)請求時,最好使用其他的會話存儲方式,比如數(shù)據庫。 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ù)據庫來存儲會話數(shù)據。默認情況下,它會使用?db
?應用組件連接數(shù)據庫并將會話數(shù)據存儲在?session
?表。 因此,你必須創(chuàng)建如下的?session
?表,
CREATE TABLE session (
id CHAR(40) NOT NULL PRIMARY KEY,
expire INTEGER,
data BLOB
)
你也可以通過使用緩存來存儲會話數(shù)據 yii\web\CacheSession 。理論上講,你可以使用只要支持數(shù)據緩存。 但是請注意,某些緩存的存儲當達到存儲限制會清除緩存數(shù)據。出于這個原因,你應主要在不存在存儲限制時才使用這些緩存存儲。 如果你的服務器支持Redis,強烈建議你通過使用 yii\redis\Session 來作為會話存儲。
執(zhí)行數(shù)據庫查詢并從數(shù)據庫中取出數(shù)據往往是一個 Web 應用程序主要的性能瓶頸。 盡管使用數(shù)據緩存技術可以緩解性能下降,但它并不完全解決這個問題。 當數(shù)據庫包含大量的數(shù)據且緩存數(shù)據是無效的,獲取最新的數(shù)據可能是最耗性能的假如在沒有適當?shù)卦O計數(shù)據庫和查詢條件。
一般來說,提高數(shù)據庫查詢的性能是創(chuàng)建索引。例如,如果你需要找一個用戶表的“用戶名”,你應該為“用戶名”創(chuàng)建一個索引。 注意,盡管索引可以使選擇查詢的速度快得多,但它會減慢插入、更新和刪除的查詢。
對于復雜的數(shù)據庫查詢,建議你創(chuàng)建數(shù)據庫視圖來保存查詢分析和準備的時間。
最后,在“SELECT”中使用“LIMIT”查詢。這可以避免從數(shù)據庫中取出大量數(shù)據。
盡管活動記錄對象使用起來非常方便,但當你需要從數(shù)據庫中檢索大量數(shù)據時它的效率不如使用普通的數(shù)組。 在這種情況下,你可以考慮在使用活動記錄查詢數(shù)據時調用?asArray()
?,使檢索到的數(shù)據被表示為數(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ù)組的方式來構建查詢和檢索數(shù)據。
因為 Composer 自動加載用于加載大多數(shù)第三方類文件,應考慮對其進行優(yōu)化,通過執(zhí)行以下命令:
composer dumpautoload -o
當一個請求涉及到一些資源密集操作,你應該想辦法在無需用戶等待他們完成脫機模式時來執(zhí)行這些操作。
有兩種方法可以離線數(shù)據處理:推和拉。
在拉中,只要有請求涉及到一些復雜的操作,你創(chuàng)建一個任務,并將其保存在永久存儲,例如數(shù)據庫。然后,使用一個單獨的進程(如 cron 作業(yè))拉任務,并進行處理。 這種方法很容易實現(xiàn),但它也有一些缺點。例如,該任務過程中需要定期地從任務存儲拉。如果拉頻率太低,這些任務可以延遲處理; 但是如果頻率過高,將引起的高開銷。
在推中,你可以使用消息隊列(如 RabbitMQ ,ActiveMQ , Amazon SQS 等)來管理任務。 每當一個新的任務放在隊列中,它會啟動或者通知任務處理過程去觸發(fā)任務處理。
你應該配置你的代碼來找出性能缺陷,并相應地采取適當措施。 以下分析工具可能是有用的:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: