Que necesita para ejecutar un script de php como un proceso demonio (espere las instrucciones y hacer las cosas). cron job no lo haces por mí, porque las acciones deben ser tomadas tan pronto como la instrucción llega. Sé que PHP no es realmente la mejor opción para el demonio de los procesos debido a problemas de gestión de memoria, pero debido a diversas razones, tengo que usar PHP en este caso. Me llegó a través de una herramienta de libslack llamado Daemon (http://libslack.org/daemon) parece que me ayude a administrar los procesos demonio, pero no ha habido actualizaciones en los últimos 5 años, así que me pregunto si usted sabe algunos de otras alternativas adecuado para mi caso. Cualquier información será muy apreciada.

por favor revise mi respuesta. gracias
Relacionados: stackoverflow.com/q/4717167/212218
Me encontré con este post gonzalo123.com/2010/05/23/… que creo es relajante y estable.
Es muy fácil de hacer con systemd

OriginalEl autor Beier | 2010-01-10

14 Comentarios

  1. 154

    Usted podría comenzar su script php desde la línea de comandos (es decir, bash) mediante el uso de

    nohup php myscript.php &

    la & pone el proceso en segundo plano.

    Edición:

    Sí, hay algunos inconvenientes, pero no es posible el control? Eso está mal.

    Un simple kill processid va a parar. Y es todavía la mejor y más sencilla solución.

    no, si usted está utilizando nohup
    Esto no va a reiniciar el demonio si se produce un error, y no hay ninguna manera fácil de administrar el demonio.
    Estoy de acuerdo con lo que se ha dicho aquí, esta es una mala solución. Se debe crear un script de inicio para un par de razones: 1) el guión de inicio se inicia automáticamente en el arranque 2) Usted puede administrar el demonio con start/stop/restart comandos. Aquí es un ejemplo de servefault: serverfault.com/questions/229759/…
    hola chicos … me parece nohup y & hace la misma cosa: la separación de la puesta en marcha del proceso de la actual intance de la concha. ¿Por qué necesito tanto? No puedo simplemente hacer php myscript.php & o nohup myscript.php?? Gracias
    Si la secuencia de comandos se escribe en stdout (a través de eco o var_dump), entonces usted puede coger esta información con un archivo de registro como este: nohup php myscript.php > myscript.log &

    OriginalEl autor Henrik P. Hessel

  2. 146

    Otra opción es utilizar Upstart. Originalmente fue desarrollado para Ubuntu (y viene por defecto), pero está diseñado para ser adecuado para todas las distribuciones de Linux.

    Este enfoque es similar a Supervisord y daemontools, en que se inicia automáticamente el demonio en el arranque del sistema y reapariciones en la secuencia de comandos de finalización.

    Cómo configurarlo:

    Crear un nuevo archivo de secuencia de comandos en /etc/init/myphpworker.conf. Aquí está un ejemplo:

    # Info
    description "My PHP Worker"
    author      "Jonathan"
    
    # Events
    start on startup
    stop on shutdown
    
    # Automatically respawn
    respawn
    respawn limit 20 5
    
    # Run the script!
    # Note, in this example, if your PHP script returns
    # the string "ERROR", the daemon will stop itself.
    script
        [ $(exec /usr/bin/php -f /path/to/your/script.php) = 'ERROR' ] && ( stop; exit 1; )
    end script

    De partida & detener su demonio:

    sudo service myphpworker start
    sudo service myphpworker stop

    Comprobar si el demonio se está ejecutando:

    sudo service myphpworker status

    Gracias

    Un gran agradecimiento a Kevin van Zonneveld, donde aprendí esta técnica.

    amante de esta. Solo me pregunto, ¿es posible tener múltiples y concurrentes de los trabajadores? Solo tengo el problema de que un trabajador ya no es suficiente.
    ¿esto se ejecuta automáticamente en el arranque del sistema?
    Sudo «servicio de myphpworker inicio» no funcionó para mí. He utilizado «sudo inicio myphpworker» y funciona perfectamente
    Eso es porque hay un error en el post, no estoy exactamente seguro de lo que (y no lo he probado), pero creo que sudo service myphpworker start/stop/status sólo funciona con los servicios que están en /etc/init.d no advenedizo servicios. @mate-sich parece haber descubierto la sintaxis correcta. Otra opción es utilizar Gearman o Resque, que permite el procesamiento en segundo plano & deamonization.
    Ubuntu sí se está moviendo a usar systemd en lugar de upstart: zdnet.com/article/after-linux-civil-war-ubuntu-to-adopt-systemd

    OriginalEl autor Jonathan

  3. 46

    Si se puede – hacerse con una copia de Programación avanzada en el Entorno UNIX. Todo el capítulo 13 está dedicado al demonio de la programación. Los ejemplos están en C, pero todas las funciones que usted necesita tener contenedores en PHP (básicamente el pcntl y posix extensiones).

    En pocas palabras, escritura de un demonio (esto es posible sólo en basados en *nix OS-es – Windows utiliza los servicios) es como este:

    1. Llamada umask(0) para evitar problemas de permisos.
    2. fork() y el padre o la madre de salida.
    3. Llamada setsid().
    4. Instalación de procesamiento de la señal de SIGHUP (por lo general, se ignora o se utiliza para indicar el demonio para volver a cargar su configuración) y SIGTERM (decir el proceso para salir correctamente).
    5. fork() de nuevo y tener el padre de salida.
    6. Cambiar el trabajo actual dir con chdir().
    7. fclose() stdin, stdout y stderr y no escribir en ellos. El corrrect manera es redirigir esos a /dev/null o un archivo, pero no pude encontrar una manera de hacerlo en PHP. Es posible que al iniciar el demonio de redireccionar el uso de la shell (usted tendrá que encontrar por ti mismo cómo hacerlo, no sé :).
    8. Hacer su trabajo!

    También, ya que se están usando PHP, tenga cuidado de referencias cíclicas, ya que el PHP recolector de basura, antes de PHP 5.3, no tiene manera de recoger las referencias y el proceso de pérdida de memoria, hasta que finalmente se bloquea.

    Gracias por la info. Parece libslack del demonio programa bastante hace todo el trabajo de preparación, como usted ha mencionado. Yo creo que por ahora me quedo con ella hasta encontrar otras buenas alternativas.
    Encontré este post, se espera que el código de copy&paste en un viejo de mierda aplicación que no se puede cerrar stdin etc., estaba decepcionado. :p
    Por qué (5) fork() de nuevo?
    Sí ¿por qué de nuevo?
    Funcionó para mí – gran trabajo!

    OriginalEl autor Emil Ivanov

  4. 35

    Con nuevos systemd puede crear un servicio (en rhel basado en linux).

    Debe crear un archivo o una enlace simbólico en /etc/systemd/system/, por ejemplo. myphpdaemon.el servicio y el lugar de un contenido como este, myphpdaemon será el nombre del servicio:

    [Unit]
    Description=My PHP Daemon Service
    #May your script needs mysql or other services to run, eg. mysql memcached
    Requires=mysqld.service memcached.service 
    After=mysqld.service memcached.service
    
    [Service]
    User=root
    Type=simple
    TimeoutSec=0
    PIDFile=/var/run/myphpdaemon.pid
    ExecStart=/usr/bin/php -f /srv/www/myphpdaemon.php arg1 arg2> /dev/null 2>/dev/null
    #ExecStop=/bin/kill -HUP $MAINPID #It's the default you can change whats happens on stop command
    #ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    
    Restart=on-failure
    RestartSec=42s
    
    StandardOutput=null #If you don't want to make toms of logs you can set it null if you sent a file or some other options it will send all php output to this one.
    StandardError=/var/log/myphpdaemon.log
    [Install]
    WantedBy=default.target

    Usted será capaz de comenzar, obtenga el estado, reiniciar y detener a los servicios utilizando el comando

    systemctl <start|status|restart|stop|enable> myphpdaemon

    El script PHP debe tener una especie de «bucle» para que continúe la ejecución.

    <?php
    gc_enable();//
    while (!connection_aborted() || PHP_SAPI == "cli") {
    
      //Code Logic
    
      //sleep and usleep could be useful
        if (PHP_SAPI == "cli") {
            if (rand(5, 100) % 5 == 0) {
                gc_collect_cycles(); //Forces collection of any existing garbage cycles
            }
        }
    }

    De trabajo ejemplo:

    [Unit]
    Description=PHP APP Sync Service
    Requires=mysqld.service memcached.service
    After=mysqld.service memcached.service
    
    [Service]
    User=root
    Type=simple
    TimeoutSec=0
    PIDFile=/var/run/php_app_sync.pid
    ExecStart=/bin/sh -c '/usr/bin/php -f /var/www/app/private/server/cron/app_sync.php  2>&1 > /var/log/app_sync.log'
    KillMode=mixed
    
    Restart=on-failure
    RestartSec=42s
    
    [Install]
    WantedBy=default.target

    Si tu PHP debe ser ejecutada una vez en un ciclo (como un diggest) usted debe utilizar un shell de bash script para ser invocada en systemd servicio de archivo en lugar de PHP directamente, por ejemplo:

    #!/usr/bin/env bash
    script_path="/app/services/"
    
    while [ : ]
    do
    #    clear
        php -f "$script_path"${1}".php" fixedparameter ${2}  > /dev/null 2>/dev/null
        sleep 1
    done

    Si elige esta opción, usted debe cambiar el KillMode a mixed a los procesos, bash(principal) y php(niño) ser asesinado.

    ExecStart=/app/phpservice/runner.sh phpfile parameter  > /dev/null 2>/dev/null
    KillMode=process

    Nota: Cada vez que cambie su «myphpdaemon.servicio» debe
    ejecutar «systemctl demonio-reload’, pero no se preocupe si no lo hacen, será
    se le pedirá cuando es necesario.

    Subestimado respuesta. Tienes mi +1.
    Impresionante. Deseamos de corazón las respuestas también, porque esto no debe ser enterrado en esta página.
    Usted debe comprobar systemctl status <your_service_name> -l de salida, se le dará una pista de lo que está sucediendo.
    El MySQL, Memcached y fue una demostración de cómo utilizar las dependencias de los servicios no es necesario.
    Debe consultar cualquiera de los servicios que su PHP del servidor depende, para evitar un fracaso, pero no es necesario.

    OriginalEl autor LeonanCarvalho

  5. 23

    Puedo ejecutar un gran número de PHP demonios.

    Estoy de acuerdo con usted en que PHP no es la mejor (o incluso un buen idioma para hacer esto, pero los demonios de compartir el código con el web-frente a los componentes por lo general es una buena solución para nosotros.

    Utilizamos daemontools para esto. Es inteligente, limpia y fiable. De hecho, la utilizamos para la ejecución de todos nuestros demonios.

    Usted puede comprobar esto en http://cr.yp.to/daemontools.html.

    EDIT: UNA breve lista de características.

    • Inicia automáticamente el demonio en el reinicio
    • Reiniciar automáticamente dameon en caso de error
    • Se maneja la tala para usted, incluyendo el giro y la poda de
    • Interfaz de administración de: ‘svc’ y ‘svstat’
    • UNIX amable (no es un plus para todos, tal vez)
    También instalable desde los repositorios, por ejemplo, en apt!

    OriginalEl autor Phil Wallach

  6. 14

    Puede

    1. Uso nohup como Henrik sugerido.
    2. Uso screen y ejecutar su programa de PHP como un proceso regular en el interior. Esto le da más control que el uso de nohup.
    3. Utilizar un daemoniser como http://supervisord.org/ (está escrito en Python, pero puede daemonise cualquier programa de línea de comando y darle un control remoto para manejar).
    4. Escribir su propia daemonise contenedor como Emil sugerido, pero que es una exageración de la OMI.

    Me gustaría recomendar el método más simple (pantalla en mi opinión) y, a continuación, si desea más características o funcionalidad, pasar a métodos más complejos.

    Podrías similar supervisord config?

    OriginalEl autor Noufal Ibrahim

  7. 11

    Hay más de un camino para resolver este problema.

    No sé los detalles, pero tal vez hay otra forma de activar el proceso de PHP. Por ejemplo, si usted necesita el código a ejecutar en función de los eventos en una base de datos SQL usted puede configurar un gatillo para ejecutar la secuencia de comandos. Esto es muy fácil de hacer en virtud de PostgreSQL: http://www.postgresql.org/docs/current/static/external-pl.html .

    Sinceramente creo que su mejor apuesta es crear un Damon proceso mediante nohup. nohup permite que el comando a seguir para ejecutar incluso después de que el usuario ha cerrado la sesión:

    nohup php myscript.php &

    Sin embargo, hay un problema muy serio. Como usted dijo PHP del administrador de memoria es completa basura, fue construido con la suposición de que una secuencia de comandos sólo está en ejecución por un par de segundos y luego existe. El script PHP se comienzan a utilizar los GIGABYTES de memoria después de sólo un par de días. TAMBIÉN se DEBE crear un script cron que se ejecuta cada 12 o tal vez las 24 horas de la mata y re-genera el script php como este:

    killall -3 php
    nohup php myscript.php &

    Pero ¿y si el guión fue en el medio de un trabajo? Bien matar a -3 es una interrupción de la misma como hacer un ctrl+c en la CLI. El script php puede tomar este interrumpir y salir correctamente usando el PHP pcntl biblioteca: http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

    Aquí está un ejemplo:

    function clean_up() {
      GLOBAL $lock;
      mysql_close();
      fclose($lock)
      exit();
    }
    pcntl_signal(SIGINT, 'clean_up');

    La idea detrás de la $lock es que el script de PHP puede abrir un archivo con fopen(«archivo»,»w»);. Sólo un proceso puede tener un bloqueo de escritura en un archivo, de modo que esto puede asegurarse de que sólo una copia de su script PHP se está ejecutando.

    Buena Suerte!

    OriginalEl autor rook

  8. 6

    Retirar https://github.com/shaneharter/PHP-Daemon

    Este es un objeto-orientado al demonio de la biblioteca. Se ha incorporado en el soporte para cosas como la tala y la recuperación de errores, y tiene soporte para la creación de fondo de los trabajadores.

    OriginalEl autor Shane H

  9. 3

    Recientemente he tenido una necesidad de una cruz de solución de plataforma (Windows, Mac, y Linux) para el problema de la ejecución de scripts PHP como demonios. He resuelto el problema escribiendo mi propio C++ basado en la solución y hacer binarios:

    https://github.com/cubiclesoft/service-manager/

    Soporte completo para Linux (a través de sysvinit), pero también servicios de Windows y Mac OSX launchd.

    Si usted necesidad justa de Linux, después de un par de las otras soluciones que aquí se presenta funcionan bastante bien y, dependiendo del sabor. También hay Advenedizo y systemd estos días, ahora se cae a sysvinit secuencias de comandos. Pero en la mitad del punto de uso de PHP es que es multiplataforma en la naturaleza, así que el código escrito en el lenguaje tiene una muy buena oportunidad de trabajo en todas partes. Deficiencias comienzan a aparecer cuando ciertos externo nativos del sistema operativo a nivel de los aspectos entrar en el cuadro, tales como los servicios del sistema, pero tendrás ese problema con la mayoría de los lenguajes de secuencias de comandos.

    Tratando de atrapar a señales como alguien de aquí se sugiere en PHP userland no es una buena idea. Lea la documentación en pcntl_signal() cuidadosamente y usted aprenderá rápidamente que PHP maneja las señales que utilizan algunas bastante desagradables métodos (en concreto, ‘ticks’) que masticar un montón de ciclos para algo rara vez visto por procesos (por ejemplo, señales). Manejo de señales en PHP es también apenas disponible en las plataformas POSIX y apoyo difiere en función de la versión de PHP. Inicialmente suena como una solución digna pero se queda bastante corto de ser verdaderamente útil.

    PHP también ha ido mejorando acerca de los problemas de pérdida de memoria a medida que avanza el tiempo. Usted todavía tiene que tener cuidado (el DOM XML parser tiende a la fuga, todavía), pero rara vez veo procesos fuera de control en estos días y el PHP bug tracker es bastante tranquilo en comparación a los días de antaño.

    OriginalEl autor CubicleSoft

  10. 1

    Como otros ya han mencionado, ejecutar PHP como un demonio es bastante fácil, y se puede hacer con una sola línea de comando. Pero el verdadero problema es mantenerlo en funcionamiento y gestión. He tenido el mismo problema hace bastante tiempo y aunque hay un montón de soluciones ya disponibles, la mayoría de ellos tienen un montón de dependencias o son difíciles de usar y no es adecuado para usos básicos. Escribí un script de shell que puede administrar cualquier proceso/aplicación, incluyendo PHP cli secuencias de comandos. Se puede definir como un cronjob para iniciar la aplicación y contendrá la aplicación y gestión. Si se ejecuta de nuevo, por ejemplo a través de la misma cronjob, es comprobar si la aplicación se está ejecutando o no, si lo hace, entonces simplemente se sale y deja a su instancia anterior continuar la gestión de la aplicación.

    He subido a github, siéntase libre de usar : https://github.com/sinasalek/EasyDeamonizer

    EasyDeamonizer

    Simplemente vigila su aplicación (inicio, reinicio, registro, monitor, etc). un script genérico para asegurarse de que su appliation sigue funcionando correctamente. A propósito se utiliza el nombre de proceso instread de pid/archivo de bloqueo para evitar que todos sus efectos secundarios y mantener la secuencia de comandos como simple y como stirghforward como sea posible, por lo que siempre funciona incluso cuando EasyDaemonizer sí se reinicia.
    Características

    • Inicia la aplicación y, opcionalmente, una demora personalizada para cada inicio
    • Se asegura de que sólo una instancia ejecuta
    • Supervisa el uso de la CPU y se reinicia la aplicación automáticamente cuando se alcanza el umbral definido
    • Configuración EasyDeamonizer a ejecutar a través de cron para que se ejecute de nuevo si se detiene por cualquier razón
    • Registros de su actividad

    OriginalEl autor Sina Salek

  11. 0

    puede comprobar pm2 aquí es, http://pm2.keymetrics.io/

    crear un archivo ssh, tales como worker.sh poner en el script php que se va a tratar.

    worker.sh

    php /path/myscript.php

    demonio inicio

    pm2 start worker.sh

    Saludos, eso es todo.

    OriginalEl autor Serkan Koch

  12. 0

    La ampliación de Emil Ivaov respuesta, puede hacer lo siguiente para cerrar STDIN, STDOUT Y STDERROR en php

    if (!fclose(STDIN)) {
        exit("Could not close STDIN");
    }
    
    if (!fclose(STDOUT)) {
        exit("Could not close STDOUT");
    }
    
    if (!fclose(STDERR)) {
        exit("Could not close STDERR");
    }
    
    $STDIN = fopen('/dev/null', 'r');
    $STDOUT = fopen('/dev/null', 'w');
    $STDERR = fopen('/var/log/our_error.log', 'wb');

    Básicamente de cerrar los flujos estándar, por lo que PHP no tiene lugar para escribir. El siguiente fopen llamadas configurar la e /s estándar para /dev/null.

    He leído este libro de Rob Aley – PHP más allá de la web

    OriginalEl autor Raheel Khan

Dejar respuesta

Please enter your comment!
Please enter your name here