2011-01-17 21 views
8

Tengo un script PHP que escucha las solicitudes de socket entrantes, etc. Necesito que este script se ejecute continuamente (se ejecuta dentro de un ciclo infinito) en el servidor.¿Cómo mantener un script PHP persistente en ejecución?

¿Cómo puedo iniciar y gestionar este proceso? Intenté simplemente iniciarlo a través de SSH/masilla, pero tan pronto como la conexión SSH se agota, el script muere.

+4

posible duplicado de [Ejecutar script php como proceso daemon] (http://stackoverflow.com/questions/2036654/run-php-script-as-daemon-process) –

+2

Mucha información buena: http: // stackoverflow .com/search?q = php + daemon –

+1

comprueba también la utilidad de "pantalla" para desconectar tu sesión de ssh (y reconectala más adelante si quieres) – regilero

Respuesta

6
myscript.php & 

Esto ejecutará el scriptin el fondo

se puede comprobar con

ps aux | grep myscript.php 

Como Patrick ha mencionado en los comentarios, no hay tiempo máximo de ejecución de scripts PHP se ejecutan desde línea de comando. myscript.php se ejecutará indefinidamente.

+0

Puede anularlo con 'set_time_limit'. –

+4

no hay límite de tiempo cuando se ejecuta desde la línea de comandos – Patrick

+0

@Patrick ¡es bueno saberlo! – ActionOwl

2

Ejecutar la secuencia de comandos en el fondo a través de SSH tal como se explica aquí: Getting ssh to execute a command in the background on target machine

lo haría a continuación, sugerimos que tenga una manera de supervisar si el guión todavía se está ejecutando. Mencionó que su script escucha en un puerto, quizás podría escribir un script que verifique de vez en cuando para ver si el puerto aún está abierto.

Otra opción es supervisar la identificación del proceso. Cuando la secuencia de comandos se ejecuta por primera vez, puede tomar la identificación del proceso usando la función getmypid y almacenarla en un archivo. Luego puede verificar periódicamente si todavía se está ejecutando usando ps -p 1234.

Otra solución: How to check if a php script is still running

-1

Por qué no un bucle Do While? do { /* your code */ } while $something == 0;

Luego, cuando algo sucede para activar la interrupción de la secuencia de comandos, establezca $ algo a un valor distinto de 0.

+1

Creo que ' $ something = 0; 'es una tarea y no una prueba de verdadero/falso ...;) Pero estoy seguro de que lo sabías ... Otra cosa es que si basas algo en un escenario de bucle, a menos que tu lógica (script/función ... lo que sea) bloquea algo - cualquier bucle mientras está "inactivo" no estará inactivo en absoluto, pero forzará a la CPU del servidor a desperdiciar recursos valiosos en un ámbito de todo el servidor o al menos de todo el servidor virtual. – Tore

0

Se puede ejecutar la línea de comandos. Deberá agregar un modificador de "ejecutar en segundo plano" para que el sistema no espere a que se complete el script. Básicamente pones un & al final de tu línea de comando.

Una cosa que definitivamente debes hacer es crear un script ini shell que ejecute el script PHP en el arranque en caso de reinicios.

1

Recientemente tuvimos una necesidad similar. Estamos ejecutando un servidor Ubuntu 14.04 LTS, por lo que creamos un proceso upstart para iniciar el proceso al arrancar y reiniciar si sale por alguna razón.

Funcionó muy bien para nosotros, incluido el reinicio automático; nuestro proceso de larga duración finalmente pierde la conexión MySQL. El script maneja la excepción y se cierra, antes de que el proceso upstart reinicie el proceso automáticamente. También hemos agregado una secuencia de comandos cron para supervisar el proceso, en caso de que haya un error mayor que upstart deja de intentar reiniciar; tenemos un fail-safe en caso de que un simple reinicio no corrija el error anterior.

+0

Esta sería mi primera opción también. – musicliftsme

Cuestiones relacionadas