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.