Problema
Eu tenho um formulário que, quando enviado, irá executar um código básico para processar as informações enviadas e inseri-las em um banco de dados para exibição em um site de notificação. Além disso, tenho uma lista de pessoas que se inscreveram para receber essas notificações por e-mail e mensagem SMS. Esta lista é trivial como o momento (empurrando apenas cerca de 150), no entanto, é o suficiente para fazer com que demore mais de um minuto para percorrer toda a tabela de assinantes e enviar mais de 150 emails. (Os emails estão sendo enviados individualmente conforme solicitado pelos administradores do sistema de nosso servidor de email devido às políticas de email em massa.)
Durante esse tempo, o indivíduo que postou o alerta ficará sentado na última página do formulário por quase um minuto, sem qualquer reforço positivo de que sua notificação está sendo postada. Isso leva a outros problemas potenciais, todos com soluções possíveis que considero menos do que ideais.
Primeiro, o autor da postagem pode pensar que o servidor está atrasado e clicar no botão 'Enviar' novamente, fazendo com que o script reinicie ou execute duas vezes. Eu poderia resolver isso usando JavaScript para desabilitar o botão e substituir o texto para dizer algo como 'Processando ...', no entanto, isso é menos do que o ideal porque o usuário ainda ficará preso na página durante a execução do script. (Além disso, se o JavaScript estiver desativado, o problema ainda existirá.)
Em segundo lugar, o autor da postagem pode fechar a guia ou o navegador prematuramente após enviar o formulário. O script continuará em execução no servidor até tentar escrever de volta para o navegador, no entanto, se o usuário navegar para qualquer página em nosso domínio (enquanto o script ainda está em execução), o navegador para de carregar a página até que o script termine . (Isso só acontece quando uma guia ou janela do navegador é fechada e não todo o aplicativo do navegador.) Ainda assim, isso não é o ideal.
(Possível) Solução
Decidi dividir a parte "e-mail" do script em um arquivo separado que possa chamar depois que a notificação for postada. Originalmente, pensei em colocar isso na página de confirmação depois que a notificação foi postada com sucesso. No entanto, o usuário não saberá que este script está sendo executado e quaisquer anomalias não serão aparentes para ele; Este script não pode falhar.
Mas, e se eu puder executar esse script como um processo em segundo plano? Portanto, minha pergunta é a seguinte: Como posso executar um script PHP para acionar como um serviço de segundo plano e ser executado de forma completamente independente do que o usuário fez no nível do formulário?
EDIT: Isso não pode ser cron'ed. Ele deve ser executado no instante em que o formulário for enviado. Estas são notificações de alta prioridade. Além disso, os administradores de sistema que executam nossos servidores não permitem que o crons seja executado com mais frequência que 5 minutos.
exec()
mas nunca tentei isso.
ajax
e insiro sleep()
com intervalo de tempo dentro do loop (eu uso foreach no meu caso) para executar o processo em segundo plano. Funciona perfeitamente no meu servidor. Não tenho certeza sobre os outros. Também estou adicionando ignore_user_abort()
e set_time_limit()
(com hora de término calculada) antes do loop para ter certeza de que o script não será interrompido pelo servidor que uso, mesmo de acordo com meu teste, o script que conclui a tarefa sem ignore_user_abort()
e set_time_limit()
.
gearman
com php para lidar com tarefas em segundo plano. É perfeito para escalar se você se deparar com um grande processamento e cargas pesadas. Você deveria dar uma olhada nisso.