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

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

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

0

Решение

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

Обычно конфигурация 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;
}
...
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector