<?php
/* Festlegen der Konfiguration */

# Das Cache-Verzeichnis als absoluter oder relativer Pfad auf dem Dateisystem:
define( 'FTX_CACHE_DIR' , './cache/' );

# Wie viele Sekunden soll der Cache gültig sein?
    # 0 oder FALSE - Caching ist aus
    # '~'  - unbegrenzt (Vorsicht! Sie müssen den Cache "manuell" löschen)
define( 'FTX_CACHE_TIME' , 84600 );

# Maximale Cache-Dauer der User-Agents
define( 'FTX_EXT_CACHE_TIME' , 84600 );

# Sollen mit POST gesendete Daten beachtet werden?
define( 'FTX_CACHE_USE_POST' , TRUE );

# Sollen Cookies beachtet werden?
define( 'FTX_CACHE_USE_COOKIE' , TRUE );

# Sollen SESSIONS beachtet werden?
define( 'FTX_CACHE_USE_SESSION' , TRUE );

/*
Wichtig! Eventuell muss session_start() aus dem originalen Skript hier her vorgezogen werden.
*/

/* Das Ermitteln des Namens für das Cachefile */
if( FTX_CACHE_TIME ) {
    $s = $_SERVER['REQUEST_URI'];

    /* Falls POST-Daten gesendet wurden: */
    if( FTX_CACHE_USE_POST && isset( $_POST ) && count( $_POST ) ) {
        $s .= serialize( $_POST );
    }
    /* Falls Cookies gesendet wurden: */
    if( CACHE_USE_COOKIE && isset( $_COOKIE ) && count( $_COOKIE ) ) {
        $s .= serialize( $_COOKIE );
    }
    /* Falls eine Session besteht: */
    if( FTX_CACHE_USE_SESSION && isset($_SESSION) && count( $_SESSION ) ) {
        $s .= serialize( $_SESSION );
    }

    /* Der Name muss sicher sein, denn er wird in das Dateisystem geschrieben - md5() liefert was wir brauchen */
    define ( 'FTX_CACHE_FILE' , FTX_CACHE_DIR . md5($s) . '.gz' );

    /* Soll die Lebensdauer des Caches begrenzt sein? */
    if( '~' != FTX_CACHE_TIME ) {

        /* Jetzt müssen wir nachsehen, ob ein Cachefile existiert, welches eventuell veraltet ist: */
        if( filemtime( FTX_CACHE_FILE ) < ( time() - FTX_CACHE_TIME ) ) {

            /* und das veraltete Cachefile löschen: */
            unlink( FTX_CACHE_FILE );
        }
    }
    /* Prüfen, ob Cachefile (jetzt noch) vorhanden und lesbar ist: */
    if( file_exists( FTX_CACHE_FILE ) && is_readable( FTX_CACHE_FILE ) ) {

        /* Die Webseiten können natürlich auch lokal (im Browsercache oder auf einem Proxyserver) gecached werden: */
        if( '~' == FTX_CACHE_TIME || FTX_CACHE_TIME > FTX_CACHE_TIME ) {
            /* 24 Stunden statt unendlich */
            $extCacheTime = FTX_EXT_CACHE_TIME;
        } else {
            $extCacheTime = FTX_CACHE_TIME;
        }
        if( $extCacheTime ) {
            header("Expires: " . gmdate("D, d M Y H:i:s", time() + $extCacheTime) . " GMT");
            header("Cache-Control: public, max-age=" . $extCacheTime);
        }
        /* Mag der User-Agent gezippte Daten? */
        if( false === strpos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) ) {
            /* Falls nicht packen wir nämlich für Ihn aus: */
            exec( 'gzip -dc < '.FTX_CACHE_FILE );
            exit;
        } else {
            /* Falls ja, und das ist meistens der Fall, senden wir den Header und die gepackten Daten */
            header( 'Vary: Accept-Encoding' );
            header( 'Content-Encoding: gzip' );
            readfile( FTX_CACHE_FILE );
            exit;
        }
    }
}

/*
  Wenn das Skript hier noch nicht über ein exit gestolpert ist, dann muss eben alles
  neu errechnet werden. Um die Ausgaben in einem Puffer einzufangen bemühen wir 'ob_start()';
*/

ob_start();

    /*
       ########################################################################################
       #                                                                                      #
       #        Ihr bisheriges PHP-Skript bleibt (bis auf das eventuelle Vorziehen des        #
       #        Startes der Session unangetastet!                                             #
       #        Es sollte an dieser Stelle stehen und diesen Kommentar ersetzen.              #
       #                                                                                      #
       ########################################################################################
    */

/* Wir prüfen, ob überhaupt gecacht wird: */
if( FTX_CACHE_TIME && defined( FTX_CACHE_FILE ) ) {

     /* Schreiben des gezippten Cache-Files: */
     file_put_contents( FTX_CACHE_FILE , gzencode(ob_get_contents() ) );

     /* Suchen und Löschen veralteter Cache-Daten: */
     if( '~' != FTX_CACHE_TIME ) {
        $d = dir( FTX_CACHE_DIR );
        while ( FALSE !== ( $f = $d->read() ) ) {
            if( strpos( $f , '.gz' ) ) {
               $file = FTX_CACHE_DIR . $f;
               if( filemtime($file) < ( time() - FTX_CACHE_TIME ) ) {
                 unlink ( $file );
               }
            }
        }
    }
}

/* In jedem Fall geben wir die Daten aus dem Puffer aus: */
ob_end_flush();
?>