Redémarrer automatiquement le Script PHP à la Sortie
Est-il une manière que je peux redémarrer automatiquement un script PHP à chaque fois qu'il sort, indépendamment du fait qu'il a été quitté correctement ou a été résilié en raison d'une erreur, ou au maximum l'utilisation de la mémoire, etc.?
- le mettre dans une infinie boucle do while dans un script shell?
- Il pourrait fonctionner, mais je dois avoir 8 threads d'un script qui s'exécute dans le même temps, et tout le redémarrage d'eux-mêmes si ils sortent. Alors j'aurais besoin de 8 script shell en cours d'exécution, droit? Il ne semble pas très efficace.
- Script PHP peut être exécutée que si elle est appelée. Donc, en utilisant php seulement il n'y a aucun moyen que je Pense. Mais un processus d'arrière-plan peuvent le faire. Si vous pouvez écrire un tel processus d'arrière-plan qui peut vérifier les processus en cours d'exécution & faire les démarches nécessaires, vous pouvez le faire.
- J'ai trouvé supervisord très utile à cette fin. Vous pourriez mettre en œuvre de tels processus de supervision/contrôle/redémarrage/démon comportement en pur PHP, mais pourquoi ne pas utiliser quelque chose qui existe déjà?
- php les démons ne sont jamais très fiable. mais j'ai utilisé une tâche cron pour vérifier toutes les 5 minutes et redémarrer si nécessaire. Si vous pouvez vivre avec 1 minute d'arrêt, essayez de cron.
- Je peux vivre avec ça, mais comment est-ce qu'il va savoir qu'il y a seulement 7 occurrences d'un même script php en cours d'exécution au lieu de 8?
- windows ou *nix ? sur nix, vous pouvez utiliser le ps
- supervisord prend spécifiquement en charge de garder un certain nombre d'instances et de l'exécution... 🙂
- Je ne comprends pas le supervisord de la documentation. Pourriez-vous s'il vous plaît expliquez-moi comment le faire fonctionner plusieurs instances de la même script PHP et de redémarrage automatique si la sortie? Aussi, j'en ai besoin pour décaler le lancement initial de chacune des 8 cas par 1 minute entre chaque.
Vous devez vous connecter pour publier un commentaire.
Un Script PHP peut aussi redémarrer de lui-même avec PCNTL.
Avertissement: le but de cet exercice est que pour prouver que PHP est parfaitement capable de redémarrer de lui-même et pour répondre à la question:
Il est donc hors de notre portée d'aller dans les détails sur les processus unix donc, je vous suggère de commencer avec la PCNTL livre ou reportez-vous à php-pcntl pour plus de détails.
Dans les exemples que nous supposons qu'il s'agit d'une CLI PHP script lancé dans un *nix environnement à partir d'un terminal avec un demi-décent shell à l'aide de la commande:
Nous passer un redémarrage attribut de nombre comme indicateur que le processus a été redémarré.
Puis-je redémarrer automatiquement un Script PHP?
Oui je peux!
Indépendamment de savoir si elle a été terminée correctement?
Oui je peux redémarrer en cas de cessation!
Ou résilié en raison d'une erreur?
Idem!
Mais vous savez que je suis allez vouloir plus que cela?
Certainement! Je peux redémarrer sur de tuer, hub, même Ctrl-C!
Comment puis-je mettre fin à maintenant?
Je ne veux pas voir toutes ces erreurs, je peux redémarrer sur ceux qui sont trop?
Pas de problème, je peux le gérer trop d'erreurs!
Bien que cela semble être fonctionne bien au premier coup d'œil, parce que pcntl_exec s'exécute dans le même processus, nous ne remarquons pas que les choses sont terriblement mal. Si vous vouliez lancer un nouveau processus et de laisser l'ancien mourir à la place qui est une parfaite alternative viable voir le prochain post, vous remarquerez 2 processus sont lancés chaque itération, parce que nous déclencher une notice PHP et une ERREUR due à une surveillance commun. Ce qui bien sûr peut être facilement corrigé en nous assurant de die() ou exit() après l'appel à pcntl_exec dans le gestionnaire d'erreur, sinon PHP suppose la tolérance ont été acceptés et continue.
Le point que je suis en train de faire, c'est que même si vous êtes en mesure de relancer un script qui a échoué, ce n'est pas une excuse pour permettre à de code cassé. Bien qu'il existe peut-être viable en cas d'utilisation de cette pratique, je suis en total désaccord que le redémarrage en cas d'échec doit être utilisé comme une solution pour les scripts des échecs dus à des erreurs! Comme nous pouvons le voir à partir de ces exemples, il n'y a aucun moyen de savoir exactement là où il a échoué donc nous ne pouvons pas être sûr de savoir où il va commencer de nouveau. Va pour le "quick fix", solution qui pouvait sembler être fonctionne bien peut avoir plus de problèmes maintenant, alors avant de.
Je préféreraient voir le défaut abordées avec une bonne unité de tests qui va aider à débusquer le coupable, afin que nous puissions corriger le problème. Si PHP est à court de mémoire, elle peut être évitée par l'utilisation prudente des ressources par la suppression de variables après utilisation. (btw. vous trouverez affectation de la valeur null est beaucoup plus rapide que d'utiliser unset pour le même résultat), je crains bien que, si la gauche en suspens, le redémarrage serait très certainement servir adapté ouvre la boîte de pandore que vous avez déjà.
Ici des dragons.
Utilisation avancée et pas pour les faibles de cœur.
Pour le lancement d'un processus distinct changer le restartMyself fonction:
Cela peut certainement être une aventure, à la poursuite des processus de redémarrage à l'abri de vos tuer si vous parvenez à les attraper dans le processus. =)
Vous assurer que le script a assez à faire de sorte que vous pouvez avoir assez de temps pour le tuer.
Essayer:
ou:
à insister pour que le séjour des morts-vivants morts. Ce n'est pas inactif référence que vous serait sage d'envisager des zombies et des orphelins, mais en fin de compte, même les plus difficiles des processus généralement encore besoin d'un parent afin de tuer la session d'environnement devraient voir leur repos.
Tous les standard exclusions s'appliquent, bonne chance! =)
En supposant que:
Certaines options viennent à l'esprit pour atteindre votre objectif [Unix/Linux basée sur des solutions]:
Utiliser un Script BASH, de sorte que le script PHP après avoir arrêté/terminé/interrompu peut être repris:
La Graisse Contrôleur d'exécution de gestionnaire, ce sont les principales caractéristiques que vous cherchez:
très similaire à CRON mais cette clé caractéristiques sont tout simplement ce que vous avez besoin
À l'aide d'un CRON, vous pouvez faire appel à votre script PHP à des intervalles, par exemple, une minute, puis avec ce code au tout début de vous script PHP, vous serez en mesure de contrôler le nombre de threads en cours d'exécution, la sortie de si 8 sont déjà en cours d'exécution:
de recherche pour les processus en cours d'exécution avec le même chemin d'accès du fichier en cours, et renvoie le nombre de processus. Alors, si de grand 7, sorties.
À l'aide de CRON
Pour compléter ow3n's réponse, PHP, script CLI est comme toute autre commande, et peut être facilement répété à l'infini
while
boucle. Il fonctionnera exactement la même que l'exécution de la commande en elle-même, mais se déroulera à nouveau quand elle se termine. Il suffit de frapper Ctrl+C lorsque vous souhaitez terminer la boucle.Edit: Si votre processus de les captures des signaux (ce qui devrait, si c'est un 12 facteur app), vous aurez besoin de maintenir Ctrl+C au lieu de tout simplement en appuyant sur. Une presse serait pris par le processus (ce qui devrait mettre fin lui-même), mais le
while
la boucle recommencer le processus à nouveau (ce qui est utile si vous voulez juste pour relancer le processus au lieu de fin). Si votre démarche n'est pas la capture de signaux, puis Ctrl+C va tuer à la fois le processus et lewhile
boucle.Ici est la façon la plus simple de le faire, sans supplément de sortie:
while :; do [command]; done
while :; do echo "test" && sleep 1; done
while :; do php myscript.php; done
Cela dit, je suis un peu inquiet sur les conséquences dans vos commentaires:
À propos des threads:
Sur les processus:
Mise à jour: Les conteneurs faire de running & la gestion d'une flotte de processus encore plus facile.
Pour redémarrer un script chaque fois il s'arrête, vous pouvez envelopper user1179181s'script dans une boucle.
Juste mon 5 cents. PCNTL redémarrer avec une gestion d'erreur personnalisée..
Notice: Undefined index: _ in
après quelques redémarrages