Background job com ReactPHP

98 views
Skip to first unread message

Ghean

unread,
Jan 12, 2016, 7:43:41 AM1/12/16
to Symfony Brasil
Olá.

Após uma ação de um usuário administrador eu preciso que alguns dados relacionados aos clientes do sistema sejam atualizados.
A melhor forma de se fazer isso seria usando um background job.

Vendo coisas a respeito cheguei ao ReactPHP.

Gostaria de saber se alguém já passou por algo semelhante e algumas dicas de como fazer essa implementação em ReactPHP.

Marcelo Rodrigues

unread,
Jan 12, 2016, 7:53:19 AM1/12/16
to symfo...@googlegroups.com
Ghean, 

Não entendi exatamente a relação entre background "job" e o ReactPHP (socket), e a relação de ambos com sua demanda. Background job normalmente é implementado sobre algum gerenciador de fila (queue), como ZeroMQ (ou outros da família *Q), Beanstalkd, Redis, Gearman, etc... 

Imagino que você tenha chegado ao ReactPHP por ser uma implementação assíncrona. Mas como eu disse, não ficou claro a sua demanda. 

Marcelo





--
You received this message because you are subscribed to the Google Groups "Symfony Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to symfony-pt+...@googlegroups.com.
To post to this group, send email to symfo...@googlegroups.com.
Visit this group at https://groups.google.com/group/symfony-pt.
For more options, visit https://groups.google.com/d/optout.



--
Marcelo Rodrigues

Senior Web Development Consultant
Zend Certified Engineer ZEND018059

+55 (61) 9273-2058

Alex Juchem

unread,
Jan 12, 2016, 7:54:20 AM1/12/16
to symfo...@googlegroups.com
Eu criei um crawler onde eu precisava rodar vários processos no backgroud, o que eu fiz foi o seguinte, iniciar um novo processo no php usando a função exec();

Ex.:
<?php

....

if (...) {
 exec("php5 -f arquivo.php parametro1 parametro2 parametro3 > /dev/null &");
}

Nesse código eu executo o php pela linha de comando, informo um arquivo para ele executar e passo alguns parâmetros, aquele > /dev/null & serve para meu script não esperar a resposta do comando exec(), assim ele manda executar o comando exec() e continua minha aplicação.
Lembrando que esse comando serve para linux, para windows deve informar o patch completo do php.

Em 12 de janeiro de 2016 10:43, Ghean <gilbe...@gmail.com> escreveu:

--
You received this message because you are subscribed to the Google Groups "Symfony Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to symfony-pt+...@googlegroups.com.
To post to this group, send email to symfo...@googlegroups.com.
Visit this group at https://groups.google.com/group/symfony-pt.
For more options, visit https://groups.google.com/d/optout.



--
<?= ((('1 cachorro' + '1 gato') == '2 mamíferos') ? 'Verdadeiro' : 'Falso');

Leonn Leite

unread,
Jan 12, 2016, 8:09:43 AM1/12/16
to symfo...@googlegroups.com
@alex,

em relação a execução, eu estou usando bastante o http://symfony.com/doc/current/components/process.html && https://github.com/symfony/process 

@marcelo

Adicionando coisas as coisas que você falou. 
E digo mais, as vezes colocar um crontab já resolve o que você deseja, sem necessidade de implementar nada relativo a filas. 



Atenciosamente,
Leonn Leite

Cassiano Tartari

unread,
Jan 12, 2016, 8:16:18 AM1/12/16
to symfony-pt
Já que estão falando disso, está começando a surgir a necessidade de eu organizar melhor uma série de comandos que executo diariamente com o cron. Como o número de comandos aumentou bastante e eu coloco eles num intervalo da madrugada cada um, certamente ficam períodos ociosos que poderiam ser preenchidos.

Implementei cada "job" como um comando symfony e agendei eles via crontab. Qual a melhor maneira de eu enfileirar todos esses comando symfony pra executarem 1 por vez e em uma sequencia determinada? A questão aqui é que cada comando pode variar o seu tempo de execução, são comandos que processam XMLs de integração.

Att.,
Cassiano Tartari

Otavio Augusto

unread,
Jan 12, 2016, 8:20:01 AM1/12/16
to symfo...@googlegroups.com
Tenho um cenário parecido e uso o gearman para isto.
Ele implementa uma fila de jobs que executa em segundo plano.
O ReactPHP é uma engine mais genérica ( framework ) na qual vc pode
implementar várias coisas imclusive uma fila de execução nos moldes de
RabbitMQ e Gearman, a não ser que vc realmente precise fazer algo
personalizado eu iria de Gearman ou RabbitMQ.

Em 12 de janeiro de 2016 10:43, Ghean <gilbe...@gmail.com> escreveu:
> --
> You received this message because you are subscribed to the Google Groups
> "Symfony Brasil" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to symfony-pt+...@googlegroups.com.
> To post to this group, send email to symfo...@googlegroups.com.
> Visit this group at https://groups.google.com/group/symfony-pt.
> For more options, visit https://groups.google.com/d/optout.



--
Otavio Augusto
---------------------
Consultor de TI
Citius Tecnologia
31 37761866
31 88651242
http://www.citiustecnologia.com.br

Cassiano Tartari

unread,
Jan 12, 2016, 8:22:05 AM1/12/16
to symfony-pt

Em 12 de janeiro de 2016 11:20, Otavio Augusto <otav...@gmail.com> escreveu:
Gearman ou RabbitMQ

​Valeu, vou pesquisar sobre eles.​


Att.,
Cassiano Tartari

Otavio Augusto

unread,
Jan 12, 2016, 8:23:07 AM1/12/16
to symfo...@googlegroups.com
@Cassiano Tartari
Vc pode criar um comando só que rodas os outros comandos, na
documentação do symfony vc encontra como executar um comando dentro de
outro sem abrir um shell ( exec() , system(), etc.) para isto.
Daí vc chama cada um na sequencia que desejar e agenda no cron somente
o principal.

Em 12 de janeiro de 2016 11:15, Cassiano Tartari
<cassian...@gmail.com> escreveu:

Cassiano Tartari

unread,
Jan 12, 2016, 8:26:05 AM1/12/16
to symfony-pt
@Otavio, mas aí ele vai executar um por vez e não vai dar timeout na execução desse principal?

Att.,
Cassiano Tartari

Marcelo Rodrigues

unread,
Jan 12, 2016, 8:34:42 AM1/12/16
to symfo...@googlegroups.com
Particularmente, 

Acho que uma implementação por shell (com exec, process) só vale a pena se for algo simples, onde você mesmo pode ter o controle. Algo maior, é mais fácil usar um gerenciador de filas. Além de ficar menos "técnico" em relação ao OS, você tem a vantagem de não precisar "crontab", apenas a implementação para rodar "worker" (ou workers) para os processos e ter um controle mais fino de "tentativas" para reiniciar os jobs, se necessário. 

Marcelo

Ghean

unread,
Jan 12, 2016, 9:41:48 AM1/12/16
to Symfony Brasil
Então pessoal...

Cada um dos clientes possuem algumas informações que serão usadas a todo momento no sistema.
Algumas dessas informações são geradas a partir de um calendário gerenciado pelo admin do sistema.

Cheguei ao react justamente pelo processo assíncrono, porque após esse calendário ser atualizado pelo admin preciso rodar em paralelo a atualização dessas informações em centenas de clientes do sistema.

A ideia do React é fazer essas atualizações sem travar a aplicação, até mesmo porque já tive problema de timeout.

Quanto a RabbitMQ ou Gearman, não há possibilidade de uso de ferramentas externas, já usei resque porém existem alguma limitações com o cliente em relação a essas coisas.

Uso de cron, também não será possível... precisaríamos de algo na aplicação e não depender do server, requisito do cliente.
Uso da função exec, existem algumas restrições também.

Enfim... ¯\_(ツ)_/¯

Marcelo Rodrigues

unread,
Jan 12, 2016, 10:04:07 AM1/12/16
to symfo...@googlegroups.com
Ghean, 

Agora sim ficou claro. Nesse aspecto, vejo algum sentido em usar uma ferramenta como o React mesmo, dada as restrições que você tem. Fiquei na dúvida apenas o que seria um "cliente", como você diz (apenas um registro no banco? um site, um dispositivo? um app?). 

Marcelo

--
You received this message because you are subscribed to the Google Groups "Symfony Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to symfony-pt+...@googlegroups.com.
To post to this group, send email to symfo...@googlegroups.com.
Visit this group at https://groups.google.com/group/symfony-pt.
For more options, visit https://groups.google.com/d/optout.

Cassiano Tartari

unread,
Jan 12, 2016, 11:08:43 AM1/12/16
to symfony-pt
Agora que vi aqui como chamar um comando dentro de outro comando http://symfony.com/doc/2.3/components/console/introduction.html#calling-an-existing-command mas pensando já achei um problema, se der alguma exceção em algum comando no meio do caminho os outros depois não irão executar muito provavelmente.

Att.,
Cassiano Tartari

Otavio Augusto

unread,
Jan 13, 2016, 6:58:39 AM1/13/16
to symfo...@googlegroups.com
@Cassiano,
Será somente um comando e irá instanciar as classes dos outros
comandos sem precisar chamar o shell, não vai haver timeout para isto.
Imagine que será somente um programa com várias classes cada uma
executando uma tarefa.
Algo tipo

public function execute()
{
$command = $this->getApplication()->find('comandos:comando1');
$inp = new ArrayInput($arguments); $command->run($inp, $output);

$command->run();

$command2 = $this->getApplication()->find('comandos:comando2');
$inp = new ArrayInput($arguments); $command->run($inp, $output);
$command2->run();
}


Teste jeito vc chama todos os comandos feitos no symfony de uma vez.

Dai vc agenda no cron somente um único comando.



Em 12 de janeiro de 2016 11:25, Cassiano Tartari
<cassian...@gmail.com> escreveu:

Otavio Augusto

unread,
Jan 13, 2016, 7:01:10 AM1/13/16
to symfo...@googlegroups.com
@Cassiano 
Então a alternativa seria um shell script que executa todos os comandos

Cassiano Tartari

unread,
Jan 13, 2016, 7:02:08 AM1/13/16
to symfony-pt
Se eu tiver uma exceção/erro na execução de algum comando desses no meio da "fila" provavelmente os próximos não serão executados, correto?

Att.,
Cassiano Tartari

Otavio Augusto

unread,
Jan 13, 2016, 7:05:59 AM1/13/16
to symfo...@googlegroups.com
@Ghean
Pelo que entendi os processos irão rodar no cliente. se forem Linux ou
outro Unix Like vc pode usar o fork
(http://php.net/manual/pt_BR/function.pcntl-fork.php ) para isto ou
thread ( http://php.net/manual/pt_BR/function.pcntl-fork.php)
Se não me engano a pthread tem compilação para windows mas antes verifique.
Curiosidade vc está usando GTK ou wxWindow ?



Em 12 de janeiro de 2016 12:41, Ghean <gilbe...@gmail.com> escreveu:

Otavio Augusto

unread,
Jan 13, 2016, 7:07:22 AM1/13/16
to symfo...@googlegroups.com
depende de como vc trata as exeções.

Eu quando chamo os comandos dentro de comandos sempre uso um bloco try
catch para cada um deles


Em 13 de janeiro de 2016 10:01, Cassiano Tartari
<cassian...@gmail.com> escreveu:

Otavio Augusto

unread,
Jan 13, 2016, 7:08:50 AM1/13/16
to symfo...@googlegroups.com
@Ghean
o link da extensão trheads não foi: https://pecl.php.net/package/pthreads

Ja usei as duas no Linux e atende o que precisa. O fork usei com mais
frequencia.

Ghean

unread,
Jan 14, 2016, 7:20:41 AM1/14/16
to Symfony Brasil
Marcelo, cliente não se refere ao lado de execução, mas sim a usuários do sistema.
Quando me referi a "cada um dos clientes", são empresas usuárias do sistema.

Hoje inicio algumas implementações do React e testes para os processos que preciso.
Caso alguém já tenha usado o React, aceito sugestões.

Obrigado a todos.
Reply all
Reply to author
Forward
0 new messages