caching در فریمورک Yii
Caching یا ذخیره سازی، یک راه موثر برای بهبود عملکرد برنامه شما است. مکانیزم Caching، داده های static را در حافظه پنهان یا cache ذخیره می کند و زمانی که درخواست می شوند، آنها را از cache می گیرد. در سمت server ، شما می توانید از cache برای ذخیره داده های اولیه، مانند یک لیست از آخرین اخبار استفاده کنید. همچنین می توانید قسمتی از صفحه یا کل صفحات وب را ذخیره کنید. در سمت سرویس گیرنده یا client، شما می توانید از طریق HTTP caching ، صفحاتی را که اخیراً بازدید شده، در cache مرورگر نگهداری کنید.
آماده سازی DB
مرحله 1 - ایجاد یک پایگاه داده جدید: پایگاه داده را می توان به دو روش زیر ایجاد نمود:
- در ترمینال، دستور زیر را اجرا نمایید.
mysql -u root –p
- ایجاد یک پایگاه داده جدید از طریق دستورزیر:
CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci؛
مرحله 2 - connection پایگاه داده را در فایل config/db.php پیکربندی کنید. تنظیمات زیر برای سیستم مورد استفاده کنونی می باشد.
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
];
?>
مرحله 3 - داخل دایرکتوری ریشه، دستور زیر را اجرا کنید. این فرمان یک database migration را برای مدیریت DB ایجاد می کند. فایل migration باید در پوشه migrations در ریشه پروژه قرار بگیرد.
./yii migrate/create test_table
مرحله 4 - فایل migration را (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", "user1@gmail.com"],
["User2", "user2@gmail.com"],
["User3", "user3@gmail.com"],
["User4", "user4@gmail.com"],
["User5", "user5@gmail.com"],
["User6", "user6@gmail.com"],
["User7", "user7@gmail.com"],
["User8", "user8@gmail.com"],
["User9", "user9@gmail.com"],
["User10", "user10@gmail.com"],
["User11", "user11@gmail.com"],
]);
}
public function safeDown() {
$this->dropTable('user');
}
}
?>
migration بالا یک جدول به نام user با چنین فیلدهایی ایجاد می کند: id, name, email. همچنین تعدادی user نیز به جدول مان اضافه می نماید.
مرحله 5 - داخل ریشه پروژه دستور زیر را اجرا کنید. تا migraton به Database مان اعمال شود.
./yii migrate
مرحله 6 - حالا ما باید یک مدل برای جدول user مان ایجاد کنیم. برای سادگی کار، ما قصد داریم از ابزار تولید کد Gii استفاده کنیم.
این آدرس را باز کنید: url: http://localhost:8080/index.php?r=gii. سپس بر روی دکمه “Start” زیر هدر “Model generator” کلیک کنید. نام جدول را user و نام کلاسِ مدل را MyUser بگذارید، روی دکمه “Preview” کلیک کنید و در نهایت روی دکمه “Generate” کلیک نمایید.
مدل MyUser باید در دایرکتوری models ظاهر شود.
Data Caching
Data caching به ذخیره سازی متغیرهای PHP در cache و بازیابی آنها کمک می کند. Data caching به کامپوننت های cache وابسته است که معمولا به عنوان کامپوننت های برنامه ثبت می شوند. برای دسترسی به کامپوننت های برنامه، می توانید Yii::$app → cache را فراخوانی کنید. شما می توانید چندین کامپوننت cache را ثبت کنید.
Yii از مخازن ذخیره سازی زیر پشتیبانی می کند :
- yii \ caching \ DbCache - از یک جدول پایگاه داده برای ذخیره اطلاعات cache شده استفاده می کند. بدین منظور باید یک جدول با عنوان مشخص ، در yii\caching\DbCache::$cacheTable ایجاد کنید.
- yii\caching\ApcCache - از افزونه PHP APC استفاده می کند.
- yii \ caching \ FileCache - از فایل ها برای ذخیره اطلاعات cache شده استفاده می کند.
- yii \ caching \ DummyCache – برای زمانی که هیچ cache واقعی ای وجود ندارد یک cache placeholder ایجاد می کند. هدف از این component ساده کردن کدهایی است که نیاز دارند تا cache از لحاظ دسترس پذیری چک شود.
- yii \ caching \ MemCache – از افزونه PHP memcache استفاده می کند.
- yii \ caching \ WinCache – از افزونه PHP WinCache استفاده می کند.
- yii \ redis \ Cache - یک cache component برمبنای دیتابیس Redis پیاده سازی می کند.
- yii \ caching \ XCache – از افزونه PHP Xcache استفاده می کند.
تمام cache component ها از API های زیر پشتیبانی می کنند:
- get() - یک data value از cache را با یک کلید مشخص شده ، باز می گرداند. اگر data value منقضی شده یا نامعتبر یا پیدا نشده باشد مقدار False را برمی گرداند.
- add() - یک data value را به وسیله ی کلید در Cache شناسایی می کند و اگر آن کلید در Cache وجود نداشته باشد آن را ذخیره می کند.
- set() - یک data value را که توسط کلید در Cache شناسایی شده است را ذخیره می کند.
- multiGet() - این دستور data value های متعدد را از Cache با کلیدهای مشخص شده بازیابی می کند.
- multiAdd() - این دستور data value های متعدد را در Cache ذخیره می کند. هر آیتم با یک کلید شناسایی می شود. اگر کلید در Cache وجود داشته باشد، data value حذف خواهد شد.
- multiSet() - این دستور data value های متعدد را در Cache ذخیره می کند. هر آیتم با یک کلید شناسایی می شود.
- exists() – با برگرداندن یک مقدار خاصی نشان می دهد که کلید تعیین شده در cache وجود دارد یا ندارد.
- flush() - همه data value ها را از Cache حذف می کند.
- delete() - این دستور data value ی که توسط یک کلید در cache شناسایی می شود را حذف می کند.
یک data value که در cache ذخیره می شود برای همیشه باقی می ماند مگر اینکه حذف شود. برای تغییر این رفتار، می توانید هنگامی که متد set() برای ذخیره ی یک data value فراخوانی می شود، یک پارامتر انقضا تنظیم کنید.
data value های cache شده، می توانند با تغییرات cache dependency ها، نامعتبر شوند.
Dependency یا وابستگی ها
- yii \ caching \ DbDependency –اگر نتیجه یquery حاصل از یک دستور SQL تغییر کند، dependency تغییر می کند.
- yii \ caching \ ChainedDependency - اگر هر کدام از dependency های زنجیره تغییر کنند، dependency تغییر می کند.
- yii \ caching \ FileDependency - اگر زمانِ آخرین ویرایش فایل تغییر کند، dependency تغییر می کند.
- yii \ caching \ ExpressionDependency - اگر نتیجه ی یک عبارت مشخص شده ی PHP تغییر کند، dependency تغییر می کند.
حال، کامپوننت Cache را به برنامه خود اضافه کنید.
مرحله 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;
?>
مرحله 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);
}
مرحله 3 – در نوار آدرسبار مرورگر وب تان، آدرس http://localhost:8080/index.php?r=site/test-cache را تایپ کنید. آنچه که مشاهده می کنید مطابق با تصویر زیر می باشد.
مرحله 4 - اگر صفحه را بارگیری مجدد کنید(reload)، متوجه می شوید که تاریخ تغییری نکرده است. مقدار تاریخ cache شده است و cache ظرف 30 ثانیه منقضی می شود. صفحه بعد از 30 ثانیه بارگیری شود.
ذخیره کردن query (query caching)
Query caching به شما این امکان را می دهد تا نتیجه ی query های پایگاه داده را ذخیره کنید. Query caching به یک DB connection و یک کامپوننت cache نیاز دارد.
مرحله 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 = "cacheduseremail@gmail.com";
$user->save();
echo "==========";
var_dump(MyUser::find()->count());
}
در کد بالا، یک query از پایگاه داده را Cache می کنیم، یک user جدید اضافه می کنیم و تعداد کاربران را نمایش می دهیم.
مرحله 2 – در مرورگر وب تان به آدرسhttp://localhost:8080/index.php?r=site/query-caching بروید و صفحه را دوباره بارگذاری کنید.
هنگامی که صفحه را برای اولین بار باز می کنیم، query دیتابیس را cache می کنیم و تمام کاربران را شمارش می کنیم. وقتی صفحه را دوباره بارگذاری می کنیم، نتیجه ی query های cache شده ی پایگاه داده مشابه قبل است، زیرا query های پایگاه داده ذخیره شده اند.
شما می توانید cache را از console با استفاده از دستورات زیر حذف نمایید :
- yii cache – تمام کامپوننت های cache موجود رانشان می دهد.
- yii cache / flush cache1 cache2 cache3 – کامپوننت های کش cache1، cache2 و cache3 را حذف می کند.
- yii cache / flush-all - تمام کامپوننت های cache را حذف می کند.
مرحله 3 - وارد ریشه پروژه شوید و این فرمان را اجرا کنید:
./yii cache/flush-all
این فصل در یک نگاه:
…
سلام . پیشنهاد میکنم حتما دموی دوره رو مشاهده کنید درباره فریم ورک Yii: در پاسخ به سوالات : آیا این فریم ورک سریع است؟ آیا این یک فریم ورک امن است؟ آیا این یک فریم ورک حرفه ای است؟ آیا ا…این فصل در یک نگاه:
…
پیشنهاد میکنیم دمو دوره رو حتما مشاهده کنید با سلام خدمت دوستان عزیز . ابتدا عرض کنم که این دوره برای دوستانی آماده شده که میخوان وب اپلیکیشن های مدرنی رو طراحی بکنن و وارد بازار کار ط…