Fatal error: Maximum execution ...

Posti

Mitglied
Hi

In einem Script, der ziemlich viel in einer Datenbank rumstochert, bekomme ich teilweise (nicht immer) folgende Fehlermeldung:

Code:
Fatal error: Maximum execution time of 60 seconds exceeded in /.../script.php on line 602
In dieser Zeile steht dann eine mySQL-Anfrage.

Was bitte genau besagt diese Fehlermeldung?
Mein Englisch ist (wie wohl zu erwarten) nicht direkt das Beste, und eine Wort zu Wort Übersetzung ... naja.

Bedeutet die Fehlermeldung, daß ich zuviele Befehle in 60 Sekunden ausführe?
Bisher vermeide ich diesen Fehler, indem ich hier und da SLEEP(1) im Script verteile, was der Performance nicht direkt zu Gute kommt.
Ein Einbinden von SLEEP nach X Sekunden funktioniert leider auch nicht 100%ig

Habt Ihr ne Lösung für mich?
 
Hallo.
Diese Fehlermeldung besagt, dass dein Script mehr als 60 Sekunden läuft. Bei deinem Server sind aber maximal 60 Sekunden Laufzeit für ein Script erlaubt. Nach diesen 60 Sec wird das Script dann einfach abgebrochen und eine Fehlermeldung ausgegeben.
Mit Sleep sagt du dem Script zwar, dass es hier und da mal 1 sec warten soll, trägt aber nur noch eher dazu, das die 60 sekunden voll werden und das Script dann abgebrochen wird.
mb fanste
 
Danke Dir.

Aber der Script läuft ohne Probleme zwischen 2 und 3 Minuten (also mit Sleep).
Wie lässt sich das mit der Fehlermeldung vereinbaren?
Wenn ich den Script länger laufen lasse, bekomme ich IMMER diese Fehlermeldung.

MfG
Posti
 
Hi

Ok, hab da was gefunden ... warum nicht vorher
http://de.php.net/manual/de/function.set-time-limit.php

Da steht, daß dieses die Zeit ist, die der Parser dem Script gibt, bevor er gestoppt wird.

Warum aber bekomme ich OHNE SLEEP diese Fehlermeldung auf jeden Fall, aber mit Sleep nur, wenn ich den Script 3 Minuten laufen lassen möchte?

Kann ich die Zeit auslesen, die mein Script laufen darf?
Ok, hab noch nicht drauf geachtet, ob PHPinfo() da was drüber sagt ... auch noch nicht wirklich gebraucht.

EDIT
*****
Ok ... die 60 Sekunden stehen ja schon in der Fehler-Meldung ...
*****

Mein Problem besteht darin, daß ich User-Eingaben puffer und mit einem per Cron-Job aufgerufenen Script abarbeiten lasse.
User-Abbruch ignoriere ich, da der Cron-Server nach glaube 10 Sek abbricht.

Leider kommen da Laufzeiten von mehreren Stunden zusammen (je nach Aktivität der User).
Bis jetzt stoppe ich den Script nach 2 Minuten und mache während der Abarbeitungszeit alle 10 Sekunden 2 Sekunden Pause.
Ohne die Pause bekomme ich immer diesen Fehler.

Für Info's bin ich immer dankbar.

MfG
Posti
 
Zuletzt bearbeitet:
Nochmal Sleep zählt nicht bei der Maximum execution time zählen nur CPU sek's also die Laufzeit wo dein skript irgendwas macht.
Poste doch mal was dein skript machen soll und vielleicht auch das skript. Ansonsten wenn es so lange laufen muss kannst du nur ne art Fangschaltung machen Klartext ,statt das Skript a sleep startest du skript b das wartet (sleep) bis die zeit rum ist und startet skript a wieder.
 
Kann es sein, dass Du
entweder Deine Querys noch stark optimieren kannst
oder mit dem Skript in einer Endlosschleife landest?
 
