2008-09-01 19 views
8

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

Tengo algunas secuencias de comandos que deben ejecutarse 24/7 y en su mayor parte puedo ejecutarlas usando nohup. Pero si bajan, ¿cuál es la mejor manera de controlarlo para que pueda reiniciarse automáticamente?

+0

La mejor y única forma es la supervisión de procesos. Gira en torno al proceso parental bifurcando a un niño y captando su señal de salida. Si la señal de salida no es buena, reinicie el proceso secundario. Si un niño muere, el padre (supervisor) lo reiniciará. Todas las respuestas proporcionadas para esta pregunta son malas en el mejor de los casos, ya que ni una sola menciona a un supervisor. –

Respuesta

4

Si no puede utilizar la (propia) estructura init para hacer esto (que está en alojamiento compartido, etc.), el uso de cron para ejecutar un script (que se puede escribir en cualquier idioma que desee) cada pocos minutos que verifica si se están ejecutando, y los reinicia si es necesario.

+0

¿Puede explicar con más detalle en qué "utiliza [ing] la estructura de inicio (adecuada) para hacer esto" y cómo esto resolvería la cuestión de garantizar que el script se esté ejecutando? –

-1

TBH, PHP probablemente no sea la mejor herramienta para esto, realmente 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 db ect) por ejecución de un script.

ser mejor de usar algo más, tal vez Python o Perl, aunque no tengo ninguna experiencia real de escritura de este tipo de aplicaciones, pero sí sé PHP no es justo para lo que su tratando de hacer.

+0

Sin intentar sonar grosero, debe eliminar esta respuesta, demuestra un gran nivel de desinformación y falta de conocimiento. "cantidad finita de identificadores de recursos" son manejados por el sistema operativo, no por PHP. Por lo tanto, cualquier otro idioma tendría exactamente la misma limitación. Al ver que PHP usa la misma biblioteca para el control de procesos como lenguaje C, podrías explicar por qué no es la herramienta adecuada para ello, ya que tienes la misma potencia a tu disposición que con C. Entiendo la antipatía por un idioma en particular, pero nunca puedo entender propagación deliberada de información errónea. –

1

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

3

cron rápida y sucia para reiniciar el daemon:

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

Sustituya usuario por el usuario que se ejecuta como el demonio y SCRIPTNAME con el nombre de su script. Pegue esto en /etc/cron.d/restart_php_daemon. Debería funcionar cada minuto. Cambie el primer * a */2 o */5 para ejecutar con menos frecuencia.

ACTUALIZACIÓN

Si usted está poniendo esto en su propio crontab:

Run crontab -e y añadir:

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

Esto parece una expresión muy útil, pero no estoy seguro de si esto funciona en mac osx y/o si no tiene acceso de root. ¿Tiene un equivalente para una entrada en el archivo crontab de un usuario? – dreeves

+0

Cuando ejecuto "ps auxwww | grep meh" en la línea de comandos, devuelve: --- nombre de usuario 2803 0.0 0.0 61156 724 pts/0 SN + 06:19 0:00 grep meh --- Si ese cron de hecho funciona, ¿cómo funciona? ¿No es esa la salida de cron? – joedevon

+0

No intenta obtener el resultado de ps ... es por eso que lo redirige a/dev/null. grep está comprobando la presencia de SCRIPTNAME en la salida ps. Si está allí, devuelve 0, de lo contrario, no es cero. El || SCRIPTNAME solo se ejecutará si grep devuelve un valor distinto de cero, lo que inicia el comando. –

0

Yo uso un script basado en PHP para leer desde una base de datos y envíe correos electrónicos (usando la biblioteca PEAR Mail_Queue). Lo ejecuto desde dentro de un script bash y de acuerdo con el resultado devuelto (desde "exit $ status;") detengo, duermo X segundos o reinicio inmediatamente. (También compruebo el promedio de carga/suspensión en el script PHP para evitar estresar el sistema de correo).

Si era para un demonio a largo plazo que tenía que estar funcionando continuamente, entonces estoy de acuerdo, probablemente no sería lo mejor para ejecutar este (aunque he oído hablar de algunos servidores de socket que se ha ejecutado con éxito a largo plazo), sin embargo, PHP 5.3 ahora también ha mejorado la recolección de basura, y si la secuencia de comandos está lo suficientemente escrita como para no salir no planificada, entonces la memoria debería ser un problema mucho menor que antes.

3

Ejecutamos nuestros daemons conectando la salida al correo.

php daemon.php | mail -s "daemon stopped" [email protected] 

esta manera, cuando/si el demonio se detiene, se enviará un correo electrónico, y será notificado de esa manera.

Todavía significa el reinicio manual de los daemons, por supuesto, pero lo sabremos de inmediato.Por lo general, si los daemons se detienen, significa que hay algo más que hay que tener en cuenta de todos modos, por lo que generalmente está bien.

+0

Puede redirigir 'stderr' a' stdout' y enviarlo también usando '2> & 1' antes de la tubería. –

0

Acepto que PHP no es la mejor herramienta para esto, sin embargo, puedo entender por qué quieres usar PHP para poder reutilizar componentes de tu aplicación, como acceso a la base de datos, y más.

Tuve un problema similar y terminé desarrollando The Fat Controller que es un daemon escrito en C que puede ejecutar scripts PHP. También se puede ejecutar como un daemon multiproceso, ejecutando muchas instancias de un script en paralelo.

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

1

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 de fondo usando cronjob, pero tiene algunas limitaciones, y en algunos casos no es una buena idea. Por ejemplo, al utilizar cronjob, no podemos controlar si la ejecución anterior ya ha finalizado. Por lo general, es más conveniente ejecutar un proceso 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"; 

El código de arriba está tomado del muy buen artículo sobre cómo crear un daemon en php. Puede leer esto en link

Cuestiones relacionadas