Mailinglisten-Archive |
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