Mr.KTO blog


  • Рубрики

  • Поиск

  •  
      
  • Поиск
  • реклама на mrkto.com





Кэшировние в 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>

Примечания:

  1. Мы используем функцию is_file, а не file_exists, т.к. вторая проверяет существование как файла, так и директории.
  2. В переменной $t мы сохранили сколько секунд назад истёк кэш.
  3. $CACHE_TIME = 15*60; – время истечения кэша в секундах (15 минут).
  4. $dataModel – перменная или объект класса, содержащий сессионные данные.
  5. Вместо 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;
}
habrahabr.ru google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru rumarkz.ru memori.ru moemesto.ru moikrug.ru myscoop.ru mister-wong.ru rucity.com vaau.ru

Комментарии (3) на “Кэшировние в 2 строчки”

  1. Eduard пишет:

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

  2. Алекс пишет:

    Да код интересный

  3. Irisha пишет:
    userpic

    хорошая идейка, чья идея?

Оставить комментарий