Qual é a melhor maneira de manter um script PHP executando como um daemon?

StackOverflow https://stackoverflow.com/questions/38596

  •  09-06-2019
  •  | 
  •  

Pergunta

Qual é a melhor maneira de manter um script PHP executando como um daemon, e qual é a melhor maneira de verificar se as necessidades de reiniciar o computador.

Eu tenho alguns scripts que precisam para executar 24/7 e para a maior parte que eu possa executá-los usando nohup.Mas se eles vão para baixo, qual é a melhor forma de acompanhar a ele, então ele pode ser reiniciado automaticamente?

Foi útil?

Solução

Se você não pode usar a (adequada) init estrutura para fazer isso (você está em hospedagem compartilhada, etc.), usar o cron para executar um script (que pode ser escrito em qualquer linguagem que você gosta) a cada poucos minutos que verifica para ver se eles estão funcionando, e reinicia-os, se necessário.

Outras dicas

Nós mantemos nossos daemons direcionando a saída para o e-mail.

php daemon.php | mail -s "daemon stopped" foo@example.org

Dessa forma, quando/se o daemon pára, vai enviar um e-mail, e nós vamos ser notificado de que maneira.

Isto significa que reinicialização manual dos daemons, é claro, mas nós vamos saber de imediato.Normalmente, se os daemons parado, isso significa que há algo mais que precisa ser cuidado, de qualquer forma, de modo que, normalmente, ok.

Rápido e sujo cron para reiniciar o daemon:

* * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

Substitua USUÁRIO com o usuário que é executado como daemon e SCRIPTNAME com o nome do seu script.Stick esta em /etc/cron.d/restart_php_daemon.Ele deve ser executado a cada minuto.Alterar o primeiro * para */2 ou */5 para executar com menos freqüência.

ATUALIZAÇÃO

Se você está colocando isso em seu próprio crontab:

Executar crontab -e e adicionar:

* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

A solução mais elegante é phpdaemon ou reactPHP.

Eu tive sucesso com a execução de um wget e enviar o resultado para /dev/null em um servidor compartilhado.

Daemon é um linux processo que é executado em segundo plano;o apache ou mysql são daemons.Em um ambiente linux, podemos executar um programa em segundo plano usando o cron, mas tem algumas limitações, e em algumas situações ele' s não é uma boa idéia.Por exemplo, usando o cron, não podemos controlar se o executado anteriormente tenha terminado ainda.Por isso, muitas vezes, é mais conveniente a execução de um processo como daemon.

// Daemonize
$pid = pcntl_fork(); // parent gets the child PID and child gets 0
if($pid){ // if pid is not 0
     // Only the parent will know the PID. Kids aren't self-aware
     // Parent says goodbye!
     print "Parent : " . getmypid() . " exiting\n";
     exit();
}
print "Child : " . getmypid() . "\n";

O código acima é obtido a partir muito bom o artigo sobre como criar um daemon em php.Você pode ler isso em link

Eu uso um script baseado em PHP para ler a partir de um banco de dados e enviar e-mails de saída (usando a PÊRA Mail_Queue biblioteca).Eu executá-lo a partir de dentro de um script bash e com base no resultado retornado (a partir de "exit $estado;"), quer parar, dormir de X segundos, ou reiniciar imediatamente.(Eu também colocar uma verificação da carga média/suspensão para o script PHP para evitar a perturbação do sistema de correio).

Se foi por um longo prazo daemon que tinha que ser constantemente correndo, então eu concordo, é, provavelmente, não seria a melhor coisa para executar este (apesar de eu ter ouvido falar de alguns soquete servidores que fez executar com êxito a longo prazo), no entanto, PHP 5.3 também têm agora melhor coleta de lixo, e se o roteiro é bem escrito o suficiente para não sair não planejada e, em seguida, a memória deveria ser menos de um problema que antes.

Eu concordo que o PHP não é a melhor ferramenta para isso, no entanto, eu posso entender porque você deseja usar o PHP para que você pode reutilizar componentes de sua aplicação, tais como acesso a banco de dados, e assim por diante.

Eu tive um problema semelhante e acabei desenvolvendo O Controlador de Gordura, que é um daemon escrito em C que pode executar scripts PHP.Ele também pode executar como um multithread daemon, executando várias instâncias de um script em paralelo.

Há mais informações e casos de uso aqui: http://www.4pmp.com/fatcontroller/

No TBH, o PHP provavelmente não é a melhor ferramenta para isso, que não é realmente o que ele foi projetado para.Já ouvi falar de vazamentos de memória e outras coisas ruins acontecendo quando você tentar isso.Também tenha em mente que o PHP tem somente uma quantidade finita de recursos ids (para identificadores de arquivo, conexões a banco de dados ect) por execução de um script.

Ser melhor usar algo mais, talvez python ou perl, apesar de eu não ter qualquer experiência real de escrever esses tipos de aplicativos, mas eu sei que o PHP não está certo de que sua tentativa de fazer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top