1.延遲加載
只有在類被使用的時候才會被加載
實現方式:
spl_autoload_register()
可以看到YII的項目的入口文件加載了這個文件。
// 引入 vendor 中的 autoload.php 文件,會基于 composer 的機制自動加載類
require(__DIR__ . '/../vendor/autoload.php');
2.類的映射表機制
創建類的映射表加快類的加載
Yii::$classMap = [
'app/test/Test' => '/var/www/basic/webtest/Test.php'
];
3.組件的延遲加載
組件只有在使用的時候才會被加載
4.緩存機制
1. 數據緩存
緩存的基本方法:
//獲取緩存實例
$cache = Yii::$app->cache;
//獲取緩存值
$data = $cache->get('cache_data_key');
//設置緩存
$cache->set('cache_data_key', $cacheData, 60*60);
//刪除單個緩存
$cache->delete('testcache');
//清空緩存
$cache->flush();
緩存依賴:
- yii\caching\DbDependency:如果指定 SQL 語句的查詢結果發生了變化,則依賴改變。
- yii\caching\ExpressionDependency:如果指定的 PHP 表達式執行結果發生變化,則依賴改變。
- yii\caching\FileDependency:如果文件的最后修改時間發生變化,則依賴改變。
緩存示例:
// 創建一個對 example.txt 文件修改時間的緩存依賴
$dependency = new \yii\caching\FileDependency(['fileName' => 'example.txt']);
// 緩存數據將在30秒后超時
// 如果 example.txt 被修改,它也可能被更早地置為失效狀態。
$cache->set($key, $data, 30, $dependency);
// 緩存會檢查數據是否已超時。
// 它還會檢查關聯的依賴是否已變化。
// 符合任何一個條件時都會返回 false。
$data = $cache->get($key);
2. 片段緩存
片段緩存指的是緩存頁面內容中的某個片段。例如,一個頁面顯示了逐年銷售額的摘要表格, 可以把表格緩存下來,以消除每次請求都要重新生成表格 的耗時。片段緩存是基于數據緩存實現的。
//設置緩存依賴
$dependency = [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT MAX(updated_at) FROM post',
];
//使用緩存依賴和緩存開關
if ($this->beginCache($id, ['dependency' => $dependency, 'enabled' => Yii::$app->request->isGet])) {
//動態內容,每次動用都會改變,不會被緩存影響
echo $this->renderDynamic('return Yii::$app->user->identity->name;');
$this->endCache();
}
關于緩存嵌套:外層的失效時間應該短于內層,外層的依賴條件應該低于內層,以確保最小的片段,返回的是最新的數據。
3. 頁面緩存
頁面緩存指的是在服務器端緩存整個頁面的內容。隨后當同一個頁面 被請求時,內容將從緩存中取出,而不是重新生成。
public function behaviors(){
return [
[
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 60,
'variations' => [
\Yii::$app->language,
],
'dependency' => [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT COUNT(*) FROM post',
],
],
];
}
頁面緩存和片段緩存極其相似。它們都支持 duration,dependencies, variations 和 enabled 配置選項。它們的主要區別是頁面緩存是由過濾器實現, 而片段緩存則是一個小部件。
4. HTTP緩存
- yii\filters\HttpCache::lastModified //返回最后修改的時間戳是否有變化
- yii\filters\HttpCache::etagSeed //返回的字符串是否有變化
如果沒有變化系統會返回304的狀態碼,提示瀏覽器使用緩存中的數據。
etagSeed>lastModified 如果兩者同時使用的話,只有當etagSeed改變的時候,系統才會認為數據有變化
public function behaviors(){
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
return $q->from('post')->max('updated_at');
},
'etagSeed' => function ($action, $params) {
$post = $this->findModel(\Yii::$app->request->get('id'));
return serialize([$post->title, $post->content]);
},
],
];
}