GNU/Linux >> Tutoriels Linux >  >> Linux

Exécuter le script php en tant que processus démon

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.


Linux
  1. Service du système d'exploitation Linux "scsi_reserve"

  2. Comment tester un script PHP

  3. Meilleure pratique pour exécuter le service Linux en tant qu'utilisateur différent

  4. Exécuter le processus avec une sortie en temps réel en PHP

  5. Script Ruby en tant que service

Comment exécuter un script Python en PHP

Comment exécuter un script Shell en tant que service SystemD sous Linux

Comment exécuter un script bash

Exécution du script PHP à partir de la ligne de commande en tant que processus d'arrière-plan

Comment faire fonctionner le script Python en tant que service ?

Exécuter le script bash en tant que démon