12
votes

Comment garder un script PHP persistant en cours d'exécution?

J'ai un script PHP qui écoute pour les demandes de socket entrants, etc. J'ai besoin que ce script soit en cours d'exécution (il fonctionne dans une boucle infinie) sur le serveur.

Comment puis-je initier et gérer ce processus? J'ai essayé de commencer à commencer par SSH / Putty, mais dès que la connexion SSH est terminée, le script meurt.


4 commentaires

Dupliqué possible de Exécuter un script php en tant que processus de démon


Beaucoup de bonnes informations: Stackoverflow.com/search?q=php+Daemon


Cochez l'utilitaire "Écran" aussi pour détacher votre session de ssh (et reconnectez-le plus tard si vous le souhaitez)


Si vous avez un script PHP à long terme en tant que solution, vous avez un problème académique, un jeu de circonstances étrange, ou sur une route pour une meilleure solution lorsque vous vous dirigez la tête. Retour sur sujet, à un niveau de résumé, vous voulez que quelque chose gère votre processus PHP pour le redémarrer lorsque matrienne, devienne OOM, la lune se déplace d'alignement, etc. (ce manager ne devait pas être un autre script PHP) :-)


7 Réponses :


2
votes

Exécutez le script en arrière-plan via SSH comme expliqué ici: Obtenir SSH pour exécuter une commande en arrière-plan sur la machine cible

Je suggérerais alors que vous ayez un moyen de surveiller si le script est toujours en marche. Vous avez mentionné votre script écoute sur un port, vous pouvez peut-être écrire un script qui vérifie de temps en temps pour voir si le port est toujours ouvert.

Une autre option consiste à surveiller l'ID de processus. Lorsque le script est exécuté pour la première fois, vous pouvez saisir l'ID de processus à l'aide de la fonction getmyPID et stockez-la dans un fichier. Vous pouvez ensuite vérifier périodiquement s'il est toujours en cours d'exécution à l'aide de PS -P 1234 .

Une autre solution: Comment vérifier si un PHP Le script est toujours en cours d'exécution


0 commentaires

-3
votes

Pourquoi pas une boucle? do {/ * votre code * /} tandis que $ quelque chose == 0;

Puis, lorsque quelque chose arrive à déclencher la halte du script, définissez quelque chose à une valeur autre que 0.


1 commentaires

Je crois que $ quelque chose = 0; est une affectation et non un test vrai / faux ..;) Mais je suis sûr que vous saviez que. Une autre chose est que si vous basez sur une boucle Scénario, à moins que votre logique (script / fonction ... peu importe) bloque quelque chose - toutes les boucles tandis que «inactif» ne seront pas du tout inactif, mais contraindre le processeur de serveur gaspillant des ressources précieuses sur un serveur à l'échelle du serveur ou au moins virtuel. portée.



0
votes

Vous pouvez exécuter la ligne de commande informatique. Vous devrez ajouter un modificateur "Exécution en arrière-plan" afin de le faire pour que le système n'attend pas que le script soit terminé. Fondamentalement, vous mettez un & à la fin de votre ligne de commande.

Une chose que vous devriez définitivement faire est de créer un script Ini Shell qui exécute le script PHP sur le démarrage en cas de redémarrage de tous les redémarrages.


0 commentaires

7
votes
ps aux | grep myscript.php

3 commentaires

Vous pouvez le remplacer par set_time_limit .


Ce n'est pas vraiment stable puisque le script peut mourir d'erreur ou de future de mémoire et ne pas recommencer.


C'est un travail pour moi, mais après le redémarrage du serveur, je dois définir manuellement est-il un moyen de définir après le démarrage automatique du script de serveur?



2
votes

Vous pouvez utiliser le navigateur si vous utilisez IGNORE_USER_ABORT () et set_time_limit ()


1 commentaires

DOC fait référence à ignorer_user_abort () à la ligne de commande au lieu du navigateur



6
votes

Nous avons récemment eu un besoin similaire. Nous exécutons un serveur Ubuntu 14.04 LTS, créé un processus UPStart pour démarrer le processus au démarrage et redémarrer si elle quitte pour une raison quelconque.

Il est très bien fonctionné pour nous, y compris le redémarrage automatique; Notre processus de longue date perds éventuellement la connexion MySQL. Le script gère l'exception et les sorties, avant que le processus UPStart redémarre automatiquement le processus. Nous avons également ajouté un script cron pour surveiller le processus, juste au cas où il existe une plus grande erreur que UPStart abandonne d'essayer de redémarrer; Nous avons un sans danger d'échec dans l'événement qu'un redémarrage simple ne corrige pas l'erreur antérieure.


4 commentaires

Ce serait mon premier choix aussi.


Bonjour @kdewiske Pouvez-vous fournir un échantillon de code ou quelque chose qui peut aider les peuples à rechercher le même problème. Je suis l'un d'eux :)


@Pankajjha - Je viens de rechercher "Ubuntu UpStart exemple" et j'ai un bon guide de Digitalial Ocean. digitalOcean.com/community/tatudials/.../a>. Il aborde beaucoup plus que ce que mon exemple pourrait fournir. Le script PHP qu'il exécute est simplement quelque chose qui pourrait être appelé via CLI - contenant simplement un code dans une boucle de temps.


@Kduwiske apprécie vraiment votre aide, merci, et c'est exactement ce dont j'avais besoin. J'ai aussi cherché quelques autres tutoriels comme celui-ci et le meilleur que j'ai trouvé était Ce lien J'espère que cela aidera quelqu'un, comme cela m'a aidé.



3
votes

Si la fiabilité à long terme est le but, Supervisord est parfait pour cela!

Je suis tombé sur elle via HTTPS: // Lornajane.net/postss/2012/watchtover-long-Running-Processes-with-Supervisord

EDIT: Le but de cet outil est de résoudre le problème indiqué. L'objectif indiqué est de conserver le processus de course à long terme. Un commentaire a souligné (valablement) que la solution actuellement acceptée ne sera pas fiable, car le script s'effondrera probablement, etc. Donc, la solution consiste donc à utiliser un outil pour "initier et gérer ce processus", qui le garde également en vie. Cet outil fait exactement que: il commence le processus en arrière-plan et le maintient en cours d'exécution.


0 commentaires