timeout obwohl set_time_limit(0)
Felix Riesterer
- php
0 Tom0 ChrisB0 Felix Riesterer
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.
Hello lieber Felix,
benutzt dein Server noch den Safe-Mode?
Dann funktioniert set_time_limit() nicht im Script.
Dann müsstest Du versuchen, max_execution_time in der php.ini zu setzen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Lieber Tom,
auf meinem lokalen System schieße ich mir doch nicht selbst ins Knie und aktiviere den safe_mode?! Den habe ich bereits im Vorfeld als Ursache ausgeschlossen. Hätte ich unbedingt dazuschreiben sollen...
Liebe Grüße,
Felix Riesterer.
Hi Felix,
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.
http://www.php.net/manual/en/function.set-time-limit.php:
“Warning - This function has no effect when PHP is running in safe mode. There is no workaround other than turning off safe mode or changing the time limit in the php.ini.”
MfG ChrisB
Lieber ChrisB,
auf meinem lokalen System schieße ich mir doch nicht selbst ins Knie und aktiviere den safe_mode?! Den habe ich bereits im Vorfeld als Ursache ausgeschlossen. Hätte ich unbedingt dazuschreiben sollen...
Liebe Grüße,
Felix Riesterer.
Hallo Ingrid,
Kontroll-Ausgaben haben gezeigt, dass die max_execution_time durch meinen set_time_limit-Aufruf auf den (unendlichen) Wert "0" gesetzt ist
also am safe_mode kann's nicht liegen, denn offensichtlich wird der Aufruf von set_time_limit akzeptiert. Außerdem habe ich auf meinem Testsystem keinen safe_mode aktiviert.
Auf einem anderen System mit Win7 gibt es dieses Problem nicht. Da ich das Projekt für einen Freund entwickle, der diese Bilder auf seinem Privat-PC über DSL anderen Freunden zugänglich machen möchte, haben wir es jetzt einfach bei ihm ausprobiert - ohne Probleme jedwelcher Art. Er hatte sich XAMP installiert...
Naja, wenn's auf meinem Testsystem nicht tut, dann kann ich das verschmerzen; Hauptsache ist, dass es auf dem PC des Freundes läuft.
Dank an ChrisB und Tom, die mir helfen wollten.
Liebe Grüße,
Felix Riesterer.