Как реализовать сжатие CSS на лету в PHP-скрипте перед отдачей пользователю для экономии трафика?
Сжатие CSS на лету в PHP позволяет существенно уменьшить объём передаваемых данных и ускорить загрузку страниц. Существует два основных подхода: минификация CSS (удаление лишних символов) и gzip-компрессия (сжатие на уровне HTTP).
## 1. Минификация CSS средствами PHP
Минификация — это удаление комментариев, лишних пробелов, переносов строк и других незначимых символов из CSS-файла.
php
function minifyCSS(string $css): string {
// Удаляем комментарии
$css = preg_replace(‘!/*[^*]**+([^/][^*]**+)*/!’, », $css);
// Удаляем пробелы вокруг спецсимволов
$css = preg_replace(‘/s*([{}|:;,])s+/’, ‘$1’, $css);
// Удаляем лишние пробелы
$css = preg_replace(‘/s+/’, ‘ ‘, $css);
// Удаляем пробелы в начале и конце
return trim($css);
}
## 2. Gzip-компрессия через PHP
Gzip сжимает уже минифицированный CSS на уровне протокола HTTP. Браузер автоматически распакует его.
php
header(‘Content-Type: text/css; charset=UTF-8’);
header(‘Vary: Accept-Encoding’);
$css = file_get_contents(‘styles.css’);
$css = minifyCSS($css);
// Проверяем поддержку gzip браузером
if (isset($_SERVER[‘HTTP_ACCEPT_ENCODING’]) &&
strpos($_SERVER[‘HTTP_ACCEPT_ENCODING’], ‘gzip’) !== false) {
header(‘Content-Encoding: gzip’);
echo gzencode($css, 9);
} else {
echo $css;
}
## 3. Кэширование на стороне сервера
Чтобы не пересжимать CSS при каждом запросе, используйте файловый кэш:
php
$cacheFile = sys_get_temp_dir() . ‘/css_cache_’ . md5($cssPath) . ‘.gz’;
$cssModTime = filemtime($cssPath);
if (!file_exists($cacheFile) || filemtime($cacheFile) < $cssModTime) {
$css = minifyCSS(file_get_contents($cssPath));
file_put_contents($cacheFile, gzencode($css, 9));
}
header('Content-Type: text/css');
header('Content-Encoding: gzip');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $cssModTime) . ' GMT');
header('Cache-Control: public, max-age=86400');
readfile($cacheFile);
## 4. HTTP-заголовки для браузерного кэширования
Добавьте заголовки `ETag` и `Cache-Control`, чтобы браузер не запрашивал CSS повторно без необходимости:
php
$etag = md5_file($cssPath);
header('ETag: "' . $etag . '"');
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&
trim($_SERVER['HTTP_IF_NONE_MATCH']) === '"' . $etag . '"') {
header('HTTP/1.1 304 Not Modified');
exit;
}
## 5. Готовые библиотеки
Для продакшн-решений рекомендуется использовать проверенные библиотеки:
— **matthiasmullie/minify** — минификация CSS и JS через Composer
— **tubalmartin/cssmin** — PHP-порт YUI Compressor
Установка через Composer: `composer require matthiasmullie/minify`
## Итог
Комбинация минификации + gzip + кэширование даёт экономию трафика до 70–90% по сравнению с исходным CSS. Всегда проверяйте корректность отдаваемых заголовков через DevTools браузера и инструменты типа GTmetrix или PageSpeed Insights.
