Оглавление

32.4. Кэширование страниц

Как вы уже знаете, шаблон при первом запуске автоматически преобразуется в соответствующий PHP-код, который сохраняется в папке templates_c. Каждый последующий запуск скрипта, использующего шаблон, будет приводить к выполнению PHP-кода, а не новой компиляции шаблона. Шаблонизатор Smarty позволяет также кэшировать результаты обработки шаблона. Это позволяет значительно ускорить работу программы, особенно при работе с базой данных или выполнении значительного объема вычислений.

 

Для включения кэширования результатов обработки шаблона свойству caching необходимо присвоить значение true или i:

$smarty->caching = true;


 Если кэширование включено, то после первого запуска скрипта в папке C:\Apache2\smarty\sitel\cache будет создан файл, содержащий результаты обработки шаблона. Все последующие запуски скрипта, использующего шаблон, будут приводить к выводу данных из этого файла. Изменять файлы из папки cache вручную не следует.
По умолчанию данные кэшируются на 3600 секунд (1 час). Свойство cache_iifetime позволяет задать время жизни кэша. Значение указывается в секундах:

$smarty->cache_lifetime = 60; // 1 минута

 
После того как это время жизни истекает, кэш больше не считается актуальным и будет обновлен. Если свойство compiie_check имеет значение true, то все файлы, связанные с кэшем, проверяются на наличие изменений. При существовании изменений кэш больше не считается актуальным и будет обновлен. Чтобы отключить проверку, следует свойству compiie_check присвоить значение false:

// Не проверять связанные с кэшем файлы на наличие изменений
$smarty->compile_check = false;


Проверить наличие актуального кэша позволяет метод is_cached(). В качестве параметра указывается название шаблона. Если кэш актуален, то метод возвращает значение true. Это позволяет не выполнять какие-либо действия (например, запрос к базе данных), если кэш является актуальным:

if(!$smarty->is_cached('index.tpl')) {
   // Обрабатываем данные и передаем значения в шаблон
}
 


Если необходимо очистить кэш определенного шаблона, то следует воспользоваться методом ciear_cache (). Название шаблона указывается в первом параметре:

$smarty->clear_cache('index.tpl');


Очистить все файлы с кэшем позволяет метод ciear_aii_cache ():

$smarty->clear_all_cache();

 

В  качестве  примера  создадим  два  файла — index.php (листинг 84)  и index.tpl (листинг 85).

 

Листинг 84. Содержимое файла index.php

<?php
require_once('MySmarty.php'); // См. листинг 5.75
$smarty = new MySmarty();
// Включаем кэширование
$smarty->caching = true;
// Время жизни кэша
$smarty->cache_lifetime = 60; // 1 минута
// Проверяем наличие актуального кэша
if(!$smarty->is_cached('index.tpl')) {
   // Если кэш не является актуальным, то передаем значения
   $smarty->assign('d', date('H:i:s'));
}
// Выводим шаблон
$smarty->display('index.tpl');
function insert_dat() {
   // Функция будет вызываться при каждом запуске скрипта
   return date('H:i:s');
}
?>

 

Листинг 85. Содержимое файла index.tpl


Это время {$d} помещается в кэш<br>
Это время не будет помещено в кэш {insert name="dat"}

 

Попробуйте запустить в Web-браузере файл index.php, а затем несколько раз обновите страницу. Время, указанное в первой строке, останется неизменным в течение одной минуты. По истечении срока время в этой строке будет обновлено. Время, указанное во второй строке, всегда будет соответствовать текущему времени, так как внутри шаблона мы указали инструкцию {insert}. В этом случае при каждом запуске будет вызываться функция insert_dat() из файла index.php.

 

