Yii - การแคช
การแคชเป็นวิธีที่มีประสิทธิภาพในการปรับปรุงประสิทธิภาพของแอปพลิเคชันของคุณ กลไกการแคชจะจัดเก็บข้อมูลแบบคงที่ในแคชและรับจากแคชเมื่อได้รับการร้องขอ ในฝั่งเซิร์ฟเวอร์คุณอาจใช้แคชเพื่อจัดเก็บข้อมูลพื้นฐานเช่นรายการข่าวล่าสุด คุณยังสามารถจัดเก็บส่วนย่อยของหน้าหรือทั้งหน้าเว็บ ในฝั่งไคลเอ็นต์คุณสามารถใช้การแคช HTTP เพื่อเก็บหน้าที่เยี่ยมชมล่าสุดไว้ในแคชของเบราว์เซอร์
การเตรียม DB
Step 1- สร้างฐานข้อมูลใหม่ สามารถจัดเตรียมฐานข้อมูลได้สองวิธีดังต่อไปนี้
ในเทอร์มินัลให้รันmysql -u root –p
.สร้างฐานข้อมูลใหม่ผ่านCREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - กำหนดค่าการเชื่อมต่อฐานข้อมูลในไฟล์ config/db.phpไฟล์. การกำหนดค่าต่อไปนี้ใช้สำหรับระบบที่ใช้ในปัจจุบัน
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - ภายในโฟลเดอร์รูท run ./yii migrate/create test_table. คำสั่งนี้จะสร้างการย้ายฐานข้อมูลสำหรับจัดการฐานข้อมูลของเรา ไฟล์การย้ายข้อมูลควรปรากฏในไฟล์migrations โฟลเดอร์ของโปรเจ็กต์รูท
Step 4 - แก้ไขไฟล์การย้ายข้อมูล (m160106_163154_test_table.php ในกรณีนี้) ด้วยวิธีนี้
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160106_163154_test_table extends Migration {
public function safeUp()\ {
$this->createTable("user", [ "id" => Schema::TYPE_PK, "name" => Schema::TYPE_STRING, "email" => Schema::TYPE_STRING, ]); $this->batchInsert("user", ["name", "email"], [
["User1", "[email protected]"],
["User2", "[email protected]"],
["User3", "[email protected]"],
["User4", "[email protected]"],
["User5", "[email protected]"],
["User6", "[email protected]"],
["User7", "[email protected]"],
["User8", "[email protected]"],
["User9", "[email protected]"],
["User10", "[email protected]"],
["User11", "[email protected]"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
การย้ายข้อมูลข้างต้นสร้างไฟล์ userตารางที่มีฟิลด์เหล่านี้: id, ชื่อและอีเมล นอกจากนี้ยังเพิ่มผู้ใช้สาธิตเล็กน้อย
Step 5 - ภายในรูทโครงการ run ./yii migrate เพื่อใช้การย้ายข้อมูลกับฐานข้อมูล
Step 6 - ตอนนี้เราต้องสร้างแบบจำลองสำหรับไฟล์ userตาราง. เพื่อความเรียบง่ายเราจะใช้ไฟล์Giiเครื่องมือสร้างรหัส เปิดสิ่งนี้url: http://localhost:8080/index.php?r=gii. จากนั้นคลิกปุ่ม "เริ่ม" ใต้ส่วนหัว "ตัวสร้างโมเดล" กรอกชื่อตาราง (“ ผู้ใช้”) และคลาสรุ่น (“ MyUser”) คลิกปุ่ม“ ดูตัวอย่าง” และสุดท้ายคลิกปุ่ม“ สร้าง”
โมเดล MyUser ควรปรากฏในไดเร็กทอรีโมเดล
แคชข้อมูล
การแคชข้อมูลช่วยคุณในการจัดเก็บตัวแปร PHP ในแคชและเรียกคืนในภายหลัง การแคชข้อมูลอาศัยส่วนประกอบของแคชซึ่งโดยปกติจะลงทะเบียนเป็นส่วนประกอบของแอปพลิเคชัน ในการเข้าถึงส่วนประกอบของแอปพลิเคชันคุณสามารถโทรYii::$app → cache. คุณสามารถลงทะเบียนส่วนประกอบแอปพลิเคชันแคชได้หลายรายการ
Yii รองรับการจัดเก็บแคชต่อไปนี้ -
yii \ caching \ DbCache - ใช้ตารางฐานข้อมูลเพื่อจัดเก็บข้อมูลแคช คุณต้องสร้างตารางตามที่ระบุใน yii \ caching \ DbCache :: $ cacheTable
yii \ caching \ ApcCache - ใช้นามสกุล PHP APC
yii \ caching \ FileCache - ใช้ไฟล์เพื่อจัดเก็บข้อมูลแคช
yii \ caching \ DummyCache - ทำหน้าที่เป็นตัวยึดแคชซึ่งไม่มีการแคชจริง จุดประสงค์ของส่วนประกอบนี้คือเพื่อลดความซับซ้อนของโค้ดที่ต้องการตรวจสอบความพร้อมใช้งานของแคช
yii \ caching \ MemCache - ใช้นามสกุล PHP memcache
yii \ caching \ WinCache - ใช้นามสกุล PHP WinCache
yii \ redis \ Cache - ใช้ส่วนประกอบแคชตามฐานข้อมูล Redis
yii \ caching \ XCache - ใช้นามสกุล PHP XCache
ส่วนประกอบแคชทั้งหมดรองรับ API ต่อไปนี้ -
get () - ดึงค่าข้อมูลจากแคชด้วยคีย์ที่ระบุ ค่าเท็จจะถูกส่งกลับหากค่าข้อมูลหมดอายุ / ไม่ถูกต้องหรือไม่พบ
add () - เก็บค่าข้อมูลที่ระบุโดยคีย์ในแคชหากไม่พบคีย์ในแคช
set () - เก็บค่าข้อมูลที่ระบุโดยคีย์ในแคช
multiGet () - ดึงข้อมูลหลายค่าจากแคชด้วยคีย์ที่ระบุ
multiAdd () - เก็บค่าข้อมูลหลายค่าในแคช แต่ละรายการจะถูกระบุโดยคีย์ หากมีคีย์อยู่แล้วในแคชค่าข้อมูลจะถูกข้ามไป
multiSet () - เก็บค่าข้อมูลหลายค่าในแคช แต่ละรายการจะถูกระบุโดยคีย์
มีอยู่ () - ส่งคืนค่าที่ระบุว่าพบคีย์ที่ระบุในแคชหรือไม่
flush () - ลบค่าข้อมูลทั้งหมดออกจากแคช
ลบ () - ลบค่าข้อมูลที่คีย์ระบุออกจากแคช
ค่าข้อมูลที่จัดเก็บในแคชจะยังคงอยู่ที่นั่นตลอดไปเว้นแต่จะถูกลบออก หากต้องการเปลี่ยนลักษณะการทำงานนี้คุณสามารถตั้งค่าพารามิเตอร์การหมดอายุเมื่อเรียกใช้เมธอด set () เพื่อเก็บค่าข้อมูล
ค่าข้อมูลที่แคชไว้อาจไม่ถูกต้องโดยการเปลี่ยนแปลงของ cache dependencies -
yii \ caching \ DbDependency - การอ้างอิงจะเปลี่ยนไปหากผลการสืบค้นของคำสั่ง SQL ที่ระบุมีการเปลี่ยนแปลง
yii \ caching \ ChainedDependency - การพึ่งพาจะเปลี่ยนไปหากการอ้างอิงใด ๆ บนห่วงโซ่มีการเปลี่ยนแปลง
yii \ caching \ FileDependency - การอ้างอิงจะเปลี่ยนไปหากเวลาแก้ไขล่าสุดของไฟล์มีการเปลี่ยนแปลง
yii \ caching \ ExpressionDependency - การอ้างอิงจะเปลี่ยนไปหากผลลัพธ์ของนิพจน์ PHP ที่ระบุมีการเปลี่ยนแปลง
ตอนนี้เพิ่มไฟล์ cache ส่วนประกอบแอปพลิเคชันกับแอปพลิเคชันของคุณ
Step 1 - แก้ไขไฟล์ config/web.php ไฟล์.
<?php
$params = require(__DIR__ . '/params.php');
$config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - this //is required by cookie validation 'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], 'db' => require(__DIR__ . '/db.php'), ], 'modules' => [ 'hello' => [ 'class' => 'app\modules\hello\Hello', ], ], 'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
Step 2 - เพิ่มฟังก์ชันใหม่ที่เรียกว่า actionTestCache() ไปยัง SiteController
public function actionTestCache() {
$cache = Yii::$app->cache; // try retrieving $data from cache
$data = $cache->get("my_cached_data");
if ($data === false) { // $data is not found in cache, calculate it from scratch
$data = date("d.m.Y H:i:s"); // store $data in cache so that it can be retrieved next time
$cache->set("my_cached_data", $data, 30);
}
// $data is available here var_dump($data);
}
Step 3 - ประเภท http://localhost:8080/index.php?r=site/test-cache ในแถบที่อยู่ของเว็บเบราว์เซอร์คุณจะเห็นสิ่งต่อไปนี้
Step 4- หากคุณโหลดหน้านี้ซ้ำคุณควรสังเกตว่าวันที่ไม่มีการเปลี่ยนแปลง ค่าวันที่จะถูกแคชและแคชจะหมดอายุภายใน 30 วินาที โหลดหน้านี้ซ้ำหลังจาก 30 วินาที
การแคชแบบสอบถาม
การแคชแบบสอบถามช่วยให้คุณสามารถแคชผลลัพธ์ของการสืบค้นฐานข้อมูล การแคชการสืบค้นจำเป็นต้องมีการเชื่อมต่อฐานข้อมูลและส่วนประกอบแอปพลิเคชันแคช
Step 1 - เพิ่มวิธีการใหม่ที่เรียกว่า actionQueryCaching() ไปยัง SiteController
public function actionQueryCaching() {
$duration = 10; $result = MyUser::getDb()->cache(function ($db) { return MyUser::find()->count(); }, $duration);
var_dump($result); $user = new MyUser();
$user->name = "cached user name"; $user->email = "[email protected]";
$user->save();
echo "==========";
var_dump(MyUser::find()->count());
}
ในโค้ดด้านบนเราแคชแบบสอบถามฐานข้อมูลเพิ่มผู้ใช้ใหม่และแสดงจำนวนผู้ใช้
Step 2 - ไปที่ URL http://localhost:8080/index.php?r=site/query-caching และโหลดหน้านี้ซ้ำ
เมื่อเราเปิดหน้าสำหรับหน้าแรกเราจะแคชแบบสอบถาม DB และแสดงจำนวนผู้ใช้ทั้งหมด เมื่อเราโหลดเพจใหม่ผลลัพธ์ของคิวรี DB ที่แคชจะเหมือนเดิมเนื่องจากคิวรีฐานข้อมูลถูกแคช
คุณสามารถล้างแคชจากคอนโซลโดยใช้คำสั่งต่อไปนี้ -
yii cache - แสดงส่วนประกอบแคชที่มีอยู่
yii cache/flush cache1 cache2 cache3 - ล้างส่วนประกอบแคช cache1, cache2 และ cache3
yii cache/flush-all - ล้างส่วนประกอบแคชทั้งหมด
Step 3 - ภายในรูทโปรเจ็กต์ของแอปพลิเคชันของคุณทำงาน ./yii cache/flush-all.