the-conqueror hat gesagt.:
Nochmal Sleep zählt nicht bei der Maximum execution time zählen nur CPU sek's also die Laufzeit wo dein skript irgendwas macht.
Poste doch mal was dein skript machen soll und vielleicht auch das skript. Ansonsten wenn es so lange laufen muss kannst du nur ne art Fangschaltung machen Klartext ,statt das Skript a sleep startest du skript b das wartet (sleep) bis die zeit rum ist und startet skript a wieder.

Mit Script a und Script b, das verstehe ich noch nicht so richtig.


hpvw hat gesagt.:
Kann es sein, dass Du
entweder Deine Querys noch stark optimieren kannst
oder mit dem Skript in einer Endlosschleife landest?
Wie optimiere ich meine Query's?
Und: Ja,
ich bin mit dem Script in einer Endlos-Schleife.

Die User füttern den Script mit Aufträgen, die in einer Tabelle zwischengespeichert werden.
Per Crionjob wird nun der Script aufgerufen, der diese Aufträge abarbeiten soll.
Das funktioniert ungefähr so:

PHP:
for (;;){
   //Datensatz auslesen
   if (kein datensatz vorhanden?){
      break;
   }
   $erg=function(mach was mit den Daten);
   if (Endzeit erreicht ?){
      break;
   }
}
//Fertig

Anfangs hatte ich diese Abarbeitung direkt durch die User-Eingabe ausführen lassen, was allerdings im Laufe der Zeit und mit Anfütterung der Datenbank unerträglich langsam wurde.
So kam ich auf die Idee, die Verarbeitung 'nebenher' laufen zu lassen, da ich einen PHP-Script auch ohne aktiven Empfänger ausführen lassen kann.
(User-Abbruch ignorieren)

Beim Versuch, die Zeit zu reseten (also die 60 Sek neu starten zu lassen) wurde mir erörtert, daß der Server das nicht mag ... SAFE-Mode ... brauche ich also ne andere Lösung.

Was ich mir gerade überlegt habe, kann ich den Script nicht nach einer Minute unterbrechen (also aus Schleife aussteigen) und den Script erneut aufrufen?
Nur, wie mache ich eine Art Weiterleitung, wenn ich schon Text ausgegeben habe?

Denke mir, daß dieses ungefähr die Variante mit Script a und Script b ist ... oda?

Noch ne Frage ... wenn ich den Script erneut laden lasse, beginnen die 60 Sekunden erneut?

MfG
Posti
 
Zuletzt bearbeitet:
Wie optimiere ich meine Query's?
Wenn ich das richtig interpretiere, geht es bei Dir hauptsächlich um INSERTs oder UPDATEs. Da wird es schwierig. Bei SELECTs hilft z.B. Query-Cache, Abfragen vermeiden (durch JOINs, statt mehrfacher Abfragen), Felder explizit angeben, statt mit * zu arbeiten.

Anfangs hatte ich diese Abarbeitung direkt durch die User-Eingabe ausführen lassen, was allerdings im Laufe der Zeit und mit Anfütterung der Datenbank unerträglich langsam wurde.
Wieviele Eingaben macht der User denn auf einen Streich, dass das so langsam wird?

PHP:
for (;;){
   //Datensatz auslesen
   if (kein datensatz vorhanden?){
      break;
   }
   $erg=function(mach was mit den Daten);
   if (Endzeit erreicht ?){
      break;
   }
}
//Fertig
Damit produzierst Du natürlich enorme Serverlast und kommst zwangsläufig an die Max-Execution-Time, egal, wie hoch die ist.

Die User füttern den Script mit Aufträgen, die in einer Tabelle zwischengespeichert werden.
Und warum trägst Du sie dann nicht gleich in die richtige Tabelle ein?

Ich kann nicht so recht nachvollziehen, welche Intention hinter diesem Konzept steckt und sehe den Vorteil gegenüber direktem Eintragen nicht so ganz.

Gruß hpvw
 

Neue Beiträge

Zurück