Сбой кода простого кеширования для страниц PHP - как сделать недействительным кеш при отправке формы

<?php
// cache - will work online - not locally
// location and prefix for cache files
define('CACHE_PATH', "siteCache/"); 

// how long to keep the cache files (hours)
define('CACHE_TIME', 12); 
// return location and name for cache file 
function cache_file() 
{ 
    return CACHE_PATH . md5($_SERVER['REQUEST_URI']); 
}

// display cached file if present and not expired 
function cache_display() 
{ 
    $file = cache_file(); 
    // check that cache file exists and is not too old 
    if(!file_exists($file)) return; 
    if(filemtime($file) < time() - CACHE_TIME * 3600) return; 
    // if so, display cache file and stop processing
    readfile($file);
    exit; 
} 

// write to cache file 
function cache_page($content) 
{ 
    if(false !== ($f = @fopen(cache_file(), 'w'))) { 
        fwrite($f, $content);
        fclose($f); 
    } 
    return $content; 
} 

// execution stops here if valid cache file found
cache_display(); 

// enable output buffering and create cache file 
ob_start('cache_page');
?>

Это код кеша, который я использую на динамическом веб-сайте в файле db. И каждая страница содержит этот код вверху.

<?php session_start();
include("db.php"); ?>

Страницы кэшируются и работают, но при отправке формы, при входе пользователя в систему, при прохождении переменной через страницы ничего не происходит. Отображаются старые страницы. Как мне использовать этот код кеширования, чтобы он мог работать, но при этом оставался работоспособным сайт.

Интересно, как это делают плагины wordpress. Wp Super Cache и W3T Cache кешируют все, но блог остается работоспособным. Должен ли я выборочно использовать его в некоторых частях сайта.

Нравится:

<?php
// TOP of your script
$cachefile = 'cache/'.basename($_SERVER['SCRIPT_URI']);
$cachetime = 120 * 60; // 2 hours

// Serve from the cache if it is younger than $cachetime
if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) {
    include($cachefile);
    echo "<!-- Cached ".date('jS F Y H:i', filemtime($cachefile))." -->";
    exit;
}

ob_start(); // start the output buffer
// Your normal PHP script and HTML content here
// BOTTOM of your script
$fp = fopen($cachefile, 'w'); // open the cache file for writing
fwrite($fp, ob_get_contents()); // save the contents of output buffer to the file
fclose($fp); // close the file
ob_end_flush(); // Send the output to the browser
?>

Но это тоже не сработает, потому что речь идет о pageURL (кеширование всей страницы), а не о выборочном контенте со страницы.

Пожалуйста, порекомендуйте. Есть ли какой-нибудь простой сценарий для этого. Pear :: Cache_Lite кажется хорошим, но его сложно реализовать.

Обновление: я использовал Cache_Lite. Это то же самое. Кеширует все или включенный файл php. Есть несколько вариантов конфигурации, с которыми можно поиграть. Но при использовании в целом он также будет игнорировать обновления данных получения, публикации, сеанса ... и будет отображать предыдущие кешированные страницы, если они не будут удалены.


person Hiroshi Rana    schedule 26.01.2013    source источник


Ответы (1)


Я думаю, вы могли бы отделить отображение от логики.

Я имею в виду, измените атрибут действия формы и укажите его на php, который не имеет логики кеширования (и вы должны проверить референт или другой параметр, используя токены или сеансы или что-то еще, чтобы избежать проблем с безопасностью, таких как CSRF).

Еще я хочу отметить, что вы должны стараться кешировать только наиболее посещаемые страницы (то есть домашнюю страницу), как правило, у вас нет универсального подхода к кэшированию, и о страницах лучше не беспокоиться. у которых нет проблем со скоростью / нагрузкой. Или может быть лучше кэшировать данные, если проблемы со скоростью возникают из-за запроса к базе данных (вы должны профилировать свое приложение перед реализацией кеширования).

Другой подход, связанный с миграцией, - это проверка метода запроса и отключение кеша, если он является публикацией (при условии, что все ваши формы используют метод POST) с использованием $_SERVER['REQUEST_METHOD'] == 'POST'.

person Diego    schedule 26.01.2013
comment
У каждой страницы есть сеанс вверху. На главной странице есть форма входа. Теперь домашняя страница кешируется. Я вхожу в систему, возвращаюсь на домашнюю страницу, и поскольку домашняя страница уже кэширована со старым пустым разделом формы входа, он показывает пустой раздел входа в систему - в противном случае, если вы вошли в систему, она должна иметь приветственное сообщение для вошедшего в систему пользователя. Единственное, что приходит мне в голову, это всегда очищать папку кеша сразу после отправки любой формы, а затем перенаправлять обратно. - person Hiroshi Rana; 28.01.2013
comment
В этом случае вы должны аннулировать (т.е. удалить) кешированный файл после успешного входа в систему. Проблема в том, что у вас будут пользователи, которые будут видеть домашние страницы других пользователей. У вас может быть один файл кэша домашней страницы для каждого пользователя, но я считаю его грязным и несколько бесполезным. Я по-прежнему думаю, что вы выиграете от кеширования базы данных вместо кеширования html, и это будет легче реализовать. Кэширование HTML удобно, если у вас много относительно статичных страниц или если у вас есть какая-то тяжелая система шаблонов, которая потребляет ресурсы. - person Diego; 28.01.2013
comment
Опять же, я рекомендую вам профилировать приложение и посмотреть, что нужно время для загрузки. Ничего особенного, просто измерьте время с помощью microtime () для запросов к базе данных, выполнения php и т. Д. Вы можете даже найти лучший способ справиться с проблемами скорости / загрузки (можно переписать запрос или добавить индекс в таблицу) перед начиная с кеширования HTML. - person Diego; 28.01.2013