skript tut online nicht mehr (maxtime exeeded)
Felix Riesterer
- webserver
Hilfe!
Da habe ich ein Skript (PHP) geschrieben, was auf meinem Windows-PC mit Apache2 und PHP4.3.4 wunderbar tut, und auf den Server hochgeladen (Linux/Apache1/PHP4.3.5) führt es zu einem MaxTimeExeeded. Was kann ich tun?
Ich verstehe es nicht: Offenbar hängt das Skript in einer foreach-Schleife fest, da die Fehlermeldung immer Zeilenangaben innerhalb dieser Schleife macht. Ich habe dasselbe Skript mit auskommentierter Schleife online getestet - funktioniert. Was könnte denn das Problem sein??? Die Abbruchbedingung ist doch in der foreach-Schleife fest geregelt... Und auf meiner XP-Kiste funktioniert's doch auch (keine Fehler im Error-log)!?
Bin für jeden Denkanstoß dankbar!
Liebe Grüße aus Ellwangen,
Felix Riesterer.
你好 Felix,
ohne den Sourcecode deines Scriptes kann man da nicht viel zu sagen.
再见,
CK
Hi CK!
Hast recht. Is aber ein langes Listing geworden... Mal sehen, ob ich das verlinken kann. Funpic.de erlaubt ja keine externe Verlinkung... http://riesterer.ri.funpic.de/test/skript.txt
Das ist der Quelltext. In den Kommentaren steht von wo bis wo die entsprechende Passage geht...
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hab das Skript auf Funpic.de selbst getestet - es tut auch dort! Nur auf dem Webspace, auf dem es letzten Endes laufen soll, auf dem läuft es nicht!
Es ist zum heulen! :(
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Habe jetzt zeilenweise die Kommentare weggemacht und das Skript immer wieder ausprobiert. Es scheint, als ob dieser spezielle Server folgende Zeile nicht "mag":
$zweckstring = $zweckstring.substr($html_body, strlen($html_body)-strlen($test), $pos);
Was is daran so "schlecht"?
Oder seht ihr hier, was daran ein Skript mehr als 30 Sekunden beschäftigt?
Ich wäre ja um die Lösung dieses Problems _so dankbar_!
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo!
Habe jetzt zeilenweise die Kommentare weggemacht und das Skript immer wieder ausprobiert. Es scheint, als ob dieser spezielle Server folgende Zeile nicht "mag":
$zweckstring = $zweckstring.substr($html_body, strlen($html_body)-strlen($test), $pos);
Woraus schließt Du das? Das kann ich mir nicht vorstellen. Bau doch mal an ein paar Stellen Messpunkte ein, wie lange das Script läuft, diese Werte dann mal loggen.
Grüße
Andreas
Hi Andreas!
Ich habe keine Ahnung, wie man Meßpunkte einbaut... Irgenwas mit Server-Time?
Ich schließe meine Folgerung aus der Tatsache, dass mein Skript zu keiner Fehlermeldung führt, wenn ich genau diese Zeile auskommentiere. Der HTML-Output ist dann natürlich nicht das, was das Skript leisten soll, aber das HTML-Dokument wird vollständig ausgegeben, ergo mein Skript bis zum Ende ausgeführt. Ent-kommentiere ich diese besagte Zeile wieder, so braucht das Skript länger als 30 Sekunden und führt zu einer PHP-Fehlermeldung. Das HTML-Dokument reisst im Quelltext an der entsprechenden Stelle ab.
Aber wie gesagt, nur auf diesesm komischen Server. Es funktioniert bei mir lokal, als auch auf dem Webspace bei funpic.de...
Ich habe keine Ahnung warum das so ist. :(
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo!
Ich habe keine Ahnung, wie man Meßpunkte einbaut... Irgenwas mit Server-Time?
Bastel Dir irgendwas mit time() und fwrite(). Oder werf einen Blick auf http://www.php-faq.de/q/q-code-performance.html oder http://pear.php.net/package/Benchmark.
Ich schließe meine Folgerung aus der Tatsache, dass mein Skript zu keiner Fehlermeldung führt, wenn ich genau diese Zeile auskommentiere. Der HTML-Output ist dann natürlich nicht das, was das Skript leisten soll, aber das HTML-Dokument wird vollständig ausgegeben, ergo mein Skript bis zum Ende ausgeführt. Ent-kommentiere ich diese besagte Zeile wieder, so braucht das Skript länger als 30 Sekunden und führt zu einer PHP-Fehlermeldung. Das HTML-Dokument reisst im Quelltext an der entsprechenden Stelle ab.
Hm, vielleicht liege ich auch falsch, aber ich kann daran nichts finden was besonders lange dauert. Ich könnte mir nur vorstellen dass irgendetwas (z.B. ein HTTP-Request) nicht korrekt funktioniert, und möglicherweise wartet PHP Dank Reference Counting nicht auf den Timeout, wenn der Rückgabewert später nicht benötigt wird - keine Ahnung.
Aber wie gesagt, nur auf diesesm komischen Server. Es funktioniert bei mir lokal, als auch auf dem Webspace bei funpic.de...
Ich habe keine Ahnung warum das so ist. :(
Ich auch nicht ohne das komplette Script zu kennen.
Grüße
Andreas
Habe noch weiter herumprobiert.
Folgende Zeile mag er nicht:
$zweckstring = $zweckstring.substr($html_body, strlen($html_body)-strlen($test), $pos);
Speziell dieses
$zweckstring = $zweckstring.irgendwas ;
führt dazu, dass das Skript die zulässige Zeitspanne überschreitet. Kann das an zuwenig zugewiesenem Arbeitsspeicher liegen? Müsste ich mein Skript so umschreiben, dass es weniger Resourcen verbraucht? Welche andere Gründe könnten denn daran schuld sein?
Das besonders Verrückte daran ist, dass diese Zeile öfters in meinem Skript vorkommt, aber nur an dieser Stelle zu diesem merkwürdigen Verhalten des Servers führt...
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Neue Erkenntnisse... ;-)
Der Quelltext ist hier: http://riesterer.ri.funpic.de/test/skript.txt (cut & pasten!)
Die Zeile, die das Skript über das Zeitlimit hinaus beschäftigt:
$zweckstring = $zweckstring.substr($html_body, strlen($html_body)-strlen($test), $pos);
Wie gesagt, sie kommt im Skript auch an anderer Stelle vor, nur dort stört sie anscheinend nicht... Warum? Was ist hier anders?
Hier ist folgendes anders: Hier steht sie innerhalb einer großen foreach-Schleife. An den anderes Stellen im Skript ist das nicht so, denn da sind es nur (mehr oder weniger verschachtelte) for-schleifen.
Werde mal weiter testen, ob es durch "umprogrammieren" der foreach zu einer for besser geht.
Bin für jeden Denkanstoß dankbar!
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo Felix,
Der Quelltext ist hier: http://riesterer.ri.funpic.de/test/skript.txt (cut & pasten!)
1. Ich habe keinen Benchmark durchgeführt
2. Gliedere Dein Skript in Funktionen,
die jeweils _einen_ bestimmten Zweck erfüllen
(Deine Kommentare können Dir dabei helfen)
3. Verwende einen einheitlichen Stil bei der
Klammerung von Blöcken.
4. Du verwendest sehr häufig Konstruktionen wie die folgende.
Du kannst Dir eine Ebene der Verschachtelungstiefe sparen:
(das ist fast immer eine gute Idee)
Dein Code:
#------------------------------------------------------------
if($anzahl_tags > 0)
{
for($i=1; $i<=$anzahl_tags; $i++)
{
// Anweisungen
}
// weitere Anweisung(en)
}
// kein else-Block
#-------------------------------------------------------------
Meiner Meinung nach besser:
#-------------------------------------------------------------
for ($i=1; $i <= $anzahl_tags; $i++)
{
// Anweisungen
}
if ($anzahl_tags > 0)
{
// weitere Anweisungen
}
#-------------------------------------------------------------
5. Achte darauf, nicht zu tief zu verschachteln.
Ich glaube, Du kommst einmal bis in die achte Ebene.
(Funktionen können Dir dabei helfen)
6. Wenn Du Dein Programm übersichtlich in einzelne Schritte
gegliedert hast, kannst Du einfacher messen, welcher
Schritt, d.h. welche Aufgabe, wieviel Zeit erfordert.
Freundliche Grüsse,
Vinzenz,
der viel zu oft Schachtelsätze schreibt, statt auf
Tucholsky zu hören: Hauptsätze, Hauptsätze, Hauptsätze!