Ich muss eine Verzeichniskopie für eine Benutzeraktion ausführen, aber die Verzeichnisse sind ziemlich groß. Daher möchte ich eine solche Aktion ausführen können, ohne dass der Benutzer weiß, wie lange es dauert, bis die Kopie abgeschlossen ist.
Anregungen wäre sehr dankbar.
Antworten:
Angenommen, dies läuft auf einem Linux-Computer, habe ich es immer so gehandhabt:
Dadurch wird der Befehl gestartet, die Befehlsausgabe
$cmd
umgeleitet$outputfile
und die Prozess-ID in geschrieben$pidfile
.Auf diese Weise können Sie einfach überwachen, was der Prozess tut und ob er noch ausgeführt wird.
quelle
Schreiben Sie den Prozess als serverseitiges Skript in einer beliebigen Sprache (php / bash / perl / etc) und rufen Sie ihn dann über die Prozesssteuerungsfunktionen in Ihrem PHP-Skript auf.
Die Funktion erkennt wahrscheinlich, ob Standard-Io als Ausgabestream verwendet wird, und wenn dies der Fall ist, wird der Rückgabewert festgelegt. Wenn nicht, endet er
Ich habe dies schnell über die Befehlszeile mit "sleep 25s" als Befehl getestet und es hat wie ein Zauber funktioniert.
( Antwort hier gefunden )
quelle
Möglicherweise möchten Sie versuchen, dies an Ihren Befehl anzuhängen
z.B.
quelle
Ich möchte nur ein sehr einfaches Beispiel zum Testen dieser Funktionalität unter Windows hinzufügen:
Erstellen Sie die folgenden zwei Dateien und speichern Sie sie in einem Webverzeichnis:
foreground.php:
background.php:
Geben Sie IUSR die Berechtigung, in das Verzeichnis zu schreiben, in dem Sie die obigen Dateien erstellt haben
Geben Sie IUSR die Berechtigung zum Lesen und Ausführen von C: \ Windows \ System32 \ cmd.exe
Klicken Sie in einem Webbrowser auf foreground.php
Folgendes sollte für den Browser mit den aktuellen Zeitstempeln und der lokalen Ressource # im Ausgabearray gerendert werden:
Sie sollten testoutput.php im selben Verzeichnis sehen, in dem die oben genannten Dateien gespeichert wurden, und es sollte leer sein
Sie sollten testprocesses.php im selben Verzeichnis sehen, in dem die oben genannten Dateien gespeichert wurden, und es sollte den folgenden Text mit den aktuellen Zeitstempeln enthalten:
quelle
Wenn Sie nur etwas im Hintergrund tun müssen, ohne dass die PHP-Seite darauf wartet, dass es abgeschlossen wird, können Sie ein anderes (Hintergrund-) PHP-Skript verwenden, das mit dem Befehl wget "aufgerufen" wird. Dieses Hintergrund-PHP-Skript wird natürlich wie jedes andere PHP-Skript auf Ihrem System mit Berechtigungen ausgeführt.
Hier ist ein Beispiel unter Windows mit wget aus gnuwin32-Paketen.
Der Hintergrundcode (Datei test-proc-bg.php) als Beispiel ...
Das Vordergrundskript, das ...
Sie müssen popen / pclose verwenden, damit dies ordnungsgemäß funktioniert.
Die wget Optionen:
quelle
Hier ist eine Funktion zum Starten eines Hintergrundprozesses in PHP. Schließlich wurde eine erstellt, die auch unter Windows funktioniert, nachdem viele verschiedene Ansätze und Parameter gelesen und getestet wurden.
Hinweis 1: Verwenden Sie unter Windows keine
/B
Parameter, wie an anderer Stelle vorgeschlagen. Der Prozess wird gezwungen, dasselbe Konsolenfenster wie derstart
Befehl selbst auszuführen , was dazu führt, dass der Prozess synchron verarbeitet wird. Verwenden Sie nicht, um den Prozess in einem separaten Thread (asynchron) auszuführen/B
.Hinweis 2: Die leeren doppelten Anführungszeichen danach
start ""
sind erforderlich, wenn der Befehl ein Pfad in Anführungszeichen ist.start
Befehl interpretiert den ersten zitierten Parameter als Fenstertitel.quelle
Nun, ich fand eine etwas schnellere und einfachere Version
und es funktioniert.
quelle
Können Sie einen separaten Prozess veranlassen und dann Ihre Kopie im Hintergrund ausführen? Es ist schon eine Weile her, dass ich PHP gemacht habe, aber die Funktion pcntl-fork sieht vielversprechend aus.
quelle
Verwenden Sie diese Funktion, um Ihr Programm im Hintergrund auszuführen. Es ist plattformübergreifend und vollständig anpassbar.
Beachten Sie, dass diese Funktion nach dem Start des Befehls standardmäßig das stdin und stdout des laufenden Prozesses schließt. Sie können die Prozessausgabe über die Argumente $ redirectStdout und $ redirectStderr in eine Datei umleiten.
Hinweis für Windows-Benutzer:
Sie können stdout / stderr nicht auf
nul
folgende Weise umleiten :Sie können dies jedoch tun:
Hinweise für * nix Benutzer:
1) Verwenden Sie den Befehl exec shell, wenn Sie die tatsächliche PID erhalten möchten:
2) Verwenden Sie das Argument $ stdin, wenn Sie einige Daten an die Eingabe Ihres Programms übergeben möchten:
quelle
Sie könnten ein Warteschlangensystem wie Resque ausprobieren . Sie können dann einen Job generieren, der die Informationen verarbeitet und mit dem "Verarbeitungs" -Bild recht schnell zurückkehrt. Mit diesem Ansatz wissen Sie jedoch nicht, wann es fertig ist.
Diese Lösung ist für größere Anwendungen gedacht, bei denen Ihre Frontmaschinen nicht schwer heben sollen, damit sie Benutzeranforderungen verarbeiten können. Daher kann es mit physischen Daten wie Dateien und Ordnern funktionieren oder auch nicht, aber für die Verarbeitung komplizierterer Logik oder anderer asynchroner Aufgaben (dh neuer Registrierungsmails) ist es schön und sehr skalierbar.
quelle
Eine funktionierende Lösung für Windows und Linux. Weitere Informationen finden Sie auf meiner Github-Seite .
quelle
Dank dieser Antwort : Ein perfektes Tool zum Ausführen eines Hintergrundprozesses wäre Symfony Process Component , das auf
proc_*
Funktionen basiert , aber viel einfacher zu verwenden ist. Weitere Informationen finden Sie in der Dokumentation .quelle
Anstatt einen Hintergrundprozess zu initiieren, können Sie eine Triggerdatei erstellen und einen Scheduler wie cron oder autosys regelmäßig ein Skript ausführen lassen, das nach den Triggerdateien sucht und auf diese reagiert. Die Trigger können Anweisungen oder sogar Rohbefehle enthalten (noch besser, machen Sie es einfach zu einem Shell-Skript).
quelle
Wenn Sie PHP verwenden, gibt es eine viel einfachere Möglichkeit, dies mit pcntl_fork zu tun:
http://www.php.net/manual/en/function.pcntl-fork.php
quelle
Ich benutze stark
fast_cgi_finish_request()
In Kombination mit einem Closure und register_shutdown_function ()
Registrieren Sie dann diesen Abschluss, der vor dem Herunterfahren ausgeführt werden soll.
Wenn die Antwort an den Client gesendet wurde, können Sie die Verbindung zum Client schließen und mit dem PHP-Prozess weiterarbeiten:
Der Abschluss wird nach fast_cgi_finish_request ausgeführt.
Die $ -Nachricht ist zu keinem Zeitpunkt sichtbar. Sie können so viele Abschlüsse registrieren, wie Sie möchten, aber achten Sie auf die Ausführungszeit des Skripts. Dies funktioniert nur, wenn PHP als Fast CGI-Modul ausgeführt wird (war das richtig?!)
quelle
PHP-Skripte sind nicht mit anderen Entwicklungssprachen für Desktop-Anwendungen vergleichbar. In Desktop-Anwendungssprachen können wir Daemon-Threads so einstellen, dass ein Hintergrundprozess ausgeführt wird. In PHP tritt jedoch ein Prozess auf, wenn Benutzer eine Seite anfordern. Es ist jedoch möglich, einen Hintergrundjob mithilfe der Cron-Job-Funktionalität des Servers festzulegen, die vom PHP-Skript ausgeführt wird.
quelle
Für diejenigen von uns, die Windows verwenden , sehen Sie sich Folgendes an:
Referenz: http://php.net/manual/en/function.exec.php#43917
start Notepad.exe im Hintergrund minimiert:
Starten Sie einen Shell-Befehl, der im Hintergrund unsichtbar ist:
Starten Sie MSPaint maximiert und warten Sie, bis Sie es schließen, bevor Sie mit dem Skript fortfahren:
Weitere Informationen zur Run () -Methode finden Sie unter: http://msdn.microsoft.com/library/en-us/script56/html/wsMthRun.asp
Bearbeitete URL:
Gehen Sie stattdessen zu https://technet.microsoft.com/en-us/library/ee156605.aspx, da der obige Link nicht mehr vorhanden ist.
quelle
Fatal error: Class 'COM' not found
Ich weiß, dass es sich um einen 100 Jahre alten Beitrag handelt, dachte aber trotzdem, dass er für jemanden nützlich sein könnte. Sie können irgendwo auf der Seite ein unsichtbares Bild platzieren, das auf die URL verweist, die im Hintergrund ausgeführt werden muss, wie folgt:
<img src="run-in-background.php" border="0" alt="" width="1" height="1" />
quelle