GNU/Linux >> Tutoriales Linux >  >> Linux

Ejecute el script php como proceso daemon

Otra opción es usar Upstart. Originalmente fue desarrollado para Ubuntu (y viene empaquetado con él de forma predeterminada), pero está diseñado para ser adecuado para todas las distribuciones de Linux.

Este enfoque es similar a Supervisord y daemontools, ya que inicia automáticamente el demonio 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 daemon:

sudo service myphpworker start
sudo service myphpworker stop

Compruebe si su demonio se está ejecutando:

sudo service myphpworker status

Gracias

Muchas gracias a Kevin van Zonneveld, de donde aprendí esta técnica.


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

nohup php myscript.php &

el & 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.


Con new systemd puedes crear un servicio.

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

Puede usar el servidor nativo PHP usando php -S 127.0.0.1:<port> o ejecutarlo como un script. Al usar un script PHP, debe tener una especie de "bucle eterno" 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 de PHP debe ejecutarse una vez en un ciclo (como un resumen), puede usar un script de shell o bash para invocarlo 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 estas opciones, debe cambiar KillMode a mixed a los procesos, bash(principal) y PHP(secundario) serán 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.


Linux
  1. Servicio del sistema operativo Linux 'scsi_reserve'

  2. Cómo probar un script PHP

  3. Ejecutar proceso con salida en tiempo real en PHP

  4. ¿Cómo hacer que el script de Python se ejecute como servicio?

  5. Ejecutar script bash como demonio

Cómo ejecutar un script de Python en PHP

Cómo ejecutar Shell Script como servicio SystemD en Linux

Cómo ejecutar un script Bash

Crear un demonio en Linux

Linux:proceso en un servicio

¿Cómo ejecutar sbt como demonio?