Saltar al contenido

Ejecute el script php como proceso demonio

Solución:

Puede iniciar su script php desde la línea de comando (es decir, bash) usando

nohup php myscript.php &

los & pone su proceso en segundo plano.

Editar:
Sí, hay algunos inconvenientes, pero ¿no es posible controlarlos? Eso está mal.
Un simple kill processid lo detendrá. Y sigue siendo la mejor y más sencilla solución.

Otra opción es utilizar Upstart. Fue desarrollado originalmente para Ubuntu (y viene empaquetado con él de forma predeterminada), pero está destinado a ser adecuado para todas las distribuciones de Linux.

Este enfoque es similar a Supervisord y daemontools, ya que inicia automáticamente el daemon al arrancar el sistema y reaparece al finalizar el script.

Cómo configurarlo:

Cree un nuevo archivo de secuencia de comandos en /etc/init/myphpworker.conf. Aquí hay 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

Iniciar y detener su demonio:

sudo service myphpworker start
sudo service myphpworker stop

Compruebe si su demonio se está ejecutando:

sudo service myphpworker status

Gracias

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

Con new systemd puede crear un servicio.

Debe crear un archivo o un enlace simbólico en /etc/systemd/system/, p.ej. myphpdaemon.service y colocar 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

Podrá iniciar, obtener el estado, reiniciar y detener los servicios usando el comando

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

El script PHP debe tener una especie de “bucle” para continuar ejecutándose.

<?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
        }
    }
}

Ejemplo de trabajo:

[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 su rutina PHP debe ejecutarse una vez en un ciclo (como un diggest), puede usar un script de shell o bash para ser invocado en el archivo de servicio systemd 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, debe cambiar KillMode a mixed a los procesos, bash (principal) y PHP (hijo) sean eliminados.

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

This method also is effective if you're facing a memory leak.

Nota: Cada vez que cambie su “myphpdaemon.service” debe ejecutar `systemctl daemon-reload ‘, pero no se preocupe si no lo hace, se le avisará cuando sea necesario.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *