Moin!
Angeregt durch das Lob habe ich eine Version 2 herausgebracht, die jetzt auch den Status 304 (not modified) beherrscht und also bei übereinstimmenden ETag nicht mal versucht, die Daten zu senden.
Die Adresse bleibt die alte:
Es bleibt auch (mit Kommentaren und jetzt besser aufgeräumten, menschenlesbaren Code) beim schlanken "UHU" ("unter-100-Zeiler"):
<?php
/**
css_packer.php Version 2.0.2
Autor: Jörg Reinholz, www.fastix.org
Lizenz: GPL 2.0 http://www.gnu.org/licenses/old-licenses/gpl-2.0.de.html
**/
/* Konfiguration: */
# Wie lange soll der Cache gültig sein?
define ('CACHE_DAYS', 7); #Tage
/* Programm: */
if ( empty($_GET['pack']) ) {
error_log('Fehler: Keine Datei übergeben. (?pack=)');
echo "Fehler: Keine Datei übergeben.\n\n";
include('css_packer.readme');
exit;
}
/* Sicherheits-Voodoo: */
$_GET['pack'] = './' . $_GET['pack'];
define ('MINIMAL_CSS' , $_GET['pack'] . '.min');
define ('MINIMAL_CSS_ZIPPED' , $_GET['pack'] . '.min.gz');
define ('ETAG' , $_GET['pack'] . '.etag');
if ( substr($_GET['pack'],-4) != '.css' ) {
error_log('Hinweis: Netter Versuch: (?pack=' . $_GET['pack'] . ')');
echo "Netter Versuch!\n\n";
include('css_packer.readme');
exit;
}
if ( strpos($_GET['pack'], '..') ) {
error_log('Hinweis: Netter Versuch. (?pack=' . $_GET['pack'] . ')');
echo "Netter Versuch!\n\n";
include('css_packer.readme');
exit;
}
if (
! is_file(MINIMAL_CSS)
or ! is_file(MINIMAL_CSS_ZIPPED)
or ! is_file(ETAG)
or ! empty($_GET['renew'])
) {
if ( ! is_file ($_GET['pack']) || ! is_readable ($_GET['pack']) ) {
error_log ('Fehler: Die CSS-Datei ' . $_GET['pack'] . ' gibt es nicht oder ist nicht lesbar.');
echo 'Fehler: Die CSS-Datei gibt es nicht oder ist nicht lesbar.';
exit;
}
if ( ! is_writable (__DIR__) ) {
error_log('In das Verzeichnis ' . __DIR__ . ' kann nicht geschrieben werden.');
echo 'Fehler: In das Verzeichnis kann nicht geschrieben werden.';
exit;
}
@unlink(MINIMAL_CSS);
@unlink(MINIMAL_CSS_ZIPPED);
@unlink(ETAG);
$data = file_get_contents($_GET['pack'], NULL, NULL);
$data = str_replace(array("\n", "\r", "\t"),' ',$data);
$data = preg_replace('/ {2,}/', ' ', $data);
$data = str_replace(
array( ', ', ' ,', '; ', ' ;', '{ ', ' {', '} ', ' }', ': ', ' :' ),
array( ',', ',', ';', ';', '{', '{', '}', '}', ':', ':' ),
$data
);
umask(0022);
file_put_contents(MINIMAL_CSS, $data);
$data_gz = gzencode($data, 9); file_put_contents(MINIMAL_CSS_ZIPPED, $data_gz);
$etag = dechex(crc32($data)); file_put_contents(ETAG, $etag);
}
$max_age = CACHE_DAYS * 86400;
$exp_gmt = gmdate("D, d M Y H:i:s", time() + $max_age) . ' GMT';
$mod_gmt = gmdate("D, d M Y H:i:s", filemtime($_GET['pack']) ) . ' GMT';
/* Senden */
$etag = file_get_contents(ETAG);
header ("Etag:$etag");
if ( empty ( $_SERVER['HTTP_IF_NONE_MATCH']) || $_SERVER['HTTP_IF_NONE_MATCH'] != $etag ) {
header ('Content-Type:text/css');
header ("Expires:$exp_gmt");
header ("Cache-Control:max-age=$max_age, public");
header ("Last-Modified:$mod_gmt");
/* gezippt ? */
if (! isset($_SERVER['HTTP_ACCEPT_ENCODING'])) {
$_SERVER['HTTP_ACCEPT_ENCODING'] = false;
}
if (false === strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) {
if ( empty($data) ) {readfile(MINIMAL_CSS);} else {echo $data;}
} else {
header ('Vary:Accept-Encoding');
header ('Content-Encoding:gzip');
if ( empty($data_gz) ) {readfile(MINIMAL_CSS_ZIPPED);} else {echo $data_gz;}
}
} else {
header('Status: 304');
echo '';
}
Jörg Reinholz