Problema
Ho un modulo che, una volta inviato, eseguirà il codice di base per elaborare le informazioni inviate e inserirlo in un database per la visualizzazione su un sito Web di notifica. Inoltre, ho un elenco di persone che si sono registrate per ricevere queste notifiche tramite e-mail e SMS. Questo elenco è banale come il momento (spingendo solo circa 150), tuttavia è sufficiente perché ci vuole più di un minuto per scorrere l'intera tabella degli iscritti e inviare oltre 150 e-mail. (Le e-mail vengono inviate individualmente come richiesto dagli amministratori di sistema del nostro server di posta elettronica a causa delle politiche di posta elettronica di massa.)
Durante questo periodo, l'individuo che ha pubblicato l'avviso rimarrà seduto sull'ultima pagina del modulo per quasi un minuto senza alcun rinforzo positivo che la sua notifica sia stata pubblicata. Questo porta ad altri potenziali problemi, tutti che hanno soluzioni possibili che ritengo tutt'altro che ideali.
Innanzitutto, l'autore potrebbe pensare che il server sia in ritardo e fare di nuovo clic sul pulsante "Invia", facendo ricominciare o eseguire due volte lo script. Potrei risolvere questo problema utilizzando JavaScript per disabilitare il pulsante e sostituire il testo per dire qualcosa come "Elaborazione ...", tuttavia questo è tutt'altro che ideale perché l'utente sarà ancora bloccato sulla pagina per la durata dell'esecuzione dello script. (Inoltre, se JavaScript è disabilitato, il problema persiste.)
In secondo luogo, il poster potrebbe chiudere prematuramente la scheda o il browser dopo aver inviato il modulo. Lo script continuerà a funzionare sul server fino a quando non proverà a riscrivere nel browser, tuttavia se l'utente accede a qualsiasi pagina all'interno del nostro dominio (mentre lo script è ancora in esecuzione), il browser si blocca caricando la pagina fino al termine dello script . (Questo accade solo quando una scheda o una finestra del browser è chiusa e non l'intera applicazione del browser.) Tuttavia, questo è tutt'altro che ideale.
(Possibile) Soluzione
Ho deciso di suddividere la parte "e-mail" dello script in un file separato che posso chiamare dopo che la notifica è stata pubblicata. Inizialmente pensavo di inserirlo nella pagina di conferma dopo che la notifica è stata pubblicata con successo. Tuttavia, l'utente non saprà che questo script è in esecuzione e qualsiasi anomalia non gli sarà evidente; Questo script non può fallire.
Ma cosa succede se posso eseguire questo script come processo in background? Quindi, la mia domanda è questa: come posso eseguire uno script PHP da attivare come servizio in background ed eseguire in modo completamente indipendente da ciò che l'utente ha fatto a livello di modulo?
EDIT: questo non può essere cronizzato. Deve essere eseguito nell'istante in cui viene inviato il modulo. Queste sono notifiche ad alta priorità. Inoltre, gli amministratori di sistema che eseguono i nostri server impediscono agli utenti di funzionare più frequentemente di 5 minuti.
exec()
ma non l'ho mai provato.
ajax
e inserisco sleep()
con intervallo di tempo all'interno del ciclo (nel mio caso uso foreach) per eseguire il processo in background. Funziona perfettamente nel mio server. Non sono sicuro degli altri. Sto anche aggiungendo ignore_user_abort()
e set_time_limit()
(con l'ora di fine calcolata) prima del ciclo per assicurarmi che lo script non venga fermato dal server che utilizzo, anche secondo il mio test, lo script che completa l'attività senza ignore_user_abort()
e set_time_limit()
.
gearman
con php per gestire le attività in background. È perfetto da scalare se ti imbatti in tempi di elaborazione lunghi e carichi pesanti. Dovresti dare un'occhiata.