Как мне кэшировать веб-страницу на PHP? - PullRequest
12 голосов
/ 10 октября 2009

как мне кэшировать веб-страницу в php, чтобы, если страница не обновлялась, зрители получали кэшированную копию?

Спасибо за вашу помощь. PS: я новичок в php.

Ответы [ 6 ]

14 голосов
/ 10 октября 2009

Вы можете сохранить выходные данные страницы перед завершением сценария, а затем загрузить кэш в начале сценария.

пример кода:

<?php

$cachefile = 'cache/'.basename($_SERVER['PHP_SELF']).'.cache'; // e.g. cache/index.php.cache
$cachetime = 3600; // time to cache in seconds

if(file_exists($cachefile) && time()-$cachetime <= filemtime($cachefile)){
  $c = @file_get_contents($cf);
  echo $c;
  exit;
}else{
  unlink($cachefile);
}

ob_start();

// all the coding goes here

$c = ob_get_contents();
file_put_contents($cachefile);

?>

Если у вас много страниц, нуждающихся в этом кешировании, вы можете сделать это:

in cachestart.php:

<?php
$cachefile = 'cache/'.basename($_SERVER['PHP_SELF']).'.cache'; // e.g. cache/index.php.cache
$cachetime = 3600; // time to cache in seconds

if(file_exists($cachefile) && time()-$cachetime <= filemtime($cachefile)){
  $c = @file_get_contents($cf);
  echo $c;
  exit;
}else{
  unlink($cachefile);
}

ob_start();
?>

in cacheend.php:

<?php

$c = ob_get_contents();
file_put_contents($cachefile);

?>

Тогда просто добавьте

include('cachestart.php');

в начале ваших скриптов. и добавьте

include('cacheend.php');

в конце ваших сценариев. Не забудьте иметь папку с именем cache и разрешить PHP доступ к ней.

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

4 голосов
/ 10 октября 2009

В дополнение к ответу mauris, я хотел бы отметить следующее:

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

Это может быть довольно легко или очень сложно, в зависимости от типа динамических данных.

Обновление

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

Я не могу дать вам более подробную информацию об этом, не зная, какую реализацию вы используете для кэширования.

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

3 голосов
/ 28 января 2014
$c = ob_get_contents();
file_put_contents($cachefile);

правильно

$c = ob_get_contents();
file_put_contents($cachefile,$c);

в противном случае скрипт не будет работать.

0 голосов
/ 10 октября 2009

PEAR имеет пакет кэширования (фактически два):

http://pear.php.net/package/Cache и
http://pear.php.net/package/Cache_Lite для небольших приложений

Однажды я использовал пакет Cache (первый) для кэширования запросов, и тогда он, насколько я помню, работал.

0 голосов
/ 10 октября 2009

Используйте Squid или обновите заголовки HTTP правильно, чтобы выполнить кэширование в браузере. Я не вижу необходимости раскручивать вашу собственную версию кеширования на основе вопроса.

0 голосов
/ 10 октября 2009

Использовать memcached . На этом сайте есть объяснение, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...