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