Сверхпростой статический файл (html) кэш php сайта

У меня есть веб-сайт, который в основном показывает только вещи без каких-либо форм и сообщений. Этот сайт основан на PHP и размещен на общем хостинге. Он редко меняется. Я хотел бы включить кеширование для этого веб-сайта. Его общий хостинг, поэтому мне нужно решение, которое:

  • не использует Memcached
  • не нужно переводить мой сайт на VPS
  • не используйте APC или другие вещи

Таким образом, в основном то, что я хотел бы сделать, – это кешировать каждый подсайт HTML и говорить PHP, чтобы получить в течение 5 минут HTML-кешированную версию текущего дочернего сайта и отобразить его пользователю. И через 5 минут обновить кеш.

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

Но мне нужна только одна хорошая библиотека, которая чрезвычайно проста в использовании.

Я полагаю, что это работает так:

<? if (current_site_cache_is_valid()) { display_cached_version(); die; } ..mywebsite rendering code ?> 

Так просто, как это звучит, но я надеюсь, что какой-то хороший разработчик сделал такую ​​библиотеку раньше. Знаете ли вы, что такие готовые к использованию, не слишком трудоемкие для решения?

Вот как я обычно это делаю, однако я не знаю вашего дизайна URL-адреса и вашего макета каталога / файла.

Я делаю это с помощью .htaccess и mod_rewrite Docs .

Веб-сервер проверяет наличие кэшированного HTML-файла, и, если да, он поставляется. Вы также можете проверить его возраст.

Если он слишком стар или если он не существует, запускается ваш PHP-скрипт (s?). В начале вашего скрипта вы запускаете выходные буферные документы . В конце вашего скрипта вы получаете выходной буфер, и вы помещаете содержимое в файл кеша, а затем вы выводите его.

Преимущество этого решения заключается в том, что apache будет предоставлять статические файлы в том случае, если они существуют, и нет необходимости вызывать процесс PHP. Если вы все это сделаете в самом PHP, у вас не будет такой выгоды.

Я бы даже сделал еще один шаг и запустил cron-задание, которое удаляет старые файлы кеша, а не выполняет проверку времени внутри .htaccess . Это сделано, вы можете сделать переписывание менее сложным, чтобы предпочесть файл .php.cached вместо файла .php .

У меня есть простой алгоритм для кэширования HTML, основанный на следующих условиях:

  • Пользователь является гостем (у зарегистрированных пользователей есть набор cookie blog_user)
  • URI запроса – это GET, который не содержит параметров запроса
  • Существует версия файла кэша HTML

затем выполняется переписывание правила .htaccess , сопоставление запроса с кэшированным файлом. Все остальное предполагается контекстно-зависимым и, следовательно, не кэшируемым. Обратите внимание, что я использую отображение URI в стиле википедии для моего блога, так что /article-23 сопоставляется с /index.php=article-23 когда не кэшируется.

Я использую один файл доступа HTML в каталоге DOCUMENT_ROOT, и вот соответствующий экстракт. Это третье правило перезаписи, которое делает то, что вы хотите. Любой скрипт, который генерирует кэшируемые O / P, обертывает это в пару ob_get_clean() ob_start() ob_get_clean() и выписывает файл кэша HTML (хотя все это обрабатывается моим механизмом шаблонов). Обновления также при необходимости очищают каталог кэша HTML.

 RewriteEngine on RewriteBase / # ... # Handle blog index RewriteRule ^blog/$ blog/index [skip=1] # If the URI maps to a file that exists then stop. This will kill endless loops RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^blog/.* - [last] # If the request is HTML cacheable (a GET to a specific list, with no query params) # the user is not logged on and the HTML cache file exists then use it instead of executing PHP RewriteCond %{HTTP_COOKIE} !blog_user RewriteCond %{REQUEST_METHOD}%{QUERY_STRING} =GET [nocase] RewriteCond %{DOCUMENT_ROOT}/blog/html_cache/$1.html -f RewriteRule ^blog/(article-\d+|index|sitemap.xml|search-\w+|rss-[0-9a-z]*)$ \ blog/html_cache/$1.html [last] # Anything else relating to the blog pass to index.php RewriteRule blog/(.*) blog/index.php?page=$1 [qsappend,last] 

Надеюсь это поможет. Мой блог описывает это более подробно. 🙂

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

Вы можете делать статическое кэширование на PHP без использования .htaccess или других обманщиков. Я нашел это на http://simonwillison.net/2003/may/5/cachingwithphp/ :

 <?php $cachefile = 'cache/index-cached.html'; $cachetime = 5 * 60; // Serve from the cache if it is younger than $cachetime if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) { include($cachefile); echo "<!-- Cached copy, generated ".date('H:i', filemtime($cachefile))." -->\n"; exit; } ob_start(); // Start the output buffer /* The code to dynamically generate the page goes here */ // Cache the output to a file $fp = fopen($cachefile, 'w'); fwrite($fp, ob_get_contents()); fclose($fp); ob_end_flush(); // Send the output to the browser ?> 

Просто добавьте немного больше ответа nico, чтобы сделать его более полезным для использования общей копии и вставки, сохраняя время ввода отдельных имен кеш-файла для каждого сохраненного файла.

Оригинал:

 $cachefile = 'cache/index-cached.html'; 

Изменен:

 $cachefile = $_SERVER['DOCUMENT_ROOT'].'/cache/'.pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_FILENAME).'-cached.html'; 

Это делается для того, чтобы взять имя файла любого файла, в котором он находится, минус расширение (.php в моем случае) и добавляет метку «-cached.html» и новое расширение в кешированный файл. Вероятно, есть более эффективные способы сделать это, но он работает для меня и, надеюсь, сэкономит время и силы.

Попросите skycache попробовать. edit: этот проект тоже кажется крутым: cacheme

Другое решение – использовать auto_prepend_file / auto_append_file . Что-то вроде того, что описано в этом уроке: выходное кэширование для новичков