Felix Riesterer: timeout obwohl set_time_limit(0)

Beitrag lesen

Liebe Mitlesende,

ich kann ein Timeout-Problem nicht lösen und bräuchte "eine zweite Meinung".

Projekt: Bildergalerie
Testsystem: WinXP32 mit Apache2 und PHP5

Ein angemeldeter Besucher bekommt ein Verzeichnis zum Betrachten freigeschaltet. Die in diesem Verzeichnis vorhandenen großen Bilddateien soll er nur auf explizite Anforderung ausgeliefert bekommen. Als Übersicht erhält er kleine Thumbnail-Grafiken, die bei Nichtvorhandensein dynamisch erzeugt und abgespeichert werden. Die Thumbnail-Grafiken verweisen auf eine Seite mit einer verkleinerten Vorschaugrafik von der originalen Bilddatei, die ebenfalls zusammen mit der Thumbnail-Grafik bei Nichtvorhandensein erzeugt werden soll. Eine Referenz auf eine Thumbnail-Datei sieht so aus: <img src="?thumb=verz1/datei1.jpg" alt="" />

Die originalen Bilddateien kommen von einer digitalen Kamera mit einer ziemlich hohen Auflösung (irgendwas um 12 Megapixel oder so), sodass das Verkleinern in ein Thumbnail (80x60) und eine Vorschaugrafik (800x600) nicht gerade im Sekundentakt geschieht. Wenn nun auf der Seite mehrere Bilder referenziert werden, die als Dateien physikalisch noch nicht vorliegen, dann beendet der Browser das Laden, bevor alle Bilddateien erzeugt wurden. Im Server-Log meines Apache steht dann mehrfach die Zeile:

PHP Fatal error:  Maximum execution time of 30 seconds exceeded in
C:\online\bilder\index.php on line 644,
referer: http://localhost/bilder/index.php?dir=sonder%20spezial%20Verzeichnis

Um dieses Problem zu beheben hatte ich mein Script so geschrieben, dass es eine angeforderte Thumbnail-Datei bei Nichtvorhandensein erzeugt, zusammen mit der größeren Vorschaugrafik. In dieser Funktion steht dann auch

ignore_user_abort(true);
set_time_limit(0);

Mein Verständnis der Sache ist dieses: Der Browser erhält ein Dokument mit einigen Referenzen auf Grafik-Resourcen, die er in jeweils eigenen HTTP-Requests vom Server anfordert. Der Server startet bei jedem dieser Requests ein PHP-Script, um die Resource auszuliefern. Dieses PHP-Script stellt nun fest, ob der User angemeldet ist, ob er die Berechtigung für diese Resource hat und ob diese Resource direkt ausgegeben werden kann, oder ob sie zuver erst erzeugt werden muss.

Was ich nicht verstehe: Warum brechen manche dieser Requests mit einem Timeout auf PHP-Seite ab? Warum können diese Instanzen ihre Arbeit nicht beenden? Kontroll-Ausgaben haben gezeigt, dass die max_execution_time durch meinen set_time_limit-Aufruf auf den (unendlichen) Wert "0" gesetzt ist - und trotzdem steht im Server-Log der Timeout von PHP-Seite. Interessant ist auch, dass bei allen(!) abgebrochenen Requests die "letzte ausgeführte Code-Zeile" die erste Zeile ist, die keine Funktionsdeklaration mehr ist und von daher tatsächlich "direkt" ausgeführt werden müsste (bei mir stehen im Dokument zuerst die Funktionsdeklarationen)...

Wer kann mir helfen und raten, wie ich die Scriptabbrüche vermeiden kann?

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)