Seite 1 von 1

Maximum execution time of 120 seconds exceeded

Verfasst: Di 16.Sep, 2008 20:16
von Dungeonwatcher
'n Abend! :cool:

Unregelmäßig und nicht reproduzierbar taucht ab und zu folgende PHP Fehlermeldung beim downloaden auf:
PHP Fatal error: Maximum execution time of 120 seconds exceeded in ...\dl_mod\classes\class_dlmod.php on line 1470
Das ist die Zeile 19 in dieser Funktion:

Code: Alles auswählen

	// Added by suggestion from Neverbirth. Thx to him!!!
	function readfile_chunked($filename, $retbytes = true)
	{
		$chunksize = 1048576;
		$buffer = '';
		$cnt =0;
		$handle = fopen($filename, 'rb');

		if ($handle === false)
		{
			return false;
		}

		while (!feof($handle))
		{
			$buffer = fread($handle, $chunksize);
			echo $buffer;
			if ($retbytes)
			{
				$cnt += strlen($buffer);
			}
		}

		$status = fclose($handle);
Ich hatte die 120 Sekunden testweise schon verdoppelt und verdreifacht, ohne Erfolg. :(

Der betroffene User muss sich kplt. aus dem Forum ausloggen, wieder einloggen und dann funktioniert der DL wieder. Was kann die Ursache dafür sein?

Bye

Verfasst: Di 16.Sep, 2008 23:28
von oxpus
Es kann auch ein Timeout im Webserver eingestellt sein.
Die Ursachen hierfür sind vielfältig...

Eben der Nachteil, wenn man so riesige Dateien zum Download anbietet :p

Verfasst: Mi 17.Sep, 2008 09:23
von Holger
Hm? Ich biete teilweise mehrere 100MB an. Habe diese Fehlermeldung noch nie gesehen!

Verfasst: Mi 17.Sep, 2008 10:47
von Dungeonwatcher
Moin! :cool:

[quote="oxpus";p="87626"]Es kann auch ein Timeout im Webserver eingestellt sein.[/quote]

Hmmm, Timout im Apache? Nicht das ich wüsste.
Die Ursachen hierfür sind vielfältig...
Die einzige Erklärung die ich in der Google Welt dafür finde ist eine zu lange Verarbeitungszeit des Scripts. Nur das kann ich beim besten Willen nicht wirklich glauben.
Eben der Nachteil, wenn man so riesige Dateien zum Download anbietet :p
Was hat denn die Dateigröße damit zu tun? Du sagtest doch selber das (so entsprechend konfiguriert) direkt zur entsprechenden Datei verlinkt ist. Außerdem betrifft es scheinbar wahllos jede Datei, egal wie groß oder klein sie ist. :(

Verfasst: Mi 17.Sep, 2008 12:45
von oxpus
Was hat denn die Dateigröße damit zu tun? Du sagtest doch selber das (so entsprechend konfiguriert) direkt zur entsprechenden Datei verlinkt ist.
1. Wenn die Datei grösser als das PHP-Speicherlimit ist, wird die readfile_chunked-Funktion angesprochen, sofern im MOD eingestellt. Diese liest aber auch die Datei in den Speicher und irgendwann ist der dann eben voll.
2. Du musst das einstellen! In der Konfiguration zur MOD ist dafür der Haken bei "direkt" zu setzen. Mit diesem Haken werden alle Downloads, die über dem PHP-Speicherlimit liegen, direkt verlinkt an den Browser geschickt.
Wenn Du nun allerdings das Speicherlimit so groß gewählt hast, daß damit bereits ein Timeout ausgelöst wird, kann ich auch nichts machen.
Bedenke, daß das Laden einer Datei über die chunked-Funktion Zeit kostet, da häppchenweise abgearbeitet wird. Und Zeit ist ja genau das, was bei Dir nun zu einem Fehler führt ;)

Zur Erklärung:
Die chunked-Funktion liest einen Teil der betreffenden Datei und schickt sie dem User als Download-Teil. Dann der nächste Teil und das bis zum Ende.
Bei Dateien, die damit innerhalb des Timeout-Limits liegen, ist das auch kein Thema, bei wirklich grossen Dateien geht es eben nicht mehr, da der Download dabei immer noch zum PHP-Timeout-Limit zählt. Dann funktioniert wirklich nur noch mit Direktverlinkung!!
Nichts anderes machen auch alle anderen Download-Seiten, wenn extrem grosse Dateien heruntergeladen werden sollen: Sie werden direkt verlinkt an den Browser des Users geschickt, wobei dann kein Script und Timeout mehr stören kann.
Und sobald dann der betreffende Dateityp noch mit einem Programm verknüpft ist (z. B. PDF-Dokumente) kann dann meist auch nur direkt in den PDF-Viewer (z. B. Acrobat Reader) geladen werden. Der einzigste echte Nachteil hierbei.

Verfasst: Mi 17.Sep, 2008 16:36
von Dungeonwatcher
[quote="oxpus";p="87629"]1. Wenn die Datei grösser als das PHP-Speicherlimit ist, wird die readfile_chunked-Funktion angesprochen, sofern im MOD eingestellt. Diese liest aber auch die Datei in den Speicher und irgendwann ist der dann eben voll.[/quote]

Klaro, aber warum trifft es dann aber auch Dateien die viel, viel kleiner als das PHP-Speicherlimit sind?
2. Du musst das einstellen! In der Konfiguration zur MOD ist dafür der Haken bei "direkt" zu setzen. Mit diesem Haken werden alle Downloads, die über dem PHP-Speicherlimit liegen, direkt verlinkt an den Browser geschickt.
Jupp, das ist so eingestellt: Neu und direkt
Wenn Du nun allerdings das Speicherlimit so groß gewählt hast, daß damit bereits ein Timeout ausgelöst wird, kann ich auch nichts machen.
Hmmm, das verstehe ich jetzt nicht. Wie soll heierbei ein Timout ausgelöst werden?
Die PHP Limits sehen bei mir so aus:

Code: Alles auswählen

max_execution_time = 120
max_input_time = 90
memory_limit = 50M
Bedenke, daß das Laden einer Datei über die chunked-Funktion Zeit kostet, da häppchenweise abgearbeitet wird. Und Zeit ist ja genau das, was bei Dir nun zu einem Fehler führt ;)
Dann müsste doch eine Erhöhung von max_execution_time zu einer Besserung führen, was es aber nicht tut.
Zur Erklärung:
Die chunked-Funktion liest einen Teil der betreffenden Datei und schickt sie dem User als Download-Teil. Dann der nächste Teil und das bis zum Ende.
Bei Dateien, die damit innerhalb des Timeout-Limits liegen, ist das auch kein Thema, bei wirklich grossen Dateien geht es eben nicht mehr, da der Download dabei immer noch zum PHP-Timeout-Limit zählt. Dann funktioniert wirklich nur noch mit Direktverlinkung!!
Wie schon gesagt, es ist hier egal wie groß die betreffende Datei ist. Die letzte betroffende Datei war z.B. nur 1,3 MB groß.

Verfasst: Mi 17.Sep, 2008 18:30
von oxpus
Ich sagte doch schon: Es kann viele Ursachen haben und der Webserver kann auch TimeOuts haben.
Lass doch mal die Downloads mit der MOD-Toolbox prüfen, damit die korrekten Dateigrössen eingetragen werden.
Vielleicht ist hier auch was falsch...