Archive for agosto 24th, 2010

24 de agosto de 2010

Criar daemons em PHP

por adlerparnas

Fala Pessoal!

Meu nome é Adler Parnas, depois de um tempo OFF, venho falar de como criar daemons utilizando PHP.

Todos nós, programadores PHP, sabemos que essa linguagem funciona muito bem rodando sobre um servidor WEB (Apache, IIS, etc..), mas quantas vezes precisamos rodar uma rotina de backup automática no servidor ou mesmo criar um daemon para monitorar uma fila? OK! Podemos criar scripts em SHELL, Phyton, PERL e etc…, mas eu domino PHP!

A execução de um script PHP pela linha de comandos é extremamente fácil! Basta que você chame o executável do PHP passando como parâmetro o nome do arquivo a ser executado.

#executando script pela linha de comandos (GNU/Linux)
$ php meu_script.php

Este tipo de recurso, nos permite por exemplo criar scripts que serão executados no CRON de um servidor, resolvendo por exemplo a necessidade de rotinas de backup.

Outra possibilidade é criar daemons( programas que rodam em background no servidor num loop infinito) para monitorar portas ou filas de requisições. Como um daemon é um loop infinito, nada melhor que um while para fazer com que sua rotina execute eternamente.

<?php
while(TRUE){

// Faça sua mágica aqui!!

}
?>

O grande pulo do gato, para que você não acabe com os recursos do seu servidor, você DEVE incluir a chamada da função sleep, para que seu servidor respire a cada iteração.

<?php
while(TRUE){

// Faça sua mágica aqui!!
sleep(10);  //sua rotina será executada a cada 10 segundos
}
?>

Como disse, este tipo de recurso é ótimo para monitoramento de portas ou filas (usei para isso :D). Então digamos que você compre um plano de hospedagem de site que lhe permita o acesso via SSH, assim você poderá executar seu daemon. O único problema é que quando você finalizar a sessão, todos os aplicativos executados por você também serão finalizados. Isso ocorre porque os aplicativos executados são filhos da sua sessão. Para resolver isso utilizei um script que executa meu daemon e finaliza, deixando o daemon “órfão”, deixando que eu finalize minha sessão SSH, sem que meu daemon pare de rodar.

Este é um exemplo de um daemon em PHP que a cada 10 segundos escreve num arquivo na pasta /tmp/ do meu servidor (GNU/Linux):


<?php
/**
* Programa daemon.php que escreve na diretório /tmp
*/

// guardando a hora de início da execução do daemon
$init = microtime(true);

//iniciando loop infinito
do{
 exec('echo "Estou rodando a '.(microtime(true) - $init).' segundos" >> /tmp/daemon.log');

 // adormecendo o daemon por 10 segundos
 sleep(10);
}while(TRUE);
?>

Para chamar meu daemon, sem que ele morra no final da sessão, escrevi uma script que utiliza a função proc_open para iniciar o processo:

<?php
/**
* Programa para executar o daemon
*/

//array de pipes, parâmetro obrigatório da função proc_open
$array_pipes = array();

//executando o daemon
proc_open("php daemon.php &", array(), $array_pipes);

exit;
?>

É isso ai pessoal! Espero que essa dica seja útil a muitos de vocês como foi para meu projeto. Caso tenha dito algo errado, favor me corrijam! Postem suas dúvida e/ou comentários!

PS.: O Próximo artigo será como criar daemons no Code Igniter! 😀