Une autre option consiste à utiliser Upstart. Il a été développé à l'origine pour Ubuntu (et est fourni avec celui-ci par défaut), mais il est destiné à convenir à toutes les distributions Linux.
Cette approche est similaire à Supervisord et daemontools, en ce sens qu'elle démarre automatiquement le démon au démarrage du système et réapparaît à la fin du script.
Comment le configurer :
Créez un nouveau fichier de script à /etc/init/myphpworker.conf
. Voici un exemple :
# 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
Démarrer et arrêter votre démon :
sudo service myphpworker start
sudo service myphpworker stop
Vérifiez si votre démon est en cours d'exécution :
sudo service myphpworker status
Merci
Un grand merci à Kevin van Zonneveld, d'où j'ai appris cette technique.
Vous pouvez démarrer votre script php à partir de la ligne de commande (c'est-à-dire bash) en utilisant
nohup php myscript.php &
le &
place votre processus en arrière-plan.
Éditer:
Oui, il y a quelques inconvénients, mais pas possible de contrôler ? C'est tout simplement faux.
Un simple kill processid
va l'arrêter. Et c'est toujours la solution la meilleure et la plus simple.
Avec new systemd, vous pouvez créer un service.
Vous devez créer un fichier ou un lien symbolique en /etc/systemd/system/
, par exemple. myphpdaemon.service et placez un contenu comme celui-ci, myphpdaemon sera le nom du service :
[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
Vous pourrez démarrer, obtenir l'état, redémarrer et arrêter les services à l'aide de la commande
systemctl <start|status|restart|stop|enable> myphpdaemon
Vous pouvez utiliser le serveur natif PHP en utilisant php -S 127.0.0.1:<port>
ou exécutez-le en tant que script. En utilisant un script PHP, vous devriez avoir une sorte de "boucle éternelle" pour continuer à fonctionner.
<?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
}
}
}
Exemple de travail :
[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 votre routine PHP doit être exécutée une fois dans un cycle (comme un résumé), vous pouvez utiliser un script shell ou bash pour être invoqué dans le fichier de service systemd au lieu de PHP directement, par exemple :
#!/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 vous avez choisi ces options, vous devez changer le KillMode en mixed
aux processus, bash(main) et PHP(child) soient tués.
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.
Remarque :Chaque fois que vous modifiez votre "myphpdaemon.service", vous devez exécuter `systemctl daemon-reload', mais ne vous inquiétez pas si vous ne le faites pas, il sera alerté en cas de besoin.