Эта тема на forum.dklab.ru


Rin: id страницы для ее кеширования
Для кеширования страниц классами типа PEAR::Cache_Lite используется идентификатор страницы (обзовем его как page_id).
Каждый разработчик вычисляет page_id по своему.
На сколько применим к жизни нижеследующий код? А если сказать правильнее, то не сам код, а подход к генерации page_id.

Вычисление page_id на основе связки $_GET + $_COOKIE выбрано для того, чтобы кешировать страницы в сессии (если она есть),
т.к. содержимое страницы вполне может зависеть от session_id.

Прошу поругать/похвалить.



/**
* Возвращает уникальный идентификатор страницы на основе $_GET + $_COOKIE
* Если есть данные в $_POST или $_FILES, возвращает false
*
* @return mixed (false/string)
*/
function getPageHash()
{
if ( (@is_array($_POST) && count($_POST) > 0) ||
(@is_array($_FILES) && count($_FILES) > 0) )
{
return false;
}
$a = (isset($_COOKIE) ? $_COOKIE : array()) +
(isset($_GET) ? $_GET : array());
include_once BASE_DIR . 'func/ksort_recursive.php';
$a = ksort_recursive($a); #теперь порядок следования параметров не имеет значения!
#return base_convert(sprintf('%u', crc32(serialize($a))), 10, 36); #DEPRECATED
return base_convert(md5(serialize($a)), 16, 36);
}

Дмитрий Котеров:
Все зависит от Вашей задачи. Если у Вас вид страницы зависит только от полного URL страницы (с параметрами), то можете использовать его для ID кэша. Если же не только - тогда надо еще добавлять величины. Обычно страница зависит минимум от timestamp-ов файлов, из которых брались данные при ее генерации.
chin:
от timestamp-ов файлов
а чем md5 файлов хуже? Я например, когда писал свой шаблонизатор, сделал чтобы он кэшировал отработанный шаблон по md5 хешу его файла. Как только md5 файла изменяется, соответственно, шаблон перерабатывается.
Дмитрий Котеров:
Можно и так. Только посчитать md5 от timestamp-а обычно проще и быстрее, а эффект такой же.
chin:
Дмитрий Котеров
Ваша правда.
Rin:
Обычно страница зависит минимум от timestamp-ов файлов, из которых брались данные при ее генерации.

Вы имеете в виду под timestamp'ом дату модификации файлов (mtime)?
А если у меня при генерации страницы участвуют достаточно много файлов, то каждый раз проверять их mtime?
get_included_files() в конце головного скрипта выдал 22 штуки файлов.
Не накладно ли это с точки зрения использования ресурсов?
Rin:
Все зависит от Вашей задачи. Если у Вас вид страницы зависит только от полного URL страницы (с параметрами), то можете использовать его для ID кэша. Если же не только - тогда надо еще добавлять величины.

Да, именно так я и сделал.
В моем случае еще использовалаясь сессия для авторизации пользователей.
Теперь кеширование прекрасно работает как для анонимных, так и для авторизованых пользоватетей.


/**
* Возвращает уникальный идентификатор страницы на основе $_REQUEST + $_SESSION
* Если есть данные в $_POST или $_FILES, возвращает false
*
* @param array $ignore_keys ключи в $_REQUEST, которые следует проигнорировать
* @return mixed (false/string)
*/
function getPageHash($ignore_keys = false)
{
if ( (@is_array($_POST) && count($_POST) > 0) ||
(@is_array($_FILES) && count($_FILES) > 0) )
{
return false;
}

$a = $_REQUEST; #~ $_GET + $_COOKIE
if (is_array($ignore_keys)) #~ array('gen_time', 'content_length', session_name())
{
foreach ($ignore_keys as $key)
{
if (isset($a[$key]))
{
unset($a[$key]);
}
}#foreach
}
if (isset($_SESSION['auth']['userinfo']))
{
$a['__auth_userinfo'] = $_SESSION['auth']['userinfo'];
}
include_once BASE_DIR . 'func/ksort_recursive.php';
$a = ksort_recursive($a); #теперь порядок следования параметров не имеет значения!
return base_convert(md5(serialize($a)), 16, 36);
}

Дмитрий Котеров:

get_included_files() в конце головного скрипта выдал 22 штуки файлов.
Не накладно ли это с точки зрения использования ресурсов?

Проверка времени модификации - это примерно одна сотая часть от времени загрузки этих же самых файлов. Что уж тут говорить о ресурсах...

include_once BASE_DIR . 'func/ksort_recursive.php';
Небольшое замечание: зачем так делать? Я бы порекомендовал просто прописать BASE_DIR . 'func' в include_path, и потом везде просто писать
include_once 'ksort_recursive.php';
Это гораздо логичнее.

Эта тема на forum.dklab.ru