PHP exec () não retornando

Estou escrevendo um script PHP que iniciará um programa no servidor.

Eu faço isso com:

exec('myAppName'); 

Esta linha de código “funciona” na medida em que ele realmente executa o programa, no entanto, não consigo que ele retorne (continue passado) dessa linha.

Ele ficará pendurado lá, até que eu manualmente feche o programa que foi aberto ou o max_execution_time foi excedido.

Estou faltando alguma coisa óbvia?

Para dar origem a um processo em PHP, você precisará fazer algo como isto:

 function spawnBackgroundProcess($sProcessLine) { $aPipes = array(); $rProcess = proc_open($sProcessLine, array(), $aPipes); proc_close($rProcess); } 

Realmente isso está abusando da família proc_ *, mas é a melhor maneira, infelizmente.

(Não esqueça o &!)

O manual para exec , embora não seja totalmente claro sobre a questão de aguardar a saída do programa lançado, indica o valor de retorno a ser

Valores de retorno: a última linha do resultado do comando.

Em outras palavras, assim como você está observando, para retornar a saída da última linha, o exec não retornará até o programa lançado sair.

Você precisa fazer o plano de fundo para continuar com o resto do PHP que eu acredito.

Em Unix / Linux, use o caractere “&”. …

Hm ou esse sistema que faz isso … maldito, não consigo lembrar agora – vai ler o manual novamente.

Se você quiser executar um comando em segundo plano sem ter o script aguardando o resultado, você pode fazer o seguinte:

 < ?php passthru("/usr/bin/php /path/to/script.php ".$argv_parameter." >> /path/to/log_file.log 2>&1 &"); ?> 

Há algumas coisas importantes aqui.

Antes de tudo: coloque o caminho completo para o PHP binário, porque este comando será executado sob o usuário apache, e você provavelmente não terá alias de comando como o php definido nesse usuário.

Seccond: Note 2 coisas no final do comando string: ‘2> & 1’ e ‘&’. O ‘2> & 1’ é para redirect erros para o IO padrão. E o mais importante é o ‘&’ no final da seqüência de comando, que informa o terminal de não aguardar uma resposta.

Terceiro: Certifique-se de ter 777 permissions no arquivo ‘log_file.log’

Apreciar!