Ich habe eine prozessintensive Aufgabe, die ich im Hintergrund ausführen möchte.
Der Benutzer klickt auf eine Seite, das PHP-Skript wird ausgeführt und schließlich muss unter bestimmten Bedingungen, falls erforderlich, ein Shell-Skript ausgeführt werden, z.
shell_exec('php measurePerformance.php 47 844 [email protected]');
Derzeit verwende ich shell_exec , aber dazu muss das Skript auf eine Ausgabe warten. Gibt es eine Möglichkeit, den gewünschten Befehl auszuführen, ohne darauf zu warten, dass er ausgeführt wird?
Antworten:
Wie wäre es mit Hinzufügen.
Beachten Sie, dass dadurch auch stdio und stderr entfernt werden.
quelle
> /dev/null 2>&1 &
Wie in anderen Antworten zu sehen ist, wird hier eine knappe Form> /dev/null 2>/dev/null &
angegeben. Dies bedeutet im Grunde "STDERR (2) an dieselbe Stelle wie STDOUT (& 1) umleiten".Dadurch wird ein Befehl ausgeführt und die Verbindung zum laufenden Prozess getrennt. Natürlich kann es ein beliebiger Befehl sein. Für einen Test können Sie jedoch eine PHP-Datei mit dem Befehl sleep (20) erstellen.
quelle
nohup
und das&
?Sie können Ihre Ausgabe auch sofort an den Client zurückgeben und anschließend Ihren PHP-Code weiter verarbeiten.
Dies ist die Methode, die ich für lang wartende Ajax-Aufrufe verwende, die auf der Clientseite keine Auswirkungen haben würden:
Die ausführliche Erklärung finden Sie hier: http://oytun.co/response-now-process-later
quelle
Unter Windows 2003 habe ich Folgendes verwendet, um ein anderes Skript aufzurufen, ohne zu warten:
Dies funktioniert nur, nachdem
cmd.exe
Sie Änderungsberechtigungen für - Hinzufügen von Lesen und Ausführen fürIUSR_YOURMACHINE
(ich habe auch Schreiben auf Verweigern gesetzt) hinzugefügt haben .quelle
Sicher, denn
windows
Sie können verwenden:Hinweis:
Wenn Sie eine
COM
Fehlermeldung erhalten, fügen Sie die Erweiterung zu Ihrer hinzuphp.ini
und starten Sie neuapache
:quelle
Verwenden Sie den
popen
Befehl von PHP , z.Dadurch wird ein untergeordneter Prozess erstellt und das Skript wird im Hintergrund ausgeführt, ohne auf die Ausgabe zu warten.
quelle
Wenn es sich nicht um eine Webseite handelt, empfehle ich, ein Signal zu generieren (z. B. eine Datei in einem Verzeichnis abzulegen) und die Arbeit, die erledigt werden muss, von einem Cron-Job übernehmen zu lassen. Andernfalls werden wir wahrscheinlich in das Gebiet der Verwendung
pcntl_fork()
undexec()
von innerhalb eines Apache-Prozesses gelangen, und das ist nur schlechtes Mojo.quelle
Das wird funktionieren, aber Sie müssen darauf achten, Ihren Server nicht zu überlasten, da jedes Mal, wenn Sie diese Funktion aufrufen, ein neuer Prozess erstellt wird, der im Hintergrund ausgeführt wird. Wenn nur ein Anruf gleichzeitig ausgeführt wird, erledigt diese Problemumgehung die Aufgabe.
Wenn nicht, würde ich empfehlen, eine Nachrichtenwarteschlange wie beispielsweise beanstalkd / gearman / amazon sqs auszuführen.
quelle