Сжатие и сокращение кэшированной страницы PHP - PullRequest
0 голосов
/ 11 января 2019

Я использую следующую технику кэширования страниц, как описано здесь и показано ниже:

<?php
$cachefile = 'cached-files/'.date('M-d-Y').'.php';
$cachetime = 18000;

// Check if the cached file is still fresh. If it is, serve it up and exit.
if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) 
{
    include($cachefile);
    exit;
}

// no file OR the file to too old, render the page and capture the HTML.
ob_start( 'ob_gzhandler' );
?>

<html>
    <!-- CONTENT GOES HERE -->
</html>

<?php
// Save the cached content to a file
$fp = fopen($cachefile, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);

// finally send browser output
ob_end_flush();
?>

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

Я добавил ob_gzhandler на;

ob_start( 'ob_gzhandler' );

И иметь файл htaccess, содержащий следующее:

<IfModule mod_deflate.c>
  # Compress HTML, CSS, JavaScript, Text, XML and fonts
  AddOutputFilterByType DEFLATE application/javascript
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  AddOutputFilterByType DEFLATE application/x-font
  AddOutputFilterByType DEFLATE application/x-font-opentype
  AddOutputFilterByType DEFLATE application/x-font-otf
  AddOutputFilterByType DEFLATE application/x-font-truetype
  AddOutputFilterByType DEFLATE application/x-font-ttf
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE font/opentype
  AddOutputFilterByType DEFLATE font/otf
  AddOutputFilterByType DEFLATE font/ttf
  AddOutputFilterByType DEFLATE image/svg+xml
  AddOutputFilterByType DEFLATE image/x-icon
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/xml

  # Remove browser bugs (only needed for really old browsers)
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  Header append Vary User-Agent
</IfModule>

<IfModule mod_expires.c>
  ExpiresActive on

# Your document html
  ExpiresByType text/html "access plus 0 seconds"

# Media: images, video, audio
  ExpiresByType audio/ogg "access plus 1 month"
  ExpiresByType image/gif "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType video/mp4 "access plus 1 month"
  ExpiresByType video/ogg "access plus 1 month"
  ExpiresByType video/webm "access plus 1 month"

# CSS and JavaScript
  ExpiresByType application/javascript "access plus 1 week"
  ExpiresByType text/css "access plus 1 week”

# Fonts
  AddType application/vnd.ms-fontobject .eot
  AddType application/x-font-ttf .ttf
  AddType application/x-font-opentype .otf
  AddType application/x-font-woff .woff
  AddType image/svg+xml .svg

  AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-opentype image/svg+xml

  ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
  ExpiresByType application/x-font-ttf "access plus 1 year"
  ExpiresByType application/x-font-opentype "access plus 1 year"
  ExpiresByType application/x-font-woff "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
</IfModule>

Тем не менее, когда я использую любые онлайн-инструменты для проверки сжатия gzip, они все возвращаются. Нет. Я что-то пропустил?

Есть ли способ минимизировать кэшированный HTML, содержащийся в ob_get_contents?

1 Ответ

0 голосов
/ 11 января 2019

Есть много проблем с тем, что вы делаете здесь.

Обычно конфигурация Apache, которую вы показали нам здесь, должна обрабатывать сжатие, но это зависит от порядка, в котором сложены обработчики. Учитывая сложность, связанную с созданием контента для текущего запроса, выходного буфера и воспроизведением сохраненного файла, ваша жизнь будет намного проще, если ваш PHP-код просто игнорирует сжатие, и это обрабатывается веб-сервером. Итак, начните пытаться анализировать одну проблему за раз: посмотрите, что отвечает веб-сервер, когда вы запрашиваете простой HTML, сгенерированный PHP. Если он не сжат, вернитесь и посмотрите на свой веб-сервер (проверяли, действительно ли mod_delfate загружен успешно?).

Сжатие и сокращение кэшированной страницы PHP

Сжатие работает за счет уменьшения избыточности. Минификация работает за счет сокращения избыточности. Сжатие уменьшит размер примерно на 80%. Если ваш HTML не содержит много избыточных тегов (то есть "<tag></tag>") И ваш минификатор не достаточно умен, чтобы идентифицировать и удалять их (ни один из которых я не видел) ИЛИ огромное количество пробелов, минификация уменьшит размер только на до 5%. Эффекты не аддитивны.

Вы добавляете много кода (обработка, программирование) и усложняете к своему коду, используя оба, и в результате не увидите никакой большой выгоды.

Есть ли способ минимизировать кэшированный HTML

Это было бы глупо.

Вы не можете предполагать, что клиенты будут принимать сжатый контент и какие методы сжатия они будут поддерживать. Возможно, вы знаете, что весь ваш трафик направляется в веб-браузеры, которые поддерживают (скажем) gzip - но вы не знаете, сколько из них используют поврежденное мозгом программное обеспечение AV или какой-либо другой прокси-сервер для передачи данных. Поэтому, если вы сохраняете сжатое кэшированное представление, вам нужно заново реализовать логику обнаружения возможностей клиента и разрешить декомпрессию в вашем коде.

То, что схема именования содержит только один файл страницы / кэша, скорее говорит о том, что у вас нет огромного количества данных для хранения в вашем серверном кэше, а дисковое пространство дешевое. Храните данные кэша без сжатия.

ExpiresByType text / html "доступ плюс 0 секунд"

Это в лучшем случае избыточно.

$ cachefile = 'cached-files /'. Date ('M-d-Y'). '. Php';

У вас могут возникнуть серьезные проблемы с безопасностью, если вы не очень осторожны в предотвращении XSS - уязвимость XSS можно использовать в качестве эксплойта для внедрения кода на вашем сервере.

включают ($ cachefile);

Если вы знаете, что файл должен содержать только HTML, тогда почему вы просите PHP проанализировать / скомпилировать / выполнить его? В дополнение к проблеме безопасности это создает накладные расходы на обработку и заставит кэш кода операции продолжать заполняться и сбрасываться.

Существует также риск того, что кто-то испортит ваш кеш, потянув за вилку по запросу до того, как файл кеша будет записан.

Рассмотрим:

 <?php
 ignore_user_abort(1);
 ...
 if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) 
 {
     while (ob_get_level()) ob_end_flsuh();
     readfile($cachefile);
     exit;
 }
 ...
...