PHP Mod-Time Skript

Änderungsdatum von dynamischen Webseiten

Dynamische Webseiten werden erst direkt beim Aufruf erstellt. Darum senden die meisten Webserver auch Datum und Uhrzeit der Auslieferung als Änderungsdatum (modification time) der Seite mit. Dadurch muss der Browser die Seite bei jedem Besuch erneut vollständig vom Server laden.
Die meisten Seiten die zwar dynamisch z.B. mit PHP ausgeliefert werden, haben jedoch einen statischen Inhalt bzw. werden nicht jede Sekunde aktualisiert.

Anwendung

Um den Browsern auch das Cachen von dynamisch erstellten Seiten zu ermöglichen ist es notwendig das Datum der letzten Änderung der Seite dem Browser selbst zu übergeben. In PHP kann dazu die "header()" Funktion verwendet werden.
Ein Header kann aber nur dann gesendet werden, wenn noch keine Daten an den Browser geschickt wurden. D.h. man muss das Änderungsdatum vor der ersten Ausgabe schicken, oder man leitet die gesamte Ausgabe mit Hilfe von "ob_start()" in den "output buffer" um.

Folgende Funktion wird z.B. mit dem Änderungsdatum einer Datei als Argument aufgerufen

http_header_last_modified(filemtime(__FILE__));

und gibt je nach Änderungsdatum das der Browser für die bereits gecachte Seite übergeben hat den Inhalt der Seite weiter aus oder beendet die Ausführung des Skripts und sendet einen "Not Modified" HTTP-Header aus.
Natürlich kann auch das Änderungsdatum eines Datenbankeintrages als Argument verwendet werden.

Das Skript

/* send HTTP-Header "Last-Modified" with given timestamp
 */
function http_header_last_modified($modtime_page)
{
  $modtime_cache = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
  if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
	   && $modtime_page <= $modtime_cache)
  {
    header("HTTP/1.1 304 Not Modified");
    ob_end_clean();
    exit;
  }
  $last_mod_header = "Last-Modified: ";
  $last_mod_header .= gmdate("D, d M Y H:i:s", $modtime_page);
  $last_mod_header .= " GMT";
  header($last_mod_header, true);
}

Funktionstest

Im Browser selbst kann man die Funktionsweise des Skripts nicht überprüfen, da man sich dazu die HTTP-Header ansehen muss. Am besten benutzt man dazu den Web-Sniffer.

http://web-sniffer.net/