Avec new systemd, vous pouvez créer un service.
Vous devez créer un fichier ou un lien symbolique dans /etc/systemd/system/
, par exemple. myphpdaemon.service et placez le 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 le statut, redémarrer et arrêter les services à l'aide de la commande
systemctl <start|status|restart|stop|enable> myphpdaemon
Le script PHP doit avoir une sorte de "boucle" 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 diggest), vous pouvez utiliser un script shell ou bash pour être appelé 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 devriez changer le KillMode en mixed
processus, bash (main) et PHP (enfant) être 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.