Problem
Mam formularz, który po przesłaniu uruchomi podstawowy kod w celu przetworzenia przesłanych informacji i wstawienia go do bazy danych w celu wyświetlenia na stronie internetowej z powiadomieniami. Ponadto mam listę osób, które zapisały się, aby otrzymywać te powiadomienia pocztą e-mail i SMS-em. Ta lista jest jak na razie banalna (tylko przesuwa około 150), jednak wystarczy, aby przejście przez całą tabelę subskrybentów i wysłanie ponad 150 e-maili trwało ponad minutę. (E-maile są wysyłane indywidualnie, zgodnie z żądaniem administratorów naszego serwera poczty e-mail z powodu zasad masowej poczty e-mail).
W tym czasie osoba, która opublikowała alert, będzie siedzieć na ostatniej stronie formularza przez prawie minutę bez żadnego pozytywnego potwierdzenia, że jej powiadomienie zostało wysłane. Prowadzi to do innych potencjalnych problemów, z których wszystkie mają możliwe rozwiązania, które moim zdaniem są mniej niż idealne.
Po pierwsze, plakat może pomyśleć, że serwer ma opóźnienia i ponownie kliknąć przycisk „Prześlij”, powodując, że skrypt uruchamia się od nowa lub uruchamia się dwukrotnie. Mogę rozwiązać ten problem za pomocą JavaScript, aby wyłączyć przycisk i zamienić tekst na coś w rodzaju „Przetwarzanie ...”, jednak jest to mniej niż idealne, ponieważ użytkownik nadal będzie utknął na stronie przez czas wykonywania skryptu. (Ponadto, jeśli JavaScript jest wyłączony, ten problem nadal istnieje).
Po drugie, plakat może przedwcześnie zamknąć kartę lub przeglądarkę po przesłaniu formularza. Skrypt będzie działał na serwerze, dopóki nie podejmie próby ponownego zapisu w przeglądarce, jednak jeśli użytkownik następnie przejdzie do dowolnej strony w naszej domenie (podczas gdy skrypt jest nadal uruchomiony), przeglądarka zawiesza się, ładując stronę do czasu zakończenia działania skryptu . (Dzieje się tak tylko wtedy, gdy zamknięta jest karta lub okno przeglądarki, a nie cała aplikacja przeglądarki). Jednak jest to mniej niż idealne.
(Możliwe) Rozwiązanie
Postanowiłem, że chcę wydzielić część „e-mail” skryptu do osobnego pliku, do którego mogę zadzwonić po wysłaniu powiadomienia. Początkowo myślałem o umieszczeniu tego na stronie potwierdzenia po pomyślnym wysłaniu powiadomienia. Jednak użytkownik nie będzie wiedział, że ten skrypt działa i żadne anomalie nie będą dla niego widoczne; Ten skrypt nie może zawieść.
Ale co, jeśli mogę uruchomić ten skrypt jako proces w tle? Tak więc moje pytanie brzmi: jak mogę uruchomić skrypt PHP, aby był uruchamiany jako usługa w tle i działał całkowicie niezależnie od tego, co użytkownik zrobił na poziomie formularza?
EDYCJA: Nie można tego zrobić. Musi zostać uruchomiony natychmiast po przesłaniu formularza. To są powiadomienia o wysokim priorytecie. Ponadto administratorzy systemu obsługujący nasze serwery nie zezwalają cronom na uruchamianie ich częściej niż 5 minut.
exec()
ale nigdy tego nie próbowałem.
ajax
i wstawiam sleep()
z interwałem czasowym wewnątrz pętli (używam foreach w moim przypadku), aby uruchomić proces w tle. Działa doskonale na moim serwerze. Nie jestem pewien co do pozostałych. Dodam również ignore_user_abort()
i set_time_limit()
(z obliczonym czasem zakończenia) przed pętlą, aby upewnić się, że skrypt nie zostanie zatrzymany przez serwer, z którego korzystam, nawet według mojego testu, skrypt wykonujący zadanie bez ignore_user_abort()
i set_time_limit()
.
gearman
PHP do obsługi zadań w tle. Idealnie nadaje się do skalowania, jeśli natrafisz na duże przetwarzanie i duże obciążenia. Powinieneś się temu przyjrzeć.