همانطور که قبلا اشاره کرده بودیم Cache در اسمارتی نکته بسیار مهمی محسوب شده بگونه ای که پس از یکبار فراخوانی تمپلیت در موارد بعدی نیازی به فراخوانی مجدد و متقابلا خواندن از دتابیس و Feed های مختلف نیست در واقع این عملکرد خارق العاده اسمارتی میباشد که موجب افزایش سرعت آن میشود
بطوریکه میبیندی در بخش خصوصیات بدین صورت ذکر شده It is extremely fast یعنی بشدت سریع که نشان دهنده این امر میباشد
1. شروع Caching در اسمارتی
بطور کلی استفاده از قابلیت Cacheدر اسمارتی باعث ، ایجاد تغیرات در صدا زدن display() وfetch() میشود که این دو تابع بیشتر کاربرد را در اسمارتی دارند که تابع اول برای نمایش فایل تمپلیت و تابع دوم برای خواند دیتابیس مورد استفاده قرار میگیرد.زمانی که خروجی توابع display() یا fetch() کش میشود ، فایل Cache شده در دایرکتوری $cache_dir ایجاد میشود ، این فایل میتواند یک فایل تمپلیت ، Config و ... را در بر بگیرد.
2. تنظیمات Caching
اولین کار فعال کردن قابلیت Caching در اسمارتی است ، اینکار با مقداردهی متغیر $caching انجام میشود.
<?php
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
$smarty->display('index.tpl');
?>
در حالت معمولی تابع display(‘index.tpl’) هنگام صدا زدن ، فایل تمپلیت را رندر میکند و نتیجه را بصورت خروجی نمایش میدهد ، اما زمانی که شما Caching را فعال میکنید ، این تابع به هنگام رندر کردن فایل تمپیلیت ، یک کپی از انرا بصورت کپی Cache شده ، ذخیره میکند ، زمانی که دوباره تابع display(‘index.tpl’) صدا زده شود ، فایل Cache شده ، بصورت خروجی نمایش داده میشود و نیاز دوباره به رندر فایل تمپلیت نخواهد بود ، و این یعنی افزایش سرعت و کاهش بار بر روی سرور !
نکته : فایل های موجود در دایرکتوری $cache_dir نام های شبیه فایلهای تمپلیت اصلی دارند، اما با این تفاوت که دارای پسوند .php هستند ، اما این فایل های اسکریپتهای قابل اجرا (executable php scripts) نیستند ، دقت کنید که این فایل ها را ویرایش نکنید.
تمام صفحاتی که Cache میشوند ، دارای طول عمر مشخصی خواهند بود ، این زمان توسط متغیر $cache_lifetime مشخص میشوند ، مقدار پیشفرض این تابع ، 3600 ثانیه ، برابر 1 ساعت ، هست ، و پس از گذشت این زمان ، فایل های Cache غیر قابل استفاده میشوند و دراولین بار صدا زدن تابع display() با فایل های جدید رندر شده جایگزین میشوند.
امکان این که شما به هر صفحه طول عمر مشخصی بدهید نیز وجود دارد ، اینکار با با نسبت دادن مقدار 2 به متغیر $caching انجام میشود
<?php
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = 2; // lifetime is per cache
// set the cache_lifetime for index.tpl to 5 minutes
$smarty->cache_lifetime = 300;
$smarty->display('index.tpl');
// set the cache_lifetime for home.tpl to 1 hour
$smarty->cache_lifetime = 3600;
$smarty->display('home.tpl');
// NOTE: the following $cache_lifetime setting will not work when $caching = 2.
// The cache lifetime for home.tpl has already been set
// to 1 hour, and will no longer respect the value of $cache_lifetime.
// The home.tpl cache will still expire after 1 hour.
$smarty->cache_lifetime = 30; // 30 seconds
$smarty->display('home.tpl');
?>
اگر $compile_chek فعال باشد ، در هر بار اجرا شدن صفحات ، ابتدا اخرین زمان ایجاد Cache File چک شده و اگر از آن زمان به بعد تغییر دیگری در فایل تمپیلیت بوجود امده باشد ، فایل های Cache شده ی قبلی با فایل های جدید جایگزین میشود ، اینکار overhead کمی را ایجاد میکند که این مقدار ، بسیار ناچیز است و مشکلی ایجاد نمیکنید اما گر نیاز به بالاترین performance دارید باید ، برای دستیابی به بهترین performance مقدار $compile_chek را بصورت false تنظیم کنید.
متغیر $force_complie زمانی تنظیم میگردد که شما در حال ، تست و رفع خطا ( debugging ) باشید ، در این صورت ، در هر بار اجرا شدن صفحات ، فایل Cache جدید ایجاد میشود ، زیرا دراین زمان شما در پی رفع اشکلات و خطا هستید و با تغیر سورس برنامه ، تغیرات را نمیتوانید مشاهده کنید زیرا ، فایل های Cache شده ی قبلی نمایش داده میشوند ، راه دیگر این است که متغیر $caching را با مقدار false تنظیم کنید.
از تابع is_cheked() میتوانید برای فهمیدن اینکه ، تمپلیت مورد نظر در حال حاضر دارای فایل Cache معتبر هست یا خیر استفاده کنید ، و در صورتی که فایل Cache مورد نیاز موجود بود ، از ادامه عملیات رندر تمپیلیت و به دنبال دریافت اطلاعات و پردازش آنها ، جلوگیری کنید.
<?php
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
if(!$smarty->is_cached('index.tpl')) {
// No cache available, do variable assignments here.
$contents = get_database_contents();
$smarty->assign($contents);
}
$smarty->display('index.tpl');
?>
شما میتوانید قسمت هایی از صفحه خود را ، بصورت کاملا Daynamic نگه داشته و بقیه قسمت هارا Cache کنید ، اینکار با استفاده از تابع insert در Smarty Engine قابل انجام است ، برای مثال ، فرض کنید که در سمت راست صفحه خود یک بنر دارید که در هر بار اجرا شدن صفحه ، بنر متفاوتی را نمایش میدهد ( مثل همین بنر بالای همین صفحه مجید آنلاین ) ،در صورتی که تمام قسمتهای این صفحه Cache شود ، در هر بار اجرا شدن صفحه تنها همان بنری که در زمان Cache شدن موجود بوده ، نمایش داده میشود ، و نتایج متفاوت ظاهر نخواهد شد ، با استفاده از تابع insert شما میتوانید قسمتهای متخلفی از صفحه را از Cache شدن ، محفوظ نگه دارید و آنها را بصورت کاملا Daynamic نمایش دهید.
در صورتی که $compile_chek بصورت False تنظیم شده باشد ، پس چگونه میتوان ، در زمان تغیرات در فایل ها ، Cache جدید را جایگزین Cache های قبلی کرد ؟
فرض کنید که صفحه اصلی وبلاگ خود را Cache کردید ( یا بصورت Full Cache ، یا بصورت چند قسمتی . . . ) ، حال زمانی که شما یک مطلب جدید را وارد بانک اطلاعاتی میکنید ، با استفاده از توابع clear_all_cache() تمام فایل های Cache موجود را پاک کرده و یا با تابع clear_cache() تنها فایل های Cache قبلی را پاک کرده و تغیرات را جایگزین کند .
<?php
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
// clear out all cache files
$smarty->clear_all_cache();
// clear only cache for index.tpl
$smarty->clear_cache('index.tpl');
$smarty->display('index.tpl');
?>