2011-01-11 4 views
3

Ich habe ein lange laufenden Skript, das aus keinem Grund aussterbt. Es soll über 8 Stunden laufen, aber nach ein oder zwei Stunden aussterben, keine Fehler, nichts. Ich habe versucht, es über CLI und über http, keinen Unterschied.Skript wird nach einer Weile aussterben, kein Timeout/Speicherproblem

Ich habe die folgenden Parameter eingestellt:

set_time_limit(0); 
ini_set('memory_limit', '1024M'); 

Ich habe die Speichernutzung wurde überwacht und es geht nicht über 200M

Gibt es noch etwas, das ich fehle. Warum sollte es aussterben?

+0

Wenn Sie „keine Fehler“ erwähnt hat, dass die Log-Dateien einschließen? – acm

+0

auf welcher Plattform Sie das Skript ausführen? Gewinnen/Linux? –

+0

@andre: Ja, 'error_log ('test')' wird in diese Log-Dateien ausgegeben, aber ich bekomme keine Fehler, wenn das Skript ausstirbt. – HyderA

Antwort

6

Eine mögliche Erklärung zwicken könnte sein, dass die PHP-Garbage-Collector mit dem Skript stört. Das könnte der Grund sein, warum du zufällige Todesopfer siehst. Wenn der Garbage Collector eingeschaltet ist, wird der Zyklusfindungsalgorithmus immer dann ausgeführt, wenn der Root-Puffer voll ist.

Die PHP manual Staaten:

Die Logik hinter der Fähigkeit, den Mechanismus auf und auszuschalten, und selbst Zyklus Sammlung zu initiieren ist, dass einige Teile der Anwendung sehr zeitempfindlich sein könnten.

Sie könnten versuchen, den PHP-Garbage Collector mit gc_disable zu deaktivieren. Das Handbuch empfiehlt, dass Sie gc_collect_cycles aufrufen, bevor Sie den Puffer freigeben.

Eine andere Erklärung könnte der Code selbst sein. Ein 8-Stunden-Skript ist ein langes Skript, und wenn es komplex ist, könnte es leicht einen Haken verursachen, der das Skript zum Beenden veranlasst. Ich denke für Ihre Fehlersuche jetzt, sollten Sie auf jeden Fall Fehlerberichte zu Bericht alles mit error_reporting(-1); wenden.

Auch, wenn Ihr Skript mit anderen Diensten kommuniziert, sagen Sie eine Datenbank zum Beispiel, ist es durchaus möglich, dass das Problem sein könnte. Wenn der Datenbankserver nicht genügend Arbeitsspeicher oder Zeitüberschreitung aufweist, kann dies dazu führen, dass das Skript hängen bleibt und abstürzt. Wenn dies der Fall ist, können Sie Ihre Verbindungen zu der Datenbank aufteilen und während des Skripts in bestimmten Zeitabständen verbinden/trennen, um diese Verbindung frisch zu halten. Dieselbe Mentalität könnte auch auf andere Dienste angewendet werden, mit denen Sie möglicherweise kommunizieren.

Sie könnten, zu Testzwecken, Ihr Skript absichtlich in eine Protokolldatei schreiben, um eine erfolgreiche Abfrage durchzuführen. Achten Sie darauf, dass der Zeitstempel von der Abfrage und der Abfrage eingefügt wird. Sie erhalten möglicherweise keine Fehler, aber es kann Ihnen helfen, festzustellen, ob eine bestimmte Problemabfrage vorliegt oder ob eine Abfrage länger als gewöhnlich anhält. Sie können auch überprüfen, ob Ihre MySQL-Verbindung noch gültig ist und etwas ausdrucken, um Sie darüber zu informieren.

Ein Beispiel Protokolldatei:

[START 2011/01/21 13:12:23] MySQL Connection: TRUE [END 2011/01/21 13:12:28] Query took 5s 
[START 2011/01/21 13:12:28] MySQL Connection: TRUE [END 2011/01/21 13:12:37] Query took 9s 
[START 2011/01/21 13:12:39] MySQL Connection: TRUE [END 2011/01/21 13:12:51] Query took 12s 
+0

Dies ist ein sehr guter Vorschlag. – Donovan

+0

Einige sehr gute Punkte. Fehlerprotokollierung ist mit E_ALL aktiviert. Aber ich sehe keine Fehler. Ich werde testen, indem ich die Garbage Collection deaktiviere. Wie überprüfe ich meine aktuelle Einstellung für die Zeitüberschreitung der Datenbank? Ich benutze mysql. – HyderA

+0

Ehrlich gesagt, konnte ich Ihnen nicht sagen, wie Sie Ihre MySQL-Einstellungen überprüfen sollten, da ich keine Eins-zu-eins-Erfahrung mit MySQL habe. Eigene Untersuchungen zeigen, dass es möglicherweise Möglichkeiten gibt, die Timeouts zu verlängern, wenn Sie Zugriff auf ein Konfigurationsfenster für die MySQL-Installation haben. –

-1

Apache hat auch ein eigenes Skript Timeout es uns, müssen Sie die Datei httpd.conf

+2

OP sagte entweder CLI oder HTTP – ajreal

0

Es ist propably etwas mit dem Code verwandt.

Ich habe Skripte laufen Wochen und Monaten ohne Probleme.

Ihre Datenbankverbindung kann Zeitüberschreitung und Ausgabefehler aufweisen. Es ist auch möglich, dass Sie keine Dateideskriptoren mehr haben, wenn Sie Verbindungen oder Dateien öffnen. Oder Ihr geteiltes Speichergebiet ist voll. Es hängt vom Code ab.

Überprüfen Sie die Systemprotokolle, die selinux nicht mit Ihnen zu tun hat. Auf diese Weise würde Ihr Skript keinen Fehler ausgeben. In den Systemprotokollen sehen Sie auch, ob Sie Benutzerlimits für Systemressourcen überschritten haben (siehe ulimit).

Es ist wirklich seltsam, wenn Sie es in CLI ausführen und Sie nichts bekommen, nicht einmal segfault. Du hast Stdout und Stderr gesehen?

0

Vielleicht ist es segafults. Versuchen Sie Ihren Skript auf diese Weise zu starten:

$ ulimt -c unlimited 
$ php script.php 

Und sehen, wenn Sie eine Core-Dump-Datei (core.xxxx) im laufenden Verzeichnis finden, wenn es stirbt

Verwandte Themen