Tenho uma tarefa intensiva de processo que gostaria de executar em segundo plano.
O usuário clica em uma página, o script PHP é executado e, finalmente, com base em algumas condições, se necessário, ele deve executar um script de shell, por exemplo:
shell_exec('php measurePerformance.php 47 844 [email protected]');
Atualmente eu uso shell_exec , mas isso requer que o script espere por uma saída. Existe alguma maneira de executar o comando que desejo sem esperar que ele seja concluído?
Respostas:
Que tal adicionar.
Observe que isso também elimina o stdio e o stderr.
fonte
> /dev/null 2>&1 &
como visto em outras respostas, é uma forma concisa> /dev/null 2>/dev/null &
fornecida aqui. Isso basicamente significa "redirecionar STDERR (2) para o mesmo lugar que STDOUT (& 1)".Isso executará um comando e se desconectará do processo em execução. Claro, pode ser qualquer comando que você quiser. Mas, para um teste, você pode criar um arquivo php com um comando sleep (20).
fonte
nohup
e o&
?Você também pode devolver sua saída ao cliente instantaneamente e continuar processando seu código PHP depois.
Este é o método que estou usando para chamadas Ajax de longa espera que não teriam nenhum efeito no lado do cliente:
Você pode encontrar a explicação detalhada aqui: http://oytun.co/response-now-process-later
fonte
No Windows 2003, para chamar outro script sem esperar, usei este:
Isso só funciona APÓS conceder permissões de alteração em
cmd.exe
- adicionar Ler e Executar paraIUSR_YOURMACHINE
(também defini gravação como Negar).fonte
Claro, para
windows
você pode usar:Nota:
Se você receber um
COM
erro, adicione a extensão ao seuphp.ini
e reinicieapache
:fonte
Use o
popen
comando do PHP , por exemplo:Isso criará um processo filho e o script será executado em segundo plano sem esperar pela saída.
fonte
Se estiver fora de uma página da web, recomendo gerar um sinal de algum tipo (soltar um arquivo em um diretório, talvez) e fazer com que um cron job pegue o trabalho que precisa ser feito. Do contrário, provavelmente entraremos no território de usar
pcntl_fork()
eexec()
de dentro de um processo Apache, e isso é apenas um mojo ruim.fonte
Isso funcionará, mas você terá que ter cuidado para não sobrecarregar seu servidor, pois ele criará um novo processo toda vez que você chamar esta função, que será executada em segundo plano. Se houver apenas uma chamada simultânea ao mesmo tempo, essa solução alternativa fará o trabalho.
Se não, eu aconselharia a executar uma fila de mensagens como, por exemplo, beanstalkd / gearman / amazon sqs.
fonte