Очень часто недостаточно одной копии кэша. Например, при выводе большого количества записей из базы данных необходимо разбить вывод на несколько страниц. Шаблонизатор Smarty позволяет создавать несколько копий кэша для разных идентификаторов. Для этого идентификатор следует указать ВО втором параметре В методах display О, is_cached() И clear_cache(). В этом случае в папке cache будет создано несколько файлов с кэшем. Причем значение идентификатора становится частью названия файла. Поэтому следует тщательно проверять идентификатор на допустимость значения, если он получается от пользователя.

 
В качестве примера создадим два файла— index.php (листинг 86) и index.tpl (листинг 87).

 

Листинг 86. Содержимое файла index.php

<?php
require_once('MySmarty.php'); // См. листинг 5.75
$smarty = new MySmarty();
// Включаем кэширование страницы
$smarty->caching = true;
// Время жизни кэша
$smarty->cache_lifetime = 60; // 1 минута
if (isset($_GET['page'])) {
   $p = (int)$_GET['page'];
   if ($p < 1 || $p > 3) $p = 1;
}
else $p = 1;
// Проверяем наличие актуального кэша
if(!$smarty->is_cached('index.tpl', $p)) {
   // Если кэш не является актуальным, то присваиваем значения
   $smarty->assign('d', date('H:i:s'));
   $smarty->assign('p', $p);
}
// Выводим шаблон
$smarty->display('index.tpl', $p);
?>

 

Листинг 87. Содержимое файла index.tpl

Время {$d}. Страница номер {$p}<br>
<a href="?page=1">Первая страница</a><br>
<a href="?page=2">Вторая страница</a><br>
<a href="?page=3">Третья страница</a>

 

В этом примере мы использовали один шаблон, но так как указали идентификатор во втором параметре, то кэшированные данные для разных страниц будут разными. Попробуйте перейти по ссылкам. Время, указанное в первой строке, будет меняться только один раз в минуту и оно является разным для разных страниц.

 
Если необходимо вывести содержимое каталога, который имеет несколько категорий, то помимо номера страницы добавляется еще один параметр — идентификатор категории. В этом случае можно указать идентификатор категории и номер страницы через символ "|". В качестве примера создадим два файла — index.php (листинг 88) и index.tpl (листинг 89).

 

Листинг 88. Содержимое файла index.php

<?php
require_once('MySmarty.php'); // См. листинг 5.75
$smarty = new MySmarty();
// Включаем кэширование страницы
$smarty->caching = true;
// Время жизни кэша
$smarty->cache_lifetime = 60; // 1 минута
if (isset($_GET['id'])) {
   $id = (int)$_GET['id'];
   if ($id < 1 || $id > 2) $id = 1;
}
else $id = 1;
if (isset($_GET['page'])) {
   $p = (int)$_GET['page'];
   if ($p < 1 || $p > 2) $p = 1;
}
else $p = 1;
$cache_id = $id . '|' . $p; // Идентификатор кэша
// Проверяем наличие актуального кэша
if(!$smarty->is_cached('index.tpl', $cache_id)) {
   // Если кэш не является актуальным, то присваиваем значения
   $smarty->assign('d', date('H:i:s'));
   $smarty->assign('p', $p);
   $smarty->assign('i', $id);
}
// Выводим шаблон
$smarty->display('index.tpl', $cache_id);
?>

 

Листинг 89. Содержимое файла index.tpl

Время {$d}. Категория {$i}. Страница номер {$p}<br>
<a href="?id=1&amp;page=1">Первая страница в категории 1</a>
<a href="?id=1&amp;page=2">Вторая страница в категории 1</a><br>
<a href="?id=2&amp;page=1">Первая страница в категории 2</a>
<a href="?id=2&amp;page=2">Вторая страница в категории 2</a>

 

Если помимо номера страницы и идентификатора категории добавляется еще один  параметр,  то  все  параметры  также можно  указать  через  символ "|"  во втором параметре в методах display(), is_cached() и clear_cache().

 
В  этом разделе мы рассмотрели лишь базовые  возможности шаблонизатора Smarty, которых вполне достаточно для использования его на практике. Чтобы получить описание дополнительных возможностей, следует обратиться к  документации,  русская  версия  которой  расположена  по  адресу  http://www.smarty.net/manual/ru/.

 

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити