165 votes

Exécutez le script php comme processus démon

J'ai besoin d'exécuter un script php en tant que démon (attendre les instructions et faire des trucs). cron job va pas le faire pour moi parce que des mesures doivent être prises dès que l'instruction arrive. Je sais que PHP n'est pas vraiment la meilleure option pour daemon processus en raison des problèmes de gestion mémoire, mais pour diverses raisons je dois utiliser le PHP dans ce cas. Je suis tombé sur un outil par libslack appelé Démon (http://libslack.org/daemon) il semble que pour m'aider à gérer le processus de démons, mais il n'y a pas eu de mises à jour dans les 5 dernières années, donc je me demande si vous connaissez des alternatives adapté à mon cas. Toute information doit être vraiment apprécié.

175voto

Henrik P. Hessel Points 22046

Vous pourriez commencer votre script php à partir de la ligne de commande (c'est-à-dire bash) à l’aide de

``

le `` met vos processus en arrière-plan.

Edit :
Oui, il y a quelques inconvénients, mais pas possible de contrôle ? C’est tout simplement faux.
Un simple `` l’arrêtera. Et c’est toujours la solution la meilleure et plus simple.

172voto

Jonathan Points 2381

Une autre option est l'utilisation d' Arriviste. Il a été développé à l'origine pour Ubuntu (et vient emballé avec elle par défaut), mais est destiné à être adapté pour toutes les distributions Linux.

Cette approche est similaire à Supervisord et daemontools, en ce qu'il démarre automatiquement le démon sur le démarrage du système et réapparaît sur la fin de script.

Comment le configurer:

Créer 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émarrage et arrêt de votre daemon:

sudo service myphpworker start
sudo service myphpworker stop

Vérifiez si le démon est en cours d'exécution:

sudo service myphpworker status

Merci

Un grand merci à Kevin van Zonneveld, où j'ai appris cette technique.

50voto

Emil Ivanov Points 18594

Si vous pouvez vous récupérer une copie de l' Avancée de la Programmation dans l'Environnement UNIX. L'ensemble du chapitre 13 est consacré au démon de la programmation. Les exemples sont en C, mais avec toutes les fonctions dont vous avez besoin sont des wrappers en PHP (en gros le pcntl et posix extensions).

En quelques mots - la rédaction d'un démon (ce qui est possible uniquement sur *nix en fonction de l'OS-es - Windows utilise les services) comme ceci:

  1. Appelez umask(0) pour éviter les problèmes d'autorisation.
  2. fork() et ont le parent de sortie.
  3. Appelez setsid().
  4. Le programme d'installation de traitement du signal de l' SIGHUP (en général, cela est ignoré ou utilisé pour le signal du démon pour recharger sa configuration) et SIGTERM (pour dire le processus de fermer correctement).
  5. fork() nouveau et le parent de sortie.
  6. Changer le travail en cours dir avec chdir().
  7. fclose() stdin, stdout et stderr et de ne pas écrire sur eux. Le corrrect moyen est de rediriger ces soit /dev/null ou un fichier, mais je ne pouvais pas trouver un moyen de le faire en PHP. Il est possible, lorsque vous lancez le démon de les rediriger à l'aide de l'interpréteur de commandes (vous devrez trouver vous-même la façon de le faire, je ne sais pas :).
  8. Faire votre travail!

Aussi, puisque vous êtes à l'aide de PHP, être prudent pour cycliques références, depuis le PHP garbage collector, avant de PHP 5.3, n'a aucun moyen de recueillir les références et le processus de fuite de mémoire, jusqu'à ce qu'il finit par se bloque.

26voto

Phil Wallach Points 2478

- Je exécuter un grand nombre de PHP démons.

Je suis d'accord avec vous que PHP n'est pas le meilleur (ou même un bon langage pour le faire, mais les démons de partager le code avec le web face à des composants de l'ensemble de sorte que c'est une bonne solution pour nous.

Nous utilisons daemontools pour cela. Il est intelligent, propre et fiable. En fait, nous utilisons pour l'exécution de l'ensemble de nos démons.

Vous pouvez le vérifier sur http://cr.yp.to/daemontools.html.

EDIT: UNE liste rapide des fonctionnalités.

  • Démarre automatiquement le démon sur redémarrer
  • Redémarrer automatiquement dameon en cas d'échec
  • La journalisation est fait pour vous, y compris de survol et d'élagage
  • Interface de gestion: 'svc' et 'svstat'
  • UNIX amical (pas un plus pour tout le monde, peut-être)

15voto

Noufal Ibrahim Points 32200

Vous pouvez

  1. Utiliser nohup comme Henrik suggéré.
  2. Utiliser screen et exécuter votre programme PHP comme un processus régulier à l'intérieur. Cela vous donne plus de contrôle que d'utiliser nohup.
  3. Utiliser un daemoniser comme http://supervisord.org/ (il est écrit en Python, mais peut daemonise tout programme en ligne de commande, et vous donne un contrôle à distance pour les gérer).
  4. Écrivez votre propre daemonise wrapper, comme Emil suggéré, mais il est exagéré de l'OMI.

Je vous recommande la méthode la plus simple (écran à mon avis) et puis si vous voulez plus de fonctionnalités ou de la fonctionnalité, de passer à des méthodes plus complexes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X