Простое кэширование PHP с более чем 3 частями - PullRequest
2 голосов
/ 17 октября 2011

В простом кешировании 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.

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

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

<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;

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

0 голосов
/ 17 октября 2011

Есть два способа сделать это с прямым 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) && (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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...