Yii - Bộ nhớ đệm
Bộ nhớ đệm là một cách hiệu quả để cải thiện hiệu suất của ứng dụng của bạn. Cơ chế lưu vào bộ đệm lưu trữ dữ liệu tĩnh trong bộ đệm và lấy nó từ bộ đệm khi được yêu cầu. Ở phía máy chủ, bạn có thể sử dụng bộ nhớ đệm để lưu trữ dữ liệu cơ bản, chẳng hạn như danh sách các tin tức gần đây nhất. Bạn cũng có thể lưu trữ các phân đoạn trang hoặc toàn bộ trang web. Về phía máy khách, bạn có thể sử dụng bộ đệm HTTP để giữ các trang được truy cập gần đây nhất trong bộ nhớ cache của trình duyệt.
Chuẩn bị DB
Step 1- Tạo cơ sở dữ liệu mới. Cơ sở dữ liệu có thể được chuẩn bị theo hai cách sau.
Trong terminal chạy mysql -u root –p
.Tạo cơ sở dữ liệu mới thông qua CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci;
Step 2 - Định cấu hình kết nối cơ sở dữ liệu trong config/db.phptập tin. Cấu hình sau đây dành cho hệ thống được sử dụng hiện tại.
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
Step 3 - Bên trong thư mục gốc run ./yii migrate/create test_table. Lệnh này sẽ tạo sự di chuyển cơ sở dữ liệu để quản lý DB của chúng tôi. Tệp di chuyển sẽ xuất hiện trongmigrations thư mục gốc của dự án.
Step 4 - Sửa đổi tệp di chuyển (m160106_163154_test_table.php trong trường hợp này) theo cách này.
<?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');
}
}
?>
Việc di chuyển trên tạo ra một userbảng với các trường sau: id, tên và email. Nó cũng thêm một vài người dùng demo.
Step 5 - Bên trong gốc dự án run ./yii migrate để áp dụng di chuyển vào cơ sở dữ liệu.
Step 6 - Bây giờ, chúng ta cần tạo một mô hình cho userbàn. Để đơn giản, chúng tôi sẽ sử dụngGiicông cụ tạo mã. Mở cái này raurl: http://localhost:8080/index.php?r=gii. Sau đó, nhấp vào nút “Bắt đầu” trong tiêu đề “Trình tạo mô hình”. Điền vào Tên bảng (“người dùng”) và Lớp mẫu (“Người dùng của tôi”), nhấp vào nút “Xem trước” và cuối cùng, nhấp vào nút “Tạo”.
Mô hình MyUser sẽ xuất hiện trong thư mục mô hình.
Bộ nhớ đệm dữ liệu
Bộ nhớ đệm dữ liệu giúp bạn lưu trữ các biến PHP trong bộ nhớ đệm và truy xuất chúng sau này. Bộ nhớ đệm dữ liệu dựa vào các thành phần bộ nhớ đệm, thường được đăng ký làm thành phần ứng dụng. Để truy cập thành phần ứng dụng, bạn có thể gọiYii::$app → cache. Bạn có thể đăng ký một số thành phần ứng dụng bộ đệm.
Yii hỗ trợ các kho lưu trữ bộ nhớ cache sau:
yii \ caching \ DbCache - Sử dụng bảng cơ sở dữ liệu để lưu trữ dữ liệu được lưu trong bộ nhớ cache. Bạn phải tạo một bảng như được chỉ định trong yii \ caching \ DbCache :: $ cacheTable.
yii \ caching \ ApcCache - Sử dụng phần mở rộng APC của PHP.
yii \ caching \ FileCache - Sử dụng tệp để lưu trữ dữ liệu đã lưu trong bộ nhớ cache.
yii \ caching \ DummyCache - Đóng vai trò như một trình giữ chỗ trong bộ nhớ cache không có bộ nhớ đệm thực sự. Mục đích của thành phần này là đơn giản hóa đoạn mã cần kiểm tra tính khả dụng của bộ nhớ đệm.
yii \ caching \ MemCache - Sử dụng phần mở rộng memcache của PHP.
yii \ caching \ WinCache - Sử dụng phần mở rộng PHP WinCache.
yii \ redis \ Cache - Triển khai một thành phần bộ nhớ cache dựa trên cơ sở dữ liệu Redis.
yii \ caching \ XCache - Sử dụng phần mở rộng PHP XCache.
Tất cả các thành phần bộ nhớ cache đều hỗ trợ các API sau:
get () - Lấy một giá trị dữ liệu từ bộ nhớ cache với một khóa được chỉ định. Giá trị sai sẽ được trả về nếu giá trị dữ liệu hết hạn / không hợp lệ hoặc không được tìm thấy.
add () - Lưu trữ giá trị dữ liệu được xác định bởi một khóa trong bộ đệm nếu khóa không được tìm thấy trong bộ đệm.
set () - Lưu trữ một giá trị dữ liệu được xác định bởi một khóa trong bộ nhớ cache.
multiGet () - Lấy nhiều giá trị dữ liệu từ bộ nhớ cache bằng các khóa được chỉ định.
multiAdd () - Lưu trữ nhiều giá trị dữ liệu trong bộ nhớ cache. Mỗi mục được xác định bằng một khóa. Nếu một khóa đã tồn tại trong bộ nhớ cache, giá trị dữ liệu sẽ bị bỏ qua.
multiSet () - Lưu trữ nhiều giá trị dữ liệu trong bộ nhớ cache. Mỗi mục được xác định bằng một khóa.
tồn tại () - Trả về giá trị cho biết khóa được chỉ định có được tìm thấy trong bộ đệm hay không.
flush () - Xóa tất cả các giá trị dữ liệu khỏi bộ đệm.
delete () - Xóa giá trị dữ liệu được xác định bằng khóa khỏi bộ nhớ đệm.
Giá trị dữ liệu được lưu trữ trong bộ nhớ cache sẽ vẫn ở đó mãi mãi trừ khi nó bị xóa. Để thay đổi hành vi này, bạn có thể đặt tham số hết hạn khi gọi phương thức set () để lưu trữ giá trị dữ liệu.
Các giá trị dữ liệu được lưu trong bộ nhớ đệm cũng có thể bị vô hiệu bởi những thay đổi của cache dependencies -
yii \ caching \ DbDependency - Sự phụ thuộc được thay đổi nếu kết quả truy vấn của câu lệnh SQL được chỉ định bị thay đổi.
yii \ caching \ ChainedDependency - Phần phụ thuộc được thay đổi nếu bất kỳ phần phụ thuộc nào trên chuỗi bị thay đổi.
yii \ caching \ FileDependency - Phần phụ thuộc bị thay đổi nếu thời gian sửa đổi cuối cùng của tệp bị thay đổi.
yii \ caching \ ExpressionDependency - Sự phụ thuộc được thay đổi nếu kết quả của biểu thức PHP đã chỉ định bị thay đổi.
Bây giờ, hãy thêm cache thành phần ứng dụng cho ứng dụng của bạn.
Step 1 - Sửa đổi config/web.php tập tin.
<?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 - Thêm một chức năng mới được gọi là actionTestCache() vào 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 - Loại http://localhost:8080/index.php?r=site/test-cache trong thanh địa chỉ của trình duyệt web, bạn sẽ thấy như sau.
Step 4- Nếu bạn tải lại trang, bạn sẽ thấy ngày không thay đổi. Giá trị ngày được lưu vào bộ nhớ cache và bộ nhớ cache sẽ hết hạn trong vòng 30 giây. Tải lại trang sau 30 giây.
Truy vấn Cache
Bộ nhớ đệm truy vấn cung cấp cho bạn bộ đệm ẩn kết quả của các truy vấn cơ sở dữ liệu. Bộ nhớ đệm truy vấn yêu cầu kết nối DB và thành phần ứng dụng bộ đệm.
Step 1 - Thêm một phương thức mới được gọi là actionQueryCaching() vào 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());
}
Trong đoạn mã trên, chúng tôi lưu vào bộ nhớ cache truy vấn cơ sở dữ liệu, thêm người dùng mới và hiển thị số lượng người dùng.
Step 2 - Đi tới URL http://localhost:8080/index.php?r=site/query-caching và tải lại trang.
Khi chúng tôi mở trang lần đầu tiên, chúng tôi lưu vào bộ nhớ cache truy vấn DB và hiển thị tất cả số lượng người dùng. Khi chúng tôi tải lại trang, kết quả của truy vấn DB được lưu trong bộ nhớ cache sẽ giống như kết quả của nó vì truy vấn cơ sở dữ liệu được lưu trong bộ nhớ cache.
Bạn có thể xóa bộ nhớ cache khỏi bảng điều khiển bằng các lệnh sau:
yii cache - Hiển thị các thành phần bộ nhớ cache có sẵn.
yii cache/flush cache1 cache2 cache3 - Xóa các thành phần bộ nhớ cache cache1, cache2 và cache3.
yii cache/flush-all - Xóa tất cả các thành phần bộ nhớ cache.
Step 3 - Bên trong gốc dự án của ứng dụng của bạn chạy ./yii cache/flush-all.