Ich schreibe ein funktionierendes Stück Code für eine solche Aufgabe. Die Funktion gibt den Exit-Code zurück (0 - OK, & gt; 0 - Fehler) und schreibt stdout, stderr in die Referenzvariablen.
%Vor% Ich führe ein Drittanbieter-Skript mit einer Wrapper-Klasse, die ich geschrieben habe, die shell_exec()
und Pipes in eine Datei aufruft, die ich später mit PHP-Code analysiere. Ich sollte erwähnen, dass das funktioniert, aber ich versuche, die Funktionalität zu verbessern, nachdem ich auf einen Anwendungsfall gestoßen bin, an den ich nicht gedacht hatte.
Wie ist es am besten, die Zeitüberschreitung bei shell_exec () zu verwalten? Ich dachte daran, es in ein try() catch()
zu wickeln, aber ich bin mir nicht sicher, wie ich am besten mit der Zeitkomponente umgehen soll.
Ich habe hier ein paar Fragen zu shell_exec()
und exec()
gelesen und es scheint, dass man durch Rückgabe von Ausgabe-Parametern an exec()
eine Rückgabe erhalten kann, aber das hängt davon ab, dass das Skript mit einem endet Rückgabestatus Plus in meiner Mini-Test-Seite, ich kann es nicht scheinen, um irgendeine Ausgabe zurückzugeben!
Die andere Option, über die ich nachdachte, war die Verwendung eines modalen Dialogs mit einem Spinner im Ajax-Stil, während das Skript funktionierte, und das Setzen eines manuellen Timeouts in Javascript. Das gab dem Benutzer dann eine Modelldialogmeldung über das Fehlschlagen / Timeout und Beenden.
Gibt es für diesen Anwendungsfall akzeptierte Methoden?
Mein Mini-Test bestand aus den folgenden,
%Vor%Verwenden Sie diese Frage als ref, Kann kein PHP-Skript mit PHP-Exec ausführen
Ich würde vorschlagen, dass Sie sich mit proc_open
befassen. Sie können es so konfigurieren, dass es eine Stream-Ressource zurückgibt, einen Timer manuell hält und wenn der Timer abläuft, bevor der Prozess abgeschlossen ist, können Sie ihn mit proc_terminate
beenden. Wenn der Vorgang abgeschlossen ist, bevor der Timer abgelaufen ist, können Sie proc_close
und dann stream_get_contents
verwenden, um die Daten zu erfassen, die andernfalls in stdout geschrieben worden wären.
Siehe Ссылка
Ich würde vorschlagen, dass Sie sich mit %code% befassen. Sie können es so konfigurieren, dass es eine Stream-Ressource zurückgibt, einen Timer manuell hält und wenn der Timer abläuft, bevor der Prozess abgeschlossen ist, können Sie ihn mit %code% beenden. Wenn der Vorgang abgeschlossen ist, bevor der Timer abgelaufen ist, können Sie %code% und dann %code% verwenden, um die Daten zu erfassen, die andernfalls in stdout geschrieben worden wären.
Siehe Ссылка
Ich schreibe ein funktionierendes Stück Code für eine solche Aufgabe. Die Funktion gibt den Exit-Code zurück (0 - OK, & gt; 0 - Fehler) und schreibt stdout, stderr in die Referenzvariablen.
%Vor%Ich führe ein Drittanbieter-Skript mit einer Wrapper-Klasse, die ich geschrieben habe, die %code% und Pipes in eine Datei aufruft, die ich später mit PHP-Code analysiere. Ich sollte erwähnen, dass das funktioniert, aber ich versuche, die Funktionalität zu verbessern, nachdem ich auf einen Anwendungsfall gestoßen bin, an den ich nicht gedacht hatte.
Wie ist es am besten, die Zeitüberschreitung bei shell_exec () zu verwalten? Ich dachte daran, es in ein %code% zu wickeln, aber ich bin mir nicht sicher, wie ich am besten mit der Zeitkomponente umgehen soll.
Ich habe hier ein paar Fragen zu %code% und %code% gelesen und es scheint, dass man durch Rückgabe von Ausgabe-Parametern an %code% eine Rückgabe erhalten kann, aber das hängt davon ab, dass das Skript mit einem endet Rückgabestatus Plus in meiner Mini-Test-Seite, ich kann es nicht scheinen, um irgendeine Ausgabe zurückzugeben!
Die andere Option, über die ich nachdachte, war die Verwendung eines modalen Dialogs mit einem Spinner im Ajax-Stil, während das Skript funktionierte, und das Setzen eines manuellen Timeouts in Javascript. Das gab dem Benutzer dann eine Modelldialogmeldung über das Fehlschlagen / Timeout und Beenden.
Gibt es für diesen Anwendungsfall akzeptierte Methoden?
Mein Mini-Test bestand aus den folgenden,
%Vor%Verwenden Sie diese Frage als ref, Kann kein PHP-Skript mit PHP-Exec ausführen
Ich habe versucht mit %code% , aber es gibt keine Möglichkeit, den Prozess danach zu beenden. Außerdem blockiert %code% den Stream, selbst wenn wir Stream_set_blocking unter Windows verwenden, also musste ich stattdessen fread verwenden. Außerdem funktioniert proc_terminate unter Windows nicht richtig, also musste ich eine alternative Kill-Funktion verwenden.
Ich habe mir das ausgedacht, es sollte jetzt sowohl unter Windows als auch unter Linux funktionieren:
%Vor% Ich habe versucht mit popen()
, aber es gibt keine Möglichkeit, den Prozess danach zu beenden.
Außerdem blockiert stream_get_contents()
den Stream, selbst wenn wir Stream_set_blocking unter Windows verwenden, also musste ich stattdessen fread verwenden. Außerdem funktioniert proc_terminate unter Windows nicht richtig, also musste ich eine alternative Kill-Funktion verwenden.
Ich habe mir das ausgedacht, es sollte jetzt sowohl unter Windows als auch unter Linux funktionieren:
%Vor%Tags und Links php shellexecute