Problem
Ich habe ein Formular, das bei der Übermittlung Basiscode ausführt, um die übermittelten Informationen zu verarbeiten und in eine Datenbank einzufügen, um sie auf einer Benachrichtigungswebsite anzuzeigen. Außerdem habe ich eine Liste von Personen, die sich angemeldet haben, um diese Benachrichtigungen per E-Mail und SMS zu erhalten. Diese Liste ist im Moment trivial (nur etwa 150), es reicht jedoch aus, um zu veranlassen, dass es mehr als eine Minute dauert, um die gesamte Abonnententabelle zu durchlaufen und mehr als 150 E-Mails zu versenden. (Die E-Mails werden aufgrund von Massen-E-Mail-Richtlinien einzeln gesendet, wie von den Systemadministratoren unseres E-Mail-Servers angefordert.)
Während dieser Zeit bleibt die Person, die die Warnung veröffentlicht hat, fast eine Minute lang auf der letzten Seite des Formulars, ohne dass positiv bestätigt wird, dass ihre Benachrichtigung veröffentlicht wird. Dies führt zu anderen potenziellen Problemen, die alle mögliche Lösungen haben, die ich für weniger als ideal halte.
Erstens könnte das Poster glauben, dass der Server hinterherhinkt, und erneut auf die Schaltfläche "Senden" klicken, wodurch das Skript neu gestartet oder zweimal ausgeführt wird. Ich könnte dies lösen, indem ich JavaScript verwende, um die Schaltfläche zu deaktivieren und den Text zu ersetzen, um so etwas wie "Verarbeitung ..." zu sagen. Dies ist jedoch nicht ideal, da der Benutzer für die Dauer der Skriptausführung immer noch auf der Seite hängen bleibt. (Wenn JavaScript deaktiviert ist, besteht dieses Problem weiterhin.)
Zweitens schließt das Poster möglicherweise die Registerkarte oder den Browser vorzeitig, nachdem das Formular gesendet wurde. Das Skript wird auf dem Server so lange ausgeführt, bis es versucht, in den Browser zurückzuschreiben. Wenn der Benutzer dann jedoch zu einer beliebigen Seite in unserer Domäne navigiert (während das Skript noch ausgeführt wird), bleibt der Browser beim Laden der Seite hängen, bis das Skript beendet ist . (Dies geschieht nur, wenn eine Registerkarte oder ein Fenster des Browsers geschlossen ist und nicht die gesamte Browseranwendung.) Dies ist jedoch nicht ideal.
(Möglich) Lösung
Ich habe beschlossen, den "E-Mail" -Teil des Skripts in eine separate Datei aufzuteilen, die ich nach dem Posten der Benachrichtigung aufrufen kann. Ich dachte ursprünglich daran, dies auf die Bestätigungsseite zu setzen, nachdem die Benachrichtigung erfolgreich veröffentlicht wurde. Der Benutzer weiß jedoch nicht, dass dieses Skript ausgeführt wird, und Anomalien sind für ihn nicht erkennbar. Dieses Skript kann nicht fehlschlagen.
Aber was ist, wenn ich dieses Skript als Hintergrundprozess ausführen kann? Meine Frage lautet also: Wie kann ich ein PHP-Skript ausführen, um es als Hintergrunddienst auszulösen und völlig unabhängig davon auszuführen, was der Benutzer auf Formularebene getan hat?
EDIT: Dies kann nicht gekrönt werden. Es muss sofort ausgeführt werden, wenn das Formular gesendet wird. Dies sind Benachrichtigungen mit hoher Priorität. Darüber hinaus verbieten die Systemadministratoren, auf denen unsere Server ausgeführt werden, dass Cron häufiger als 5 Minuten ausgeführt wird.
exec()
aber ich habe das nie versucht.
ajax
und füge einfach sleep()
mit Zeitintervall in die Schleife ein (in meinem Fall foreach), um den Hintergrundprozess auszuführen. Es funktioniert perfekt in meinem Server. Ich bin mir nicht sicher über die anderen. Ich füge außerdem ignore_user_abort()
und set_time_limit()
(mit berechneter Endzeit) vor der Schleife hinzu, um sicherzustellen, dass das Skript nicht von dem Server gestoppt wird, den ich verwende, auch nach meinem Test, wenn das Skript die Aufgabe ohne ignore_user_abort()
und ausführt set_time_limit()
.
gearman
mit PHP, um Hintergrundaufgaben zu erledigen. Es ist perfekt zu skalieren, wenn Sie auf große Zeitverarbeitung und hohe Lasten stoßen. Sie sollten einen Blick darauf werfen.