Quelle est la meilleure façon de garder un script PHP en cours d'exécution comme un démon?

StackOverflow https://stackoverflow.com/questions/38596

  •  09-06-2019
  •  | 
  •  

Question

Quelle est la meilleure façon de garder un script PHP en cours d'exécution comme un démon, et quelle est la meilleure façon de vérifier si les besoins de redémarrer.

J'ai quelques scripts qui en ont besoin pour fonctionner 24/7 et pour la plupart, je peux les exécuter à l'aide de nohup.Mais s'ils vont vers le bas, ce qui est le meilleur moyen de surveiller afin qu'il puisse être redémarré automatiquement?

Était-ce utile?

La solution

Si vous ne pouvez pas utiliser la (bonne) initialisation de la structure pour le faire (vous êtes en hébergement mutualisé, etc.), utiliser cron pour exécuter un script (il peut être écrit dans la langue que vous voulez), toutes les quelques minutes qui vérifie pour voir si elles sont en cours d'exécution, et redémarre si nécessaire.

Autres conseils

Nous gérons nos démons par la tuyauterie de la sortie de la poste.

php daemon.php | mail -s "daemon stopped" foo@example.org

De cette façon, quand/si le démon s'arrête, il va envoyer un mail, et nous en seront avisés de cette façon.

Il signifie encore redémarrage manuel des démons, bien sûr, mais nous allons le savoir tout de suite.Généralement, si les démons arrêté, cela signifie qu'il y a autre chose qui doit être pris en charge de toute façon, donc c'est généralement ok.

Rapide et sale cron pour redémarrer votre daemon:

* * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

Remplacez UTILISATEUR à l'utilisateur que le démon s'exécute et SCRIPTNAME avec le nom de votre script.Bâton de ce dans /etc/cron.d/restart_php_daemon.Il doit s'exécuter à chaque minute.Modifier le premier * pour */2 ou */5 pour exécuter moins fréquemment.

Mise à JOUR

Si vous mettez cela dans votre propre crontab:

Exécuter crontab -e et d'ajouter:

* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

La solution la plus élégante est phpdaemon ou reactPHP.

J'ai eu du succès avec un wget et d'envoyer le résultat vers /dev/null sur un serveur partagé.

Démon est un linux qui tourne en arrière-plan;apache et mysql sont des démons.Dans un environnement linux, nous pouvons exécuter un programme d'arrière-plan à l'aide de tâche cron, mais il a quelques limitations, et dans certains scénarios, il' s pas une bonne idée.Par exemple, à l'aide de tâche cron, nous ne pouvons pas contrôler si les courir a encore terminée.Donc, il est souvent plus commode d'exécuter un processus comme un démon.

// Daemonize
$pid = pcntl_fork(); // parent gets the child PID and child gets 0
if($pid){ // if pid is not 0
     // Only the parent will know the PID. Kids aren't self-aware
     // Parent says goodbye!
     print "Parent : " . getmypid() . " exiting\n";
     exit();
}
print "Child : " . getmypid() . "\n";

Le code ci-dessus est tiré de très bon article sur la façon de créer un démon en php.Vous pouvez lire ce au lien

J'utilise un PHP script pour lire à partir d'une base de données et envoyer des e-mails (en utilisant la POIRE Mail_Queue de la bibliothèque).Je l'exécuter à partir de l'intérieur d'un script bash et basé sur le résultat (à partir de "exit $statut;"), soit à l'arrêt, le sommeil les X secondes, ou de redémarrer immédiatement.(J'ai aussi mis une vérification de la charge moyenne/dormir dans le script PHP, pour éviter le stress sur le système de messagerie).

Si c'était pour une longue durée démon qui a dû être constamment en cours d'exécution, alors je suis d'accord, il ne serait probablement pas la meilleure chose pour exécuter cette (mais j'ai entendu parler de certains serveurs de socket qui n'a exécuter avec succès à long terme), cependant, PHP 5.3 ne l'ont maintenant aussi l'amélioration de la collecte des ordures, et si le script est bien écrit, assez pour ne pas quitter les imprévus, puis de la mémoire devrait être beaucoup moins de problème qu'avant.

Je suis d'accord que PHP n'est pas le meilleur outil pour ce faire, cependant, je peux comprendre pourquoi vous voulez utiliser PHP de sorte que vous pouvez réutiliser des composants de votre application, tels que l'accès à la base, et ainsi de suite.

J'ai eu un problème similaire et j'ai fini par le développement de La Graisse Contrôleur qui est un démon écrit en C qui peut exécuter des scripts PHP.Il peut aussi fonctionner comme un multithread démon, l'exécution de plusieurs instances d'un script en parallèle.

Il n'y a plus d'informations et des cas d'utilisation ici: http://www.4pmp.com/fatcontroller/

TBH, PHP n'est probablement pas le meilleur outil pour cela, pas vraiment ce qu'il a été conçu.J'ai entendu parler de fuites de mémoire et d'autres mauvaises choses qui se passe lorsque vous essayez ceci.Aussi garder à l'esprit PHP ne dispose que d'un nombre fini d'id de ressource (pour les descripteurs de fichiers, db connections ect) par l'exécution d'un script.

Être mieux d'utiliser quelque chose d'autre, peut-être que python ou perl, mais je n'ai pas de réelle expérience dans la rédaction de ces sortes d'applications, mais je sais que PHP n'est pas bon pour ce que vous essayez de faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top