phpbar.de logo

Mailinglisten-Archive

[php] header("Location: ..."); sofort zur Anwendung bringen

[php] header("Location: ..."); sofort zur Anwendung bringen

Florian Grell grell at werk4.net
Mi Jul 13 14:13:13 CEST 2011


Hallo!

Am 13. Juli 2011 13:06 schrieb "Mario Haßler" <M.Hassler at gmx.de>:
> Ich habe in einem Verzeichnis Vorschaubilder von WWW-Seiten. Die Bilder
> werden über ein PHP-Skript angefragt. Das soll:
>  1. Das Vorschaubild mit der header-Funktion sofort ausgeben, falls es
>    existiert (egal wie alt es ist).
>  2. Falls das Bild nicht existiert oder älter ist als ein Grenzwert,
>    soll das Skript das Vorschaubild neu anfordern und speichern.
>    Dieser Prozess dauert ca. 20 bis 40 Sekunden "Echtzeit".
>  3. Falls es dann immer noch kein Vorschaubild gibt, wird ein "Nicht
>    gefunden"-Bild ausgegeben, wiederum mit der header-Funktion.
>
> Hier in groben Zügen der Code dazu:

[snip]

> Damit das Skript im Fall 1 weiterläuft, nachdem es die Bildadresse aus-
> gegeben hat, habe ich ignore_user_abort(true); verwendet. Die Logik ist
> auf jeden Fall so, dass nur einmal header("Location: ..."); gesendet
> wird, entweder gleich am Anfang oder ganz am Ende.
>
> Das Problem: Wenn das Bild vorhanden ist, jedoch zu alt, wird immer die
> WWW-Abfrage für das neue Bild (2.) abgewartet, bevor das Bild im Browser
> angezeigt wird. Auch der Befehl ob_flush(); hat keine Verbesserung ge-
> bracht. Ich habe auch mal zwei Leerzeilen an die "Location" gehängt:
>
>  header("Location: http://.../".$filename."\n\n");
>
> -- ebenfalls ohne Verbesserung.
>
> Wie kann ich das vorhandene (alte) Bild sofort anzeigen lassen und das
> Skript trotzdem weiter laufen lassen, damit es ein neues Bild einliest
> und speichert?

Deine "header()"-Anweisung bricht das Skript mehr oder weniger sofort
ab. Der Rest des Skripts wird eventuell noch angestossen,
wahrscheinlich aber nicht.
Mein Vorschlag:

<?php
if(file_exists($filename)) {
  // Wenn Datei existiert, wird sie ausgegeben.
  header('Content-Type: image/jpg');
  header('Content-Length: '.filesize($filename));
  header('Last-Modified: '.filemtime($filename));
  header('Cache-Control: max-age='.$lifetime);
  readfile($filename);
} else {
  // Wenn Datei nicht gefunden, wird ein Fehlerbild ausgegeben
  readfile('nicht_gefunden.png')
}

// Check, ob das Bild neu generiert werden muss.
if (!file_exists($filename) || (time()-filemtime($filename) > $lifetime)) {
   ... /* Bilddaten per WWW-Zugriffe einlesen */
   if ($success) { file_put_contents($filename, $data); }
   clearstatcache();
}
?>

Hth, Florian

php::bar PHP Wiki   -   Listenarchive