Кэшировние в 2 строчки
Ну, в 3. Или 4...
if (is_file("scriptname.session") && ($t = time() - filemtime("scriptname.session")) < $CACHE_TIME) {
$dataModel = unserialize(file_get_contents("scriptname.session"));
} else {
/* делаем что-то, и сохраняем данные в объекте $dataModel */
$f = fopen("scriptname.session", "w") and fwrite($f, serialize($dataModel)) and fclose($f);
}
Неплохо было бы добавить auto chmod – автоматическую установку прав доступа к файлу:
if (is_file("scriptname.session") && (is_readable("scriptname.session") || chmod("scriptname.session", 0777)) &&...
При этом не забывать про безопасность – закрытие доступа к файлам *.session:
Это может быть папка с Deny from all в .htaccess.
Или .htaccess в текущей папке с
<Files *.session>
Order allow,deny
Deny from all
</Files>
Примечания:
- Мы используем функцию
is_file, а неfile_exists, т.к. вторая проверяет существование как файла, так и директории. - В переменной
$tмы сохранили сколько секунд назад истёк кэш. $CACHE_TIME = 15*60;– время истечения кэша в секундах (15 минут).$dataModel– перменная или объект класса, содержащий сессионные данные.- Вместо
file_put_contents(PHP 5 only) мы записываем сериализованные данные в файл в одной строчке черезand(чтобы следующая ф-ция выполнялась только если предыдущая вернула не-false). Мы не используем&&, ибо приоритет операций.
Форматирование кэш-даты:
Моя функция, правда на англ. и $cache_time – это filemtime() в нашем случае.
/**
* Formats cache date as 'on date()' or as 'x days y hours ago'
* If date is older than $max_days - return 'on date($date_format, $time)'
*/
function format_cache_date($cache_time, $max_days = 30, $date_format = "m/d/Y")
{
if (time()-$cache_time > $max_days*24*3600) { // > $max_days days
$res = "on ".date($date_format, $cache_time);
} else {
$cache_hours = round((time()-$cache_time)/3600, 0);
$cache_days = floor($cache_hours/24);
$cache_hours = $cache_hours % 24;
$res = (($cache_days > 0)? $cache_days.(($cache_days==1)?" day":" days"): "");
$res .= (($cache_hours > 0 || ($cache_hours==0 && $cache_days==0))?
(!empty($res)?", ":"").$cache_hours.(($cache_hours==1)?" hour":" hours") : "") ." ago";
}
return $res;
}

октября 10, 2008 в 16:40
Попробую использовать этот код на одном из сайтов. Выглядит интересно.