2016-04-05 8 views
0

ich eine Schleife renne, die die gleiche Anwendung ausführt, sobald die Runde beendet ist, proc_open verwendet wird, wie folgt aus:PHP CLI-Konsole schließen auf Fehler

$description = array(
0 => array("pipe", "r"), 
1 => array("pipe", "w"), 
2 => array("file", "proc_open_errors", "a+") 
); 

$command = "start /min php $operador_php"; 
$process = proc_open($command, $description, $pipe); 

if (is_resource($process)) { 
    print_r($process); 
    sleep(5); 
    fclose($pipe[0]); 
    fclose($pipe[1]); 
    $process_response = proc_close($process); 
    echo $process_response; 
} 

Das Problem ist, dass ich nach einigen Stunden läuft, Eine der Ausführungen kann in der Mitte ausfallen, wodurch die gesamte Schleife unterbrochen wird. Und es schließt sich (auf Windows), so dass ich nicht sehen kann, was das Problem ist.

Gibt es eine Möglichkeit zu verhindern, dass sich die PHP CLI selbst schließt, falls ein Problem auftritt? Oder sollte ich lieber eine Sequenz von "if/else" verwenden, um zu überprüfen, ob während der Ausführung ein Problem vorliegt? Irgendeine andere Idee?

+0

In meinem Projekt wird für jeden Prozess eine neue Protokolldatei generiert, die alle Konsolenausgaben enthält. Sie sollten dies berücksichtigen. – Random

+0

Yeap, ich denke, es ist die beste Option, die ich habe ... Es ist auch Dan Farrell Vorschlag. "> output.txt Vielen Dank! –

Antwort

1

Sie haben Optionen, aber es hängt davon ab, wie Sie es ausführen.

Eine Option ist die Fehlerbehandlung im PHP-Skript zu konfigurieren. Zumindest können Sie generische Ausnahmen abfangen und sie protokollieren, bevor sie fehlschlagen. Besser noch, in vielen Fällen können Sie möglicherweise Fehler beheben. Wie auch immer, http://php.net/manual/en/language.exceptions.php könnte eine interessante Lektüre sein.

Ein einfacherer Ansatz, und vielleicht ein guter Ausgangspunkt, wäre es, die Ausgabe aus dem Skript in eine andere Datei umzuleiten. Redirect Windows cmd stdout and stderr to a single file zeigt einen einfachen Aufruf - funktioniert genauso in Unix. Auf diese Weise wird das Fenster weiterhin entfernt, aber Sie können die Protokolle separat anzeigen. Dies ist definitiv eine bewährte Methode beim Ausführen von unbeaufsichtigten Skripts in jedem Betriebssystem. Stellen Sie sicher, dass Sie mit der Ausgabedatei vernünftig umgehen (wenn das PHP-Skript für immer ausgeführt wird, müssen Sie etwas schlaueres tun, um zu verhindern, dass das Protokoll Ihre Festplatte füllt).

Schließlich, wenn Sie manuell das PHP-Skript über die Befehlszeile aufrufen, glaube ich nicht, die Befehlszeile wird beendet, wenn das Skript beendet, aber ich denke, ich wäre nicht schockiert, wenn es tat (im Gegensatz zu haben Fenster starten automatisch eine Shell für den Prozess und schließen sie automatisch, wenn sie fertig ist.

+0

Danke Dan, es war ziemlich offensichtlich, aber ich habe in letzter Zeit erschöpft ... php scriptname.php> logs.txt –

+0

@ChrisRusso lassen Sie Ihren erschöpften Geist nicht den Standardfehler verpassen Auch das kann für Sie relevant sein (hängt davon ab, wie sich Ihre Fehler melden, aber ich vermute, dass Sie beides wollen) –

0

Hier ist eine andere Lösung, die ich auf SO gefunden:

ini_set("log_errors", 1); 
ini_set("error_log", "/php_error.log"); 
error_log("Hello, errors!"); 

Ich würde empfehlen, den Code zu Beginn der PHP-Datei platzieren. Ich möchte klarstellen, das ist besonders nützlich, wenn Sie mit anderen Servern interagieren und die Antwort ist es nicht immer die gleiche, so dass, wenn es irgendeine Ausnahme um 3 Uhr morgens gibt, ist es wird in der Datei gespeichert, die in der 2. Zeile definiert ist.