¿Cuál es la mejor manera de mantener un script PHP ejecutándose como demonio?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Cuál es la mejor manera de mantener un script PHP ejecutándose como un demonio y cuál es la mejor manera de verificar si es necesario reiniciar?

Tengo algunos scripts que deben ejecutarse las 24 horas del día, los 7 días de la semana y, en su mayor parte, puedo ejecutarlos usando nohup.Pero si se caen, ¿cuál es la mejor manera de monitorearlo para que pueda reiniciarse automáticamente?

¿Fue útil?

Solución

Si no puede usar la estructura de inicio (adecuada) para hacer esto (está en un alojamiento compartido, etc.), use cron para ejecutar un script (puede escribirse en el idioma que desee) cada pocos minutos que verifique vea si se están ejecutando y los reinicie si es necesario.

Otros consejos

Ejecutamos nuestros demonios canalizando la salida al correo.

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

De esa manera, cuando el demonio se detenga, enviará un correo y se nos notificará de esa manera.

Por supuesto, todavía significa el reinicio manual de los demonios, pero lo sabremos de inmediato.Por lo general, si los demonios se detuvieron, significa que hay algo más de lo que hay que ocuparse de todos modos, así que normalmente está bien.

Cron rápido y sucio para reiniciar tu demonio:

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

Reemplace USUARIO con el usuario con el que se ejecuta el demonio y SCRIPTNAME con el nombre de su script.Mete esto en /etc/cron.d/restart_php_daemon.Debería ejecutarse cada minuto.cambiar el primero * a */2 o */5 para ejecutarse con menos frecuencia.

ACTUALIZAR

Si estás poniendo esto en tu propio crontab:

Correr crontab -e y añadir:

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

La solución más elegante es phpdaemon o reaccionarPHP.

Tuve éxito al ejecutar un wget y enviar el resultado a /dev/null en un servidor compartido.

Daemon es un proceso de Linux que se ejecuta en segundo plano;Apache o MySQL son demonios.En un entorno Linux, podemos ejecutar un programa en segundo plano usando cronjob, pero tiene algunas limitaciones y, en algunos escenarios, no es una buena idea.Por ejemplo, al usar cronjob, no podemos controlar si la ejecución anterior ya ha finalizado.Muchas veces es más conveniente ejecutar un proceso como un demonio.

// 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";

El código anterior está tomado de un muy buen artículo sobre cómo crear un demonio en PHP.Puedes leer esto en enlace

Utilizo un script basado en PHP para leer desde una base de datos y enviar correos electrónicos (usando la biblioteca PEAR Mail_Queue).Lo ejecuto desde un script bash y, según el resultado devuelto (de "salir $ estado;"), lo detengo, lo suspendo X segundos o lo reinicio inmediatamente.(También verifiqué el promedio de carga/suspensión en el script PHP para evitar estresar el sistema de correo).

Si fuera para un demonio a largo plazo que tuviera que estar ejecutándose continuamente, entonces estoy de acuerdo, probablemente no sería lo mejor ejecutar esto (aunque he oído hablar de algunos servidores de socket que funcionaron exitosamente a largo plazo), sin embargo, PHP 5.3 ahora también tiene una recolección de basura mejorada, y si el script está lo suficientemente bien escrito como para no salir de manera no planificada, entonces la memoria debería ser un problema mucho menor que antes.

Estoy de acuerdo en que PHP no es la mejor herramienta para esto, sin embargo, puedo entender por qué desea usar PHP para poder reutilizar componentes de su aplicación, como el acceso a la base de datos, etc.

Tuve un problema similar y terminé desarrollando The Topham Hatt, que es un demonio escrito en C que puede ejecutar scripts PHP.También puede ejecutarse como un demonio multiproceso, ejecutando muchas instancias de un script en paralelo.

Hay más información y casos de uso aquí: http://www.4pmp.com/fatcontroller/

TBH, PHP probablemente no sea la mejor herramienta para esto, en realidad no es para lo que fue diseñado.He oído hablar de pérdidas de memoria y otras cosas malas que suceden cuando intentas esto.También tenga en cuenta que PHP solo tiene una cantidad finita de identificadores de recursos (para identificadores de archivos, conexiones de bases de datos, etc.) por ejecución de un script.

Sería mejor usar otra cosa, tal vez Python o Perl, aunque no tengo ninguna experiencia real escribiendo este tipo de aplicaciones, pero sí sé que PHP no es adecuado para lo que intentas hacer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top