web-dev-qa-db-de.com

php exec Befehl (oder ähnliches), um nicht auf das Ergebnis zu warten

Ich habe einen Befehl, den ich ausführen möchte, aber ich möchte nicht, dass PHP auf das Ergebnis wartet.

<?php
echo "Starting Script";
exec('run_baby_run');
echo "Thanks, Script is running in background";
?>

Ist es möglich, PHP nicht auf das Ergebnis warten zu lassen, d.

Ich kann nichts finden und bin mir nicht sicher, ob es überhaupt möglich ist. Das Beste, was ich finden konnte, war jemand, der in einer Minute einen CRON-Job startete.

58
greg

Aus der Dokumentation :

Um einen Befehl auszuführen, müssen Sie Ihr PHP-Skript nicht hängen lassen, während es ausgeführt wird. Das von Ihnen ausgeführte Programm darf nicht an PHP zurückgegeben werden. Um dies zu tun, leiten Sie sowohl stdout als auch stderr nach/dev/null um und führen Sie es dann im Hintergrund aus.

> /dev/null 2>&1 &

Um einen Befehl auszuführen und ihn als anderen Prozess erscheinen zu lassen, der nicht davon abhängt, dass der Apache-Thread weiterläuft (nicht abstürzt, wenn jemand die Seite abbricht), führen Sie Folgendes aus:

exec('bash -c "exec Nohup setsid your_command > /dev/null 2>&1 &"');

108
Cristian

Sie können den Befehl im Hintergrund ausführen, indem Sie am Ende einen & hinzufügen:

exec('run_baby_run &');

Wenn Sie dies allein tun, wird Ihr Skript jedoch hängen bleiben, weil:

Wenn ein Programm mit der Funktion exec gestartet wird, damit es im Hintergrund weiter ausgeführt werden kann, muss die Ausgabe des Programms in eine Datei oder einen anderen Ausgabestrom umgeleitet werden. Andernfalls wird PHP hängen bleiben, bis die Ausführung des Programms beendet ist.

So können Sie das stdout des Befehls in eine Datei umleiten, wenn Sie es später sehen möchten, oder in /dev/null, wenn Sie es als verwerfen möchten:

exec('run_baby_run > /dev/null &');
44
codaddict

Dies verwendet wget, um eine URL über etwas zu informieren, ohne zu warten.

$command = 'wget -qO- http://test.com/data=data';
exec('Nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);

Mit ls wird ein Protokoll ohne Wartezeit aktualisiert.

$command = 'ls -la > content.log';
exec('Nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);
7
Paul T

"exec Nohup setztid Ihr_Befehl"

mit Nohup kann your_command fortgesetzt werden, auch wenn der gestartete Prozess möglicherweise zuerst beendet wird. Wenn dies der Fall ist, wird das SIGNUP-Signal an your_command gesendet, wodurch es beendet wird (es sei denn, dieses Signal wird abgefangen und ignoriert).

0
jobeard

Es gibt zwei Möglichkeiten, es zu implementieren ... Die einfachste Möglichkeit ist das direkte Ergebnis von dev/null

exec("run_baby_run > /dev/null 2>&1 &");

Falls Sie jedoch noch andere Vorgänge ausführen müssen, sollten Sie ignore_user_abort .__ in Betracht ziehen. In diesem Fall wird das Skript auch ausgeführt, nachdem Sie die Verbindung geschlossen haben.

0