code.fastix.org

Dateiansicht:

Datei:Projekte -> PHP:Caching für Webprojekte -> caching-demo.php
md5:aef69008c0ca20169f13485994188ce6
sha1:04de08aae65dc8ff593712a7824534ef78e95e8e
Download-Link:Download
  1. <?php
  2. /* Festlegen der Konfiguration */
  3.  
  4. # Das Cache-Verzeichnis als absoluter oder relativer Pfad auf dem Dateisystem:
  5. define( 'FTX_CACHE_DIR' , './cache/' );
  6.  
  7. # Wie viele Sekunden soll der Cache gültig sein?
  8.    # 0 oder FALSE - Caching ist aus
  9.    # '~'  - unbegrenzt (Vorsicht! Sie müssen den Cache "manuell" löschen)
  10. define( 'FTX_CACHE_TIME' , 84600 );
  11.  
  12. # Maximale Cache-Dauer der User-Agents
  13. define( 'FTX_EXT_CACHE_TIME' , 84600 );
  14.  
  15. # Sollen mit POST gesendete Daten beachtet werden?
  16. define( 'FTX_CACHE_USE_POST' , TRUE );
  17.  
  18. # Sollen Cookies beachtet werden?
  19. define( 'FTX_CACHE_USE_COOKIE' , TRUE );
  20.  
  21. # Sollen SESSIONS beachtet werden?
  22. define( 'FTX_CACHE_USE_SESSION' , TRUE );
  23.  
  24. /*
  25. Wichtig! Eventuell muss session_start() aus dem originalen Skript hier her vorgezogen werden.
  26. */
  27.  
  28. /* Das Ermitteln des Namens für das Cachefile */
  29. if( FTX_CACHE_TIME ) {
  30.     $s = $_SERVER['REQUEST_URI'];
  31.  
  32.     /* Falls POST-Daten gesendet wurden: */
  33.     if( FTX_CACHE_USE_POST && isset( $_POST ) && count( $_POST ) ) {
  34.         $s .= serialize( $_POST );
  35.     }
  36.     /* Falls Cookies gesendet wurden: */
  37.     if( CACHE_USE_COOKIE && isset( $_COOKIE ) && count( $_COOKIE ) ) {
  38.         $s .= serialize( $_COOKIE );
  39.     }
  40.     /* Falls eine Session besteht: */
  41.     if( FTX_CACHE_USE_SESSION && isset($_SESSION) && count( $_SESSION ) ) {
  42.         $s .= serialize( $_SESSION );
  43.     }
  44.  
  45.     /* Der Name muss sicher sein, denn er wird in das Dateisystem geschrieben - md5() liefert was wir brauchen */
  46.     define ( 'FTX_CACHE_FILE' , FTX_CACHE_DIR . md5($s) . '.gz' );
  47.  
  48.     /* Soll die Lebensdauer des Caches begrenzt sein? */
  49.     if( '~' != FTX_CACHE_TIME ) {
  50.  
  51.         /* Jetzt müssen wir nachsehen, ob ein Cachefile existiert, welches eventuell veraltet ist: */
  52.         if( filemtime( FTX_CACHE_FILE ) < ( time() - FTX_CACHE_TIME ) ) {
  53.  
  54.             /* und das veraltete Cachefile löschen: */
  55.             unlink( FTX_CACHE_FILE );
  56.         }
  57.     }
  58.     /* Prüfen, ob Cachefile (jetzt noch) vorhanden und lesbar ist: */
  59.     if( file_exists( FTX_CACHE_FILE ) && is_readable( FTX_CACHE_FILE ) ) {
  60.  
  61.         /* Die Webseiten können natürlich auch lokal (im Browsercache oder auf einem Proxyserver) gecached werden: */
  62.         if( '~' == FTX_CACHE_TIME || FTX_CACHE_TIME > FTX_CACHE_TIME ) {
  63.             /* 24 Stunden statt unendlich */
  64.             $extCacheTime = FTX_EXT_CACHE_TIME;
  65.         } else {
  66.             $extCacheTime = FTX_CACHE_TIME;
  67.         }
  68.         if( $extCacheTime ) {
  69.             header("Expires: " . gmdate("D, d M Y H:i:s", time() + $extCacheTime) . " GMT");
  70.             header("Cache-Control: public, max-age=" . $extCacheTime);
  71.         }
  72.         /* Mag der User-Agent gezippte Daten? */
  73.         if( false === strpos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) ) {
  74.             /* Falls nicht packen wir nämlich für Ihn aus: */
  75.             exec( 'gzip -dc < '.FTX_CACHE_FILE );
  76.             exit;
  77.         } else {
  78.             /* Falls ja, und das ist meistens der Fall, senden wir den Header und die gepackten Daten */
  79.             header( 'Vary: Accept-Encoding' );
  80.             header( 'Content-Encoding: gzip' );
  81.             readfile( FTX_CACHE_FILE );
  82.             exit;
  83.         }
  84.     }
  85. }
  86.  
  87. /*
  88.   Wenn das Skript hier noch nicht über ein exit gestolpert ist, dann muss eben alles
  89.   neu errechnet werden. Um die Ausgaben in einem Puffer einzufangen bemühen wir 'ob_start()';
  90. */
  91.  
  92.  
  93.     /*
  94.        ########################################################################################
  95.        #                                                                                      #
  96.        #        Ihr bisheriges PHP-Skript bleibt (bis auf das eventuelle Vorziehen des        #
  97.        #        Startes der Session unangetastet!                                             #
  98.        #        Es sollte an dieser Stelle stehen und diesen Kommentar ersetzen.              #
  99.        #                                                                                      #
  100.        ########################################################################################
  101.     */
  102.  
  103. /* Wir prüfen, ob überhaupt gecacht wird: */
  104. if( FTX_CACHE_TIME && defined( FTX_CACHE_FILE ) ) {
  105.  
  106.      /* Schreiben des gezippten Cache-Files: */
  107.      file_put_contents( FTX_CACHE_FILE , gzencode(ob_get_contents() ) );
  108.  
  109.      /* Suchen und Löschen veralteter Cache-Daten: */
  110.      if( '~' != FTX_CACHE_TIME ) {
  111.         $d = dir( FTX_CACHE_DIR );
  112.         while ( FALSE !== ( $f = $d->read() ) ) {
  113.             if( strpos( $f , '.gz' ) ) {
  114.                $file = FTX_CACHE_DIR . $f;
  115.                if( filemtime($file) < ( time() - FTX_CACHE_TIME ) ) {
  116.                  unlink ( $file );
  117.                }
  118.             }
  119.         }
  120.     }
  121. }
  122.  
  123. /* In jedem Fall geben wir die Daten aus dem Puffer aus: */
  124. ?>