Zunächst einmal weiß ich, dass diese Frage (oder enge Variationen) tausend Mal gestellt wurde. Ich habe wirklich ein paar Stunden damit verbracht, in die offensichtlichen und nicht so offensichtlichen Orte zu schauen, aber vielleicht gibt es etwas Kleines, das mir fehlt.
Lassen Sie mich das Problem klarer definieren: Ich schreibe eine Newsletter-App, in der der eigentliche Sendeprozess asynchron sein soll. Wenn der Benutzer auf "Senden" klickt, wird die Anfrage sofort zurückgegeben und anschließend kann der Fortschritt auf einer bestimmten Seite überprüft werden (z. B. über AJAX). Es ist in Ihrem traditionellen LAMP-Stack geschrieben.
In dem speziellen Host, den ich verwende, sind PHPs exec () und system () aus Sicherheitsgründen deaktiviert, aber Perls Systemfunktionen (exec, system und backticks) sind nicht. Meine Workaround -Lösung bestand also darin, ein "Trigger" -Skript in Perl zu erstellen, das den eigentlichen Absender über die PHP-CLI aufruft und auf die Fortschrittsseite umleitet.
Genau die Zeile, die die Absender anrufen, ist ab sofort:
%Vor%Das Problem ist, dass es nicht sofort zurückkehrt, sondern darauf wartet, dass das Skript beendet wird. Ich möchte, dass es im Hintergrund läuft und das System sich selbst zurückrufen lässt. Ich habe auch versucht, ein ähnliches Skript in meinem Linux-Terminal laufen zu lassen, und die Eingabeaufforderung wird erst angezeigt, wenn das Skript beendet ist, obwohl meine Testausgabe nicht läuft und anzeigt, dass sie wirklich im Hintergrund läuft.
Um sicher zu sein, dass ich nichts Offensichtliches verpasse, habe ich ein sleeper.php-Skript erstellt, das nur fünf Sekunden schläft, bevor es beendet wird. Und ein test.cgi-Skript, das folgendermaßen lautet: wörtlich:
%Vor%Im Wesentlichen müssen Sie einen Prozess "dämonisieren" - ein Kind abzweigen und es dann vollständig vom Eltern trennen, damit das Elternteil sicher beendet werden kann, ohne das Kind zu beeinflussen.
Sie können dies einfach mit dem CPAN-Modul Proc :: Daemon durchführen:
%Vor%Eine andere Option wäre, einen gearman -Server und einen Arbeitsprozess (oder Prozesse) einzurichten, die das E-Mailing durchführen. Auf diese Weise steuern Sie, wie viel E-Mail gleichzeitig läuft und keine Forking erforderlich ist. Der Client (Ihr Programm) kann dem GearMan-Server eine Task hinzufügen (im Hintergrund, ohne auf ein Ergebnis zu warten, falls dies gewünscht wird), und die Jobs werden in die Warteschlange gestellt, bis der Server den Job an einen verfügbaren Worker übergibt. Es gibt Perl und PHP-APIs für Gearman, also ist es sehr praktisch.
Verwaltet, um das Problem zu lösen. Offenbar war es das, was es davon abhielt zurückzukommen, dass das Aufrufen des Absenders auf diese Weise den stdout nicht löste. Also änderte die Lösung einfach den Systemaufruf zu:
%Vor%Danke allen für die Hilfe. In der Tat war es beim Lesen der ganzen Geschichte über das "Daemonisieren" eines Prozesses, dass ich die Idee hatte, die stdout zu trennen.
Tags und Links php perl background unix