#php #caching
#php #кэширование
Вопрос:
В простом кэшировании PHP (с ob_start и файлами) мне нужны части (больше или равные 3 на страницу), где нет кэширования (.PHP динамический контент или .Контекст файла PHP — на основе пользователя).
-----------------
| CACHING CONTENT |
| |
-----------------
| NO CACHING |
-----------------
| CACHING CONTENT |
-----------------
| NO CACHING |
-----------------
| |
| CACHING CONTENT |
-----------------
В части «без кэширования» я хочу включить динамический контент. Я могу кэшировать в трех cached.html файлы (вариант 1), но я предпочитаю иметь только один файл на кэшированную страницу (вместо 3 страниц, вариант 2). Какой наилучший вариант для кэширования?
- Кэширование в нескольких файлах (head_tag.html , body_part1.html , body_part2.html , body_part3.html …) и промежуточный динамический контент (files.php ).
- Кэширование в уникальный файл с некоторым тегом для замены динамическим содержимым (И… Как?)
- Другое
ПРИМЕЧАНИЕ: Пожалуйста, никаких сторонних системных решений (memcached, APC …). Мне это нужно из опции на основе PHP.
Ответ №1:
Вы можете использовать заполнители для некэширующих частей страницы и кэшировать всю страницу. Например, вся кэшированная страница может выглядеть так:
<html>
... (static content)
#DYNAMIC-CONTENT-NAME#
... (static content)
#SECOND-DYNAMIC-CONTENT-PLACEHOLDER#
... (static content)
</html>
Тогда в PHP вы просто получите эту кэшированную страницу и замените все заполнители динамическим содержимым.
// obtain the cached page from storage
$cached_page = get_cached_page();
// generate the HTML for the dynamic content
$dynamic_content = get_dynamic_content();
// replace the placeholders with the actual dynamic content
$page = str_replace('#DYNAMIC-CONTENT-NAME#', $dynamic_content, $cached_page);
// display the resulting page
echo $page;
Таким образом, вы можете разместить столько именованных заполнителей, сколько захотите, для любого количества фрагментов динамического контента, сколько захотите, а затем просто замените их фактическим контентом.
Комментарии:
1. Да! Это была моя идея. Есть ли для этого руководство по наилучшей практике?
2. @Manz, ну, это довольно просто, я не уверен, что вы подразумеваете под руководством по лучшей практике… У вас есть HTML-страница (вам даже не нужно создавать ее .php, если у вас есть только статическое содержимое) с заполнителями. Вы кэшируете эту страницу, затем, когда вам нужно ее отобразить, вы извлекаете ее из кэша и заменяете заполнители на простые
str_replace()
…
Ответ №2:
Есть два способа сделать это с помощью простого php
Приближение заголовка
$cachetime = 60 * 60 * 24 * 7; // 1 Week
header(‘Expires: ‘.gmdate(‘D, d M Y H:i:s’, time() $expires).’GMT’);
Или путем кэширования полного файла (с включениями / содержимым из динамического содержимого) в вашей файловой системе (может использоваться для кэширования частей сайта)
<?php
$cachefile = "cache/".$reqfilename.".html"; #change $reqfilename to $_SERVER['PHP_SELF'] if you are using in headers, footers, menus files
$cachetime = 60 * 60 * 24 * 7; // 1 Week
// Serve from the cache if it is younger than $cachetime
if (file_exists($cachefile) amp;amp; (time() - $cachetime < filemtime($cachefile))) {
include($cachefile);
exit;
}
ob_start(); // start the output buffer
?>
.. Your usual PHP script and HTML here ...
<?php
// open the cache file for writing
$fp = fopen($cachefile, 'w');
// save the contents of output buffer to the file
fwrite($fp, ob_get_contents());
// close the file
fclose($fp);
// Send the output to the browser
ob_end_flush();
?>
Что вы также можете сделать, так это кэшировать файлы на компьютере пользователя, используя заголовок или обновляя свой htaccess информацией о кэшировании. Реализация htaccess может отличаться в зависимости от ваших модулей, установленных на сервере хостинга. Я использую:
# Add Expiration
ExpiresActive On
ExpiresDefault "access plus 1 week"
ExpiresByType text/html "access plus 1 day"
ExpiresByType text/php "access plus 1 day"
ExpiresByType image/gif "access plus 1 week"
ExpiresByType image/jpeg "access plus 1 week"
ExpiresByType image/png "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType image/x-icon "access plus 1 week"
ExpiresByType image/ico "access plus 1 week"
ExpiresByType text/xml "access plus 1 day"
Комментарии:
1. Я хочу кэширование из 3 частей с промежуточным содержимым PHP. Я думаю, что лучший вариант: кэширование в уникальный файл… но как? Хороший ответ, но, возможно, я не объясняю себя в своем вопросе. Попробуйте отредактировать вопрос для уточнения.
2. Кэширование php может использоваться для кэширования частей веб-сайта, которые не являются динамическими. Вы можете реализовать базу данных с измененным временем для динамического содержимого, чтобы она обновлялась при первом вызове страницы после обновления содержимого.