Wir betreiben PHP auf einem Windows-Server (eine Quelle von vielen Problemen in der Tat, aber die Migration ist derzeit keine Option). Es gibt einige Punkte, an denen eine vom Benutzer initiierte Aktion einige Dinge auslösen muss, die eine Weile dauern und bei denen der Benutzer nicht wissen muss, ob sie erfolgreich sind oder fehlschlagen, wie zum Beispiel das Versenden einer E-Mail oder das Sicherstellen von einigen Drittanbieterkonten werden aktualisiert. Wenn ich nur mit pcntl_fork()
forkieren könnte, wäre das sehr einfach, aber die PCNTL-Funktionen sind in Windows nicht verfügbar.Forking in PHP unter Windows
Es scheint, die nächste, die ich bekommen kann etwas dieser Art zu tun ist:
exec('php-cgi.exe somescript.php');
Dies wäre jedoch weitaus komplizierter sein. Die Aktionen, die ich starten muss, beruhen auf einer Menge von Kontexten, die bereits im laufenden Prozess existieren; um das obige Beispiel zu verwenden, müsste ich die wesentlichen Daten herausfinden und sie dem neuen Skript irgendwie zur Verfügung stellen. Wenn ich mich ablenken könnte, würde es nur darum gehen, dass der Elternprozess früh zurückkehrt und das Kind an ein paar weiteren Dingen arbeiten muss.
Ich habe ein paar Leute gefunden, die über ihre eigene Arbeit sprechen, indem sie verschiedene PCNTL-Funktionen unter Windows kompiliert haben, aber keine scheint etwas verfügbar zu haben (defekte Links, usw.).
Trotz this question praktisch den gleichen Namen wie meine, scheint es das Problem war mehr Ausführungs-Timeout als müssen Gabel. Also, ist meine beste Option, einfach ein wenig umzuformen, um mit dem Aufruf von php-cgi umzugehen, oder gibt es andere Möglichkeiten?
Edit: Es scheint exec()
wird nicht funktionieren für diese, zumindest nicht ohne mich etwas anderen Aspekt davon herauszufinden, wie es wartet, bis der Anruf zurückkehrt. Ich dachte mir, ich könnte START
verwenden, so ähnlich wie exec('start php-cgi.exe somescript.php');
, aber es wartet immer noch, bis das andere Skript beendet ist.
Haben Sie einen Cron-Job dafür in Betracht gezogen? (Einige Optionen stehen zur Verfügung, http://www.google.com/search?q = cron + windows) – user187291
Von dem, was ich sehen kann, sieht es so aus, als würde das genauso gut funktionieren wie psexec, aber ich habe gerade mit psexec gearbeitet, also werde ich wahrscheinlich einfach dabei bleiben. –