Jörg Reinholz: (Download-Link)

Beitrag lesen

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:

http://fastix.org/r/css_packer.tar.gz

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