Maison développement back-end tutoriel php Utiliser Supervisor pour gérer l'exécution d'une commande Symfony

Utiliser Supervisor pour gérer l'exécution d'une commande Symfony

Sep 07, 2024 am 06:34 AM

Introduction

Dans cet article, nous allons apprendre à utiliser superviseur pour gérer l'exécution d'une commande symfony. En gros, superviseur va nous permettre de :

  • Démarrer automatiquement la commande
  • Redémarrer automatiquement la commande
  • Spécifiez le nombre de processus que nous souhaitons que le superviseur démarre.

Le problème

Parfois, nous avons recours à la crontab Unix pour automatiser l'exécution des processus. Cela peut fonctionner la plupart du temps, mais il peut y avoir des situations où cela peut causer des problèmes.

Imaginons que nous ayons une table de base de données qui enregistre les notifications des utilisateurs. Le tableau stocke les informations suivantes :

  • utilisateur
  • texte
  • chaîne
  • statut (EN ATTENTE, ENVOYÉ)
  • créé à
  • mis à jourà

D'autre part, nous avons codé une commande dont l'exécution suit les étapes suivantes :

  • Interroge les dernières notifications en ATTENTE
  • Boucle les notifications interrogées et :
    • Envoie chacun à l'utilisateur correspondant.
    • Met à jour l'état de la notification de ATTENTE à ENVOYÉ

Nous avons défini cette commande dans la crontab Linux pour qu'elle s'exécute de temps en temps (1 minute, 2 minutes, etc.). Jusqu’ici tout va bien.

Imaginons maintenant que le processus actuel ait interrogé 500 notifications et qu'après en avoir envoyé 400, un nouveau processus démarre. Cela signifie que le nouveau processus interrogera les 100 notifications qui n'ont pas encore été mises à jour par le dernier processus ainsi que les nouvelles :

Using Supervisor to handle a Symfony Command execution

Cela peut entraîner l'envoi de ces 100 notifications deux fois puisque les deux processus les ont interrogées.

La solution

Comme solution, nous pouvons recourir à l'utilisation d'un superviseur. Il maintiendra notre processus en cours et le redémarrera si nécessaire. De cette façon, nous ne conservons qu’un seul processus et évitons les chevauchements. Analysons à quoi devrait ressembler la commande :

#[AsCommand(
    name: 'app:notification'
)]
class NotificationCommand extends Command
{
    private bool $forceFinish = false;

    protected function configure(): void
    {
        $this
            ->addOption('time-limit', null, InputOption::VALUE_OPTIONAL, 'Max time alive in seconds')
            ->addOption('time-between-calls', null, InputOption::VALUE_OPTIONAL, 'Time between every loop call')

        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $this->forceFinish = false;
        pcntl_signal(SIGTERM, [$this, 'signalHandler']);
        pcntl_signal(SIGINT, [$this, 'signalHandler']);

        $timeLimit = $input->getOption('time-limit');
        $timeBetweenCalls = $input->getOption('time-between-calls');
        $dtMax = (new \DateTimeImmutable())->add(\DateInterval::createFromDateString("+ {$timeLimit} seconds"));

        do{
           // Here we should execute a service to query and send notifications
           // ......

           sleep($timeBetweenCalls);
           $dtCurrent = new \DateTimeImmutable();

        }while($dtCurrent < $dtMax && !$this->forceFinish);

        return Command::SUCCESS;
    }

    public function signalHandler(int $signalNumber): void
    {
        echo 'Signal catch: ' . $signalNumber . PHP_EOL;
        match ($signalNumber) {
            SIGTERM, SIGINT => $this->forceFinish = true,
            default => null
        };
    }
}

Expliquons la commande étape par étape :

  • La méthode configure déclare aux options de saisie :

    • délai : durée maximale pendant laquelle le processus de commande peut être actif. Après cela, il se terminera et le superviseur le redémarrera.
    • temps entre-appels : temps de sommeil après chaque itération de boucle. La boucle appelle le service qui traite les notifications puis se met en veille pendant cette période.
  • La méthode execute se comporte comme suit :

    • Définit la variable de classe forceFinish sur true
    • Utilise la bibliothèque PHP pnctl pour enregistrer la méthode signalHandler pour gérer les signaux Unix SIGTERM et SIGINT.
    • Obtient les valeurs des options d'entrée et calcule la date maximale à laquelle la commande peut être active jusqu'à ce que la valeur de l'option time-limit soit utilisée.
    • La boucle do-while exécute le code requis pour obtenir les notifications et les envoyer (elle n'est pas placée dans la commande, il y a des commentaires à la place). Ensuite, il met en veille le temps établi par l'option délai entre les appels avant de continuer.
    • Si la date actuelle (qui est calculée à chaque itération de boucle) est inférieure à la date maximale et que la forceFinish est fausse, la boucle continue. Sinon la commande se termine.
  • La fonction signalHandler capte les signaux SIGTERM et SIGINT Unix. SIGINT est le signal envoyé lorsque nous appuyons sur Ctrl+C et SIGTERM est le signal par défaut lorsque nous utilisons la commande kill. Lorsque la fonction signalHandler les détecte, elle définit la variable forceFinish sur true afin que, lorsque la boucle en cours se termine, la commande se termine puisque la variable forceFinish est n'est plus faux. Cela permet aux utilisateurs de terminer le processus sans avoir à attendre que la date maximale soit terminée.

Configuration du superviseur

Jusqu'à présent, nous avons créé la commande. Il est maintenant temps de configurer le superviseur pour qu'il puisse le gérer. Avant de commencer la configuration, nous devons installer le superviseur. Vous pouvez le faire en exécutant la commande suivante :

sudo apt update && sudo apt install supervisor

Après l'installation, vous pouvez vous assurer que le superviseur est en cours d'exécution en exécutant la commande suivante :

sudo systemctl status supervisor

Les fichiers de configuration du superviseur sont placés dans le dossier suivant : /etc/supervisor/conf.d. Créons un fichier nommé notif.conf et collons le contenu suivant :

command=php <your_project_folder>/bin/console app:notifications --time-limit=120 --time-between-calls=10
user=<your_user>
numprocs=1
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d

Expliquons chaque clé :

  • commande : La commande pour démarrer
  • utilisateur : L'utilisateur Unix qui exécute la commande
  • numprocs : Le nombre de processus à exécuter
  • démarrage automatique : s'il faut démarrer automatiquement la commande
  • démarrage automatique : s'il faut redémarrer automatiquement la commande
  • process_name : Le format du nom du processus Unix de la commande.

Avec cette configuration, la commande app:notifications s'exécutera pendant un maximum de 120 secondes et elle dormira pendant 10 secondes après chaque boucle. Après avoir passé 120 secondes ou mis en cache un signal Unix, la commande quittera la boucle et se terminera. Ensuite, le superviseur le redémarrera.

Conclusion

Nous avons appris à utiliser le superviseur pour maintenir une commande en cours d'exécution sans avoir à utiliser la crontab. Cela peut être utile lorsque les processus lancés par la crontab peuvent se chevaucher, provoquant une corruption des données.

Dans le dernier livre que j'ai écrit, je montre comment utiliser le superviseur pour que les travailleurs de messagerie Symfony continuent de fonctionner. Si vous souhaitez en savoir plus, vous pouvez trouver le livre ici : Construire une API orientée opérations à l'aide de PHP et du framework Symfony : un guide étape par étape

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Formulaire contextuel sur le bouton de type d'article personnalisé avec tutoriel de soumission Ajax Formulaire contextuel sur le bouton de type d'article personnalisé avec tutoriel de soumission Ajax Aug 08, 2025 pm 11:09 PM

Ce tutoriel fournit des instructions détaillées sur la façon d'ajouter un bouton "Soumettre Quoation" à chaque article de WordPress dans une liste de types d'article personnalisée. Après avoir cliqué, un formulaire HTML personnalisé avec l'ID d'article apparaît et les données du formulaire sont l'affichage de la soumission et du message de réussite de l'AJAX. Le contenu couvre les paramètres pop-up de l'interface utilisateur jQuery frontal, le transfert de données dynamiques, le traitement de la demande AJAX, ainsi que la mise en œuvre de l'accrocheur AJAX WordPress et le traitement des données back-end, en garantissant des fonctions complètes, une expérience utilisateur sécurisée et bonne.

Comment travailler avec des tableaux en php Comment travailler avec des tableaux en php Aug 20, 2025 pm 07:01 PM

Phparrayshandledatacollectionsefficantyusing indexedorassociativstructures; theyareCreated withArray () ou [], accessedViakeys, modifiedByAssigment, itérated withoreach, andmanipulatedUsingFunction

Décrivez le modèle de conception de l'observateur et sa mise en œuvre dans PHP. Décrivez le modèle de conception de l'observateur et sa mise en œuvre dans PHP. Aug 15, 2025 pm 01:54 PM

TheObserverdesignpatternenablesautomaticnotificationofdependentobjectswhenasubject'sstatechanges.1)Itdefinesaone-to-manydependencybetweenobjects;2)Thesubjectmaintainsalistofobserversandnotifiesthemviaacommoninterface;3)Observersimplementanupdatemetho

Comment utiliser la variable $ _cookie en php Comment utiliser la variable $ _cookie en php Aug 20, 2025 pm 07:00 PM

$ _CookieisaphpsuperglobalForAccessingCooKiessentByThebrowser; cookiesAreSetingSetCooKie () BeforeOutput, ReadVia $ _cookie ['name'], Updated Resenderwithnewvalues, anddeletedBysetinganExpiredtimestamp, withsecurit

Comparez et contrastez les traits PHP, les classes abstraites et les interfaces avec les cas d'utilisation pratiques. Comparez et contrastez les traits PHP, les classes abstraites et les interfaces avec les cas d'utilisation pratiques. Aug 11, 2025 pm 11:17 PM

Utiliser une interfacestodefineContracts pour les classes liées, garantissant à ce que les implications spécifiques de la responsabilité; 2. ustractClassestoshareCommonLogicamongRelatedClasses whileenforcingInheritance; 3.UsetraTstoreUtyUtilityCodeAcrosses

Formulaire contextuel du bouton d'article personnalisé WordPress avec guide de soumission Ajax Formulaire contextuel du bouton d'article personnalisé WordPress avec guide de soumission Ajax Aug 08, 2025 pm 11:06 PM

Ce didacticiel détaille comment ajouter un bouton de devis de soumission à l'élément de liste de chaque type de message personnalisé (tel que "immobilier") dans WordPress, et un formulaire HTML personnalisé avec un ID de publication spécifique apparaît après avoir cliqué. L'article couvrira comment créer des popups modaux à l'aide de la boîte de dialogue JQuery UI, passera dynamiquement l'ID de l'article via des attributs de données et utiliser le mécanisme WordPress Ajax pour implémenter la soumission asynchrone des formulaires, tout en traitement des téléchargements de fichiers et afficher les résultats de soumission, offrant ainsi une expérience utilisateur sans couture.

Expliquez les stratégies d'indexation de la base de données (par exemple, B-Tree, Text complet) pour une application PHP soutenue par MySQL. Expliquez les stratégies d'indexation de la base de données (par exemple, B-Tree, Text complet) pour une application PHP soutenue par MySQL. Aug 13, 2025 pm 02:57 PM

B-TreeIndexesAreBestFormostPhpapplications, AstheySupportequality andRangequeries, Tri, andareIdEalforColumnSuseInwhere, Join, OrorderByClauses; 2.Full-TextIndexessHouldFornaturAralLanguageorBooleanSearSonTextFieldslikeArlesorProductDescriptiiReScriptidScriptidiansearchesEnTextFieldslikeArlesorProductDescripti

Implémentez le formulaire pop-up et la soumission Ajax pour chaque bouton de publication personnalisé dans WordPress Implémentez le formulaire pop-up et la soumission Ajax pour chaque bouton de publication personnalisé dans WordPress Aug 08, 2025 pm 10:57 PM

Ce tutoriel fournira des instructions détaillées sur la façon d'implémenter un formulaire de soumission contextuel dans WordPress pour un bouton autonome pour chaque publication personnalisée (comme le type "immobilier"). Nous utiliserons la boîte de dialogue JQuery UI pour créer des boîtes modales et passerons dynamiquement l'ID de l'article via JavaScript. De plus, le tutoriel couvrira comment soumettre des données de formulaire via AJAX et gérer la logique backend sans rafraîchir la page, y compris les téléchargements de fichiers et les commentaires des résultats.

See all articles