Ich habe einen Befehl, den ich ausführen möchte, aber ich möchte nicht, dass PHP sitzt und auf das Ergebnis wartet.
<?php
echo "Starting Script";
exec('run_baby_run');
echo "Thanks, Script is running in background";
?>
Ist es möglich, dass PHP nicht auf das Ergebnis wartet? Starten Sie es einfach und fahren Sie mit dem nächsten Befehl fort.
Ich kann nichts finden und bin mir nicht sicher, ob es überhaupt möglich ist. Das Beste, was ich finden konnte, war jemand, der einen CRON-Job machte, um in einer Minute zu beginnen.
Antworten:
Aus der Dokumentation :
quelle
stdin
nach / dev / null portieren ? Wird die Eingabe eines Prozesses, der mit einer Shell verknüpft ist, ausreichen, um zu verhindern, dassnohup
der untergeordnete Prozess "abgelehnt" wird? (Sie ändern sichstdin
in dieser Antwort: superuser.com/questions/178587/... )nohup
undsetsid
? Ich kann nicht viele Informationen darüber finden, welches besser ist oder wie sie sich unterscheiden. ( Stackoverflow.com/questions/10247721/… )Sie können den Befehl im Hintergrund ausführen, indem Sie
&
am Ende ein hinzufügen :exec('run_baby_run &');
Wenn Sie dies jedoch alleine tun, hängt Ihr Skript, weil:
So können Sie die Standardausgabe des Befehls in eine Datei umleiten, wenn Sie sie später
/dev/null
anzeigen möchten oder wenn Sie sie verwerfen möchten als:exec('run_baby_run > /dev/null &');
quelle
Dies verwendet wget, um eine URL über etwas zu benachrichtigen, ohne zu warten.
$command = 'wget -qO- http://test.com/data=data'; exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);
Dies verwendet ls, um ein Protokoll zu aktualisieren, ohne zu warten.
$command = 'ls -la > content.log'; exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);
quelle
&
Symbol zwischen2>&1
undecho
, habe ich recht?Ich weiß, dass diese Frage beantwortet wurde, aber die Antworten, die ich hier gefunden habe, funktionierten nicht für mein Szenario (oder für Windows).
Ich verwende Windows 10 Laptop mit PHP 7.2 in Xampp v3.2.4.
$command = 'php Cron.php send_email "'. $id .'"'; if ( substr(php_uname(), 0, 7) == "Windows" ) { //windows pclose(popen("start /B " . $command . " 1> temp/update_log 2>&1 &", "r")); } else { //linux shell_exec( $command . " > /dev/null 2>&1 &" ); }
Das hat bei mir perfekt funktioniert.
Ich hoffe es wird jemandem mit Windows helfen. Prost.
quelle
Mit nohup kann your_command fortgesetzt werden, obwohl der gestartete Prozess möglicherweise zuerst beendet wird. In diesem Fall wird das SIGNUP-Signal an Ihren Befehl gesendet, wodurch es beendet wird (es sei denn, es fängt dieses Signal ab und ignoriert es).
quelle
Es gibt zwei Möglichkeiten, dies zu implementieren. Der einfachste Weg ist das direkte Ergebnis zu dev / null
exec("run_baby_run > /dev/null 2>&1 &");
Falls Sie jedoch andere Vorgänge ausführen müssen, können Sie ignore_user_abort in Betracht ziehen. In diesem Fall wird das Skript auch nach dem Schließen der Verbindung ausgeführt.
quelle