Простое кэширование PHP с более чем 3 частями

#php #caching

#php #кэширование

Вопрос:

В простом кэшировании PHP (с ob_start и файлами) мне нужны части (больше или равные 3 на страницу), где нет кэширования (.PHP динамический контент или .Контекст файла PHP — на основе пользователя).

  ----------------- 
| CACHING CONTENT |
|                 |
 ----------------- 
|   NO CACHING    |
 ----------------- 
| CACHING CONTENT |
 ----------------- 
|   NO CACHING    |
 ----------------- 
|                 |
| CACHING CONTENT |
 ----------------- 
  

В части «без кэширования» я хочу включить динамический контент. Я могу кэшировать в трех cached.html файлы (вариант 1), но я предпочитаю иметь только один файл на кэшированную страницу (вместо 3 страниц, вариант 2). Какой наилучший вариант для кэширования?

  1. Кэширование в нескольких файлах (head_tag.html , body_part1.html , body_part2.html , body_part3.html …) и промежуточный динамический контент (files.php ).
  2. Кэширование в уникальный файл с некоторым тегом для замены динамическим содержимым (И… Как?)
  3. Другое

ПРИМЕЧАНИЕ: Пожалуйста, никаких сторонних системных решений (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 может использоваться для кэширования частей веб-сайта, которые не являются динамическими. Вы можете реализовать базу данных с измененным временем для динамического содержимого, чтобы она обновлялась при первом вызове страницы после обновления содержимого.