Rodando Processos em Background com PHP
Quando precisamos executar processamentos demorados com PHP, fazer com que o usuário dispare estes eventos através de uma página web pode não ser uma boa idéia, pois a conexão pode acabar em time-out e, além do usuário nunca ter certeza se o processo terminou ou não, o servidor web ainda pode bloquear o acesso daquele cliente por algum tempo.
Este era o problema que estávamos enfrentando em um sistema e procurávamos uma solução.
A primeira idéia foi a de usar a biblioteca de Funções de Controle de Processos do próprio PHP, porém, o manual informa que abrir uma nova thread rodando a aplicação em um servidor web pode causar comportamentos inesperados. Como também não temos controle das configurações do Apache, descartamos essa idéia a princípio.
Outra idéia foi utilizar a função exec() para executar o script, mas ainda tínhamos um problema, pois o PHP aguarda o retorno desta função para continuar o processamento. Este problema pode ser contornado utilizando uma solução do próprio Linux. Basta utilizar o caracter & (e-comercial) ao final da linha de comando dentro da função shell para que ele seja executado em uma nova thread.
Assim, o PHP recebe o retorno do exec() e finaliza a execução, enquanto o processo de geração do relatório segue em background sem interferir na requisição do usuário.


