Newton Wagner

se desenvolvendo na web

Rodando Processos em Background com PHP

with 7 comments

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.

Written by Newton Wagner

August 15th, 2007 at 11:58 am

Posted in php

Tagged with ,

7 Responses to 'Rodando Processos em Background com PHP'

Subscribe to comments with RSS or TrackBack to 'Rodando Processos em Background com PHP'.

  1. Pô, cara.. você me tirou uma dúvida de meses nesse post.. eheheheh o php realmente trabalha com threads? Como podemos tirar benefícios disso? Se não for incômodo, fale em outros posts sobre isso! =)
    Valeu e parabéns pelo blog!

    Vinicius Cruz

    13 Sep 07 at 12:10

  2. Vinicius, não podemos dizer, nesse caso, que foi o PHP que trabalhou com Threads. Na verdade, usamos um recurso do ambiente (Linux) para conseguir disparar o novo processo.

    Existem as funções que citei no post, mas no manual não é recomendado o uso em aplicaões web. Se você usar o PHP via linha de comando, elas funcionam bem.

    Vou pensar em um exemplo prático pra postar.

    Newton Wagner

    13 Sep 07 at 15:20

  3. Newton,
    voce citou:
    “Existem as funções que citei no post, mas no manual não é recomendado o uso em aplicaões web. Se você usar o PHP via linha de comando, elas funcionam bem.”

    concordo que via linha de comando funciona bem, mas via web, o script pai finaliza a pagina, mas fica sendo repetidamente chamado.
    Já viu isso ?

    Obrigado.
    André

    andre

    22 Jun 08 at 23:32

  4. Camarada… estou tendo problemas para executar uma seguencia de comandos em background!

    seguinte trexo de codigo!

    foreach($listBitrates as $objBitrate){
    $nome = $objBitrate->getNome();
    $bitrate = $objBitrate->getValor();

    $fileEdit = $pasta.”/”.$nome.”_”.$nameFile;

    $script .= ‘mencoder ‘.$fileFinalTemp.’ -o ‘.$fileEdit.’ -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=’.$bitrate.’:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -srate 22050 ;/ ‘;

    $script .= “flvtool2 -Uv $fileEdit $fileEdit ;/ “;
    }
    $script .= “php -f /home/virtual/localhost.daterra/tvcalypso/EITA.php”;
    exec($script.’ &’);

    qual seria o problema? o php fica aguardando o retorno! =[

    Assis Antunes

    9 Aug 08 at 10:10

  5. Assis, me parece que você está executando diversos comandos, separando todos por ;/? É isso mesmo que eu entendi?

    Já experimentou executar os comandos dessa forma no shell pra ver se funciona da mesma maneira?

    newton

    9 Aug 08 at 13:23

  6. [...] do php que tratava da execução de comandos e programas no servidor através do PHP. Isso pode ser misturado com o (&) do Linux para você obter uma simulação de threads, executando assim diversos comandos em tarefas [...]

  7. Amigo, eu estou com um problema exatamente como você descreveu em que o php fica aguardando o retorno da função so que no windows. No linux para jogarmos em background é so utilizar o & mas e no windows como posso resolver esse problema..?

    Abraço

    Vitor

    17 Apr 10 at 01:15

Leave a Reply