Heim Backend-Entwicklung PHP-Tutorial Verwenden von Supervisor zur Abwicklung der Ausführung eines Symfony-Befehls

Verwenden von Supervisor zur Abwicklung der Ausführung eines Symfony-Befehls

Sep 07, 2024 am 06:34 AM

Einführung

In diesem Beitrag erfahren Sie, wie Sie supervisord verwenden, um die Ausführung eines Symfony-Befehls zu verwalten. Grundsätzlich erlaubt uns der Vorgesetzte:

  • Befehl automatisch starten
  • Befehl automatisch neu starten
  • Geben Sie die Anzahl der Prozesse an, die der Supervisor starten soll.

Das Problem

Manchmal greifen wir auf die Unix-Crontab zurück, um die Ausführung von Prozessen zu automatisieren. Dies mag in den meisten Fällen funktionieren, aber es kann Situationen geben, in denen es Probleme verursachen kann.

Stellen wir uns vor, wir hätten eine Datenbanktabelle, die die Benachrichtigungen der Benutzer protokolliert. Die Tabelle speichert die folgenden Informationen:

  • Benutzer
  • Text
  • Kanal
  • Status (WARTET, GESENDET)
  • erstellt am
  • aktualisiert um

Andererseits haben wir einen Befehl codiert, dessen Ausführung den nächsten Schritten folgt:

  • Frägt die letzten WAITING-Benachrichtigungen ab
  • Läuft die abgefragten Benachrichtigungen in einer Schleife ab und:
    • Sendet jedes einzelne an den entsprechenden Benutzer.
    • Aktualisiert den Benachrichtigungsstatus von WAITING auf GESENDET

Wir haben diesen Befehl in der Linux-Crontab so eingestellt, dass er von Zeit zu Zeit ausgeführt wird (1 Minute, 2 Minuten usw.). So weit so gut.

Stellen wir uns nun vor, dass der aktuelle Prozess 500 Benachrichtigungen abgefragt hat und wenn er 400 gesendet hat, startet ein neuer Prozess. Das bedeutet, dass der neue Prozess die 100 Benachrichtigungen abfragt, die vom letzten Prozess noch nicht aktualisiert wurden, plus die neuen:

Using Supervisor to handle a Symfony Command execution

Dies kann dazu führen, dass diese 100 Benachrichtigungen zweimal gesendet werden, da beide Prozesse sie abgefragt haben.

Die Lösung

Als Lösung können wir auf den Einsatz eines Supervisors zurückgreifen. Es hält unseren Prozess am Laufen und startet ihn bei Bedarf neu. Auf diese Weise behalten wir nur einen Prozess bei und vermeiden Überschneidungen. Lassen Sie uns analysieren, wie der Befehl aussehen sollte:

#[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
        };
    }
}

Lassen Sie uns den Befehl Schritt für Schritt erklären:

  • Die Methode configure deklariert Eingabeoptionen:

    • Zeitlimit: Maximale Zeit, die der Befehlsprozess aktiv sein kann. Danach wird es beendet und der Supervisor startet es neu.
    • time-between-calls: Zeit zum Schlafen nach jeder Schleifeniteration. Die Schleife ruft den Dienst auf, der Benachrichtigungen verarbeitet und während dieser Zeit in den Ruhezustand wechselt.
  • Die Methode execute verhält sich wie folgt:

    • Setzt die Klassenvariable forceFinish auf true
    • Verwendet die PHP-pnctl-Bibliothek, um die Methode signalHandler für die Verarbeitung der Unix-Signale SIGTERM und SIGINT zu registrieren.
    • Ruft die Eingabeoptionswerte ab und berechnet das maximale Datum, an dem der Befehl aktiv sein kann, bis der Optionswert Zeitlimit verwendet wird.
    • Die do-while-Schleife führt den erforderlichen Code aus, um die Benachrichtigungen abzurufen und zu senden (sie wird nicht in den Befehl eingefügt, stattdessen gibt es Kommentare). Anschließend wird die durch die Option Zeit zwischen Anrufen festgelegte Zeit in den Ruhezustand versetzt, bevor fortgefahren wird.
    • Wenn das aktuelle Datum (das in jeder Schleifeniteration berechnet wird) niedriger als das maximale Datum ist und forceFinish falsch ist, wird die Schleife fortgesetzt. Andernfalls wird der Befehl beendet.
  • Die Funktion signalHandler fängt die Unix-Signale SIGTERM und SIGINT ab. SIGINT ist das Signal, das gesendet wird, wenn wir Strg+C drücken, und SIGTERM ist das Standardsignal, wenn wir den Kill-Befehl verwenden. Wenn die Funktion signalHandler sie erkennt, setzt sie die Variable forceFinish auf „true“, sodass der Befehl nach Abschluss der aktuellen Schleife beendet wird, da die Variable forceFinish vorhanden ist nicht mehr falsch. Dadurch können Benutzer den Vorgang beenden, ohne warten zu müssen, bis das maximale Datum abgelaufen ist.

Supervisor konfigurieren

Bisher haben wir den Befehl erstellt. Jetzt ist es an der Zeit, den Supervisor so einzurichten, dass er damit umgehen kann. Bevor wir mit der Konfiguration beginnen, müssen wir Supervisor installieren. Sie können dies tun, indem Sie den folgenden Befehl ausführen:

sudo apt update && sudo apt install supervisor

Nach der Installation können Sie sicherstellen, dass Supervisor ausgeführt wird, indem Sie den nächsten Befehl ausführen:

sudo systemctl status supervisor

Supervisor-Konfigurationsdateien werden im folgenden Ordner abgelegt: /etc/supervisor/conf.d. Erstellen wir eine Datei mit dem Namen notif.conf und fügen den folgenden Inhalt ein:

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

Lassen Sie uns jeden Schlüssel erklären:

  • Befehl: Der Befehl zum Starten
  • Benutzer: Der Unix-Benutzer, der den Befehl ausführt
  • numprocs: Die Anzahl der auszuführenden Prozesse
  • Autostart: Ob der Befehl automatisch gestartet werden soll
  • Autostart: Ob der Befehl automatisch neu gestartet werden soll
  • Prozessname: Das Befehls-Unix-Prozessnamenformat.

Mit dieser Konfiguration wird der Befehl app:notifications maximal 120 Sekunden lang ausgeführt und nach jeder Schleife 10 Sekunden lang in den Ruhezustand versetzt. Nach Ablauf von 120 Sekunden oder Zwischenspeichern eines Unix-Signals verlässt der Befehl die Schleife und wird beendet. Dann wird der Vorgesetzte es erneut starten.

Abschluss

Wir haben gelernt, wie man Supervisor verwendet, um einen Befehl am Laufen zu halten, ohne die Crontab verwenden zu müssen. Dies kann nützlich sein, wenn sich die von der Crontab gestarteten Prozesse überschneiden und zu Datenbeschädigungen führen können.

Im letzten Buch, das ich geschrieben habe, zeige ich, wie man Supervisor verwendet, um die Symfony Messenger-Worker am Laufen zu halten. Wenn Sie mehr wissen möchten, finden Sie das Buch hier: Building an Operation-Oriented Api using PHP and the Symfony Framework: A Step-by-Step Guide

Das obige ist der detaillierte Inhalt vonVerwenden von Supervisor zur Abwicklung der Ausführung eines Symfony-Befehls. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

PHP-Tutorial
1510
276
Variabler PHP -Bereich erklärt Variabler PHP -Bereich erklärt Jul 17, 2025 am 04:16 AM

Häufige Probleme und Lösungen für den variablen PHP -Umfang umfassen: 1. Die globale Variable kann innerhalb der Funktion nicht zugegriffen werden, und sie muss bei der Verwendung des globalen Schlüsselworts oder Parameters übergeben werden. 2. Die statische Variable wird statisch deklariert und nur einmal initialisiert und der Wert wird zwischen mehreren Aufrufen beibehalten. 3.. Hyperglobale Variablen wie $ _get und $ _post können direkt in jedem Bereich verwendet werden, aber Sie müssen auf eine sichere Filterung achten. 4. Die anonymen Funktionen müssen über das Schlüsselwort verwenden, und wenn Sie externe Variablen ändern, müssen Sie eine Referenz übergeben. Das Beherrschen dieser Regeln kann dazu beitragen, Fehler zu vermeiden und die Code -Stabilität zu verbessern.

Tipps zum Schreiben von PHP -Kommentaren Tipps zum Schreiben von PHP -Kommentaren Jul 18, 2025 am 04:51 AM

Der Schlüssel zum Schreiben von PHP -Kommentaren liegt in der Klärung des Zwecks und der Spezifikationen. Kommentare sollten "Warum" und nicht "was getan" erklären, um Redundanz oder zu Einfachheit zu vermeiden. 1. Verwenden Sie ein einheitliches Format wie Docblock (/*/) für Klassen- und Methodenbeschreibungen, um die Lesbarkeit und die Kompatibilität der Werkzeuge zu verbessern. 2. Betonen Sie die Gründe für die Logik, z. B. warum JS -Sprünge manuell ausgeben müssen. 3. Fügen Sie eine Übersichtsbeschreibung vor komplexem Code hinzu, beschreiben Sie den Prozess in Schritten und helfen Sie, die Gesamtidee zu verstehen. V. Gute Anmerkungen können die Kommunikationskosten senken und die Effizienz der Code -Wartung verbessern.

Code in PHP aus dem Code ausgehen Code in PHP aus dem Code ausgehen Jul 18, 2025 am 04:57 AM

Es gibt drei gängige Methoden für den PHP -Kommentarcode: 1. Verwenden Sie // oder #, um eine Codezeile zu blockieren, und es wird empfohlen, // zu verwenden. 2. Verwenden Sie /.../, um Codeblöcke mit mehreren Zeilen zu wickeln, die nicht verschachtelt werden können, aber gekreuzt werden können. 3.. Kombinationskenntnisse Kommentare wie die Verwendung / if () {} / Um Logikblöcke zu steuern oder um die Effizienz mit Editor -Verknüpfungsschlüssel zu verbessern, sollten Sie auf die Schließung von Symbolen achten und das Verschachteln bei der Verwendung vermeiden.

SchnellpHP -Installations -Tutorial SchnellpHP -Installations -Tutorial Jul 18, 2025 am 04:52 AM

Toinstallphpquickly, usexampponwindowsorhomebrewonmacos.1.onwindows, download undInstallxampp, SelectComponents, Startapache und PlaceFilesinhtdocscs.2.Anternativ, manuellinstallphpfrfr

PHP lernen: Ein Anfängerführer PHP lernen: Ein Anfängerführer Jul 18, 2025 am 04:54 AM

Tolearnphpeffectival, startbysettingupalocalerverenVironmentusexs -LikexamppandacodeeditorikevScode.1) InstallxamppForapache, MySQL und Php.SeacodeeditorForsyntaxSupport.3) testyourscludingveliktingveliktelaThbiliodble.Neclyble.NektFile

PHP nennt AI intelligente Sprachassistenten PHP Voice Interaction System Construction PHP nennt AI intelligente Sprachassistenten PHP Voice Interaction System Construction Jul 25, 2025 pm 08:45 PM

Benutzerspracheingabe wird erfasst und über die Mediarecorder-API des Front-End-JavaScript an das PHP-Backend gesendet. 2. PHP speichert das Audio als temporäre Datei und ruft STTAPI (z. B. Google oder Baidu Voiceerkennung) auf, um sie in Text umzuwandeln. 3. PHP sendet den Text an einen KI -Dienst (wie OpenAigpt), um intelligente Antwort zu erhalten. 4. PHP ruft dann TTSAPI (wie Baidu oder Google Voice -Synthese) auf, um die Antwort in eine Sprachdatei umzuwandeln. 5. PHP streams die Sprachdatei zurück zum Spielen, um die Interaktion abzuschließen. Der gesamte Prozess wird von PHP dominiert, um eine nahtlose Verbindung zwischen allen Links zu gewährleisten.

So verwenden Sie PHP, um soziale Freigabefunktionen zu erstellen. PHP Sharing Interface Integration Practice So verwenden Sie PHP, um soziale Freigabefunktionen zu erstellen. PHP Sharing Interface Integration Practice Jul 25, 2025 pm 08:51 PM

Die Kernmethode zum Aufbau sozialer Freigabefunktionen in PHP besteht darin, dynamisch Freigabelinks zu generieren, die den Anforderungen jeder Plattform entsprechen. 1. Erhalten Sie zuerst die aktuelle Seite oder die angegebenen URL- und Artikelinformationen. 2. Verwenden Sie Urlencode, um die Parameter zu codieren. 3.. Spleiß und generieren Teilenverbindungen gemäß den Protokollen jeder Plattform; 4. Zeigen Sie Links im vorderen Ende an, damit Benutzer klicken und freigeben können. 5. generieren Sie Dynamik OG -Tags auf der Seite, um die Anzeige der Freigabe inhaltlich zu optimieren. 6. Achten Sie darauf, dass Sie den Benutzereingaben entkommen, um XSS -Angriffe zu verhindern. Diese Methode erfordert keine komplexe Authentifizierung, weist nur geringe Wartungskosten auf und eignet sich für die meisten Anforderungen an den Inhaltsaustausch.

So verwenden Sie PHP in Kombination mit AI, um die Erkennung und Optimierung der Textfehlerkorrektur PHP -Syntax zu erreichen So verwenden Sie PHP in Kombination mit AI, um die Erkennung und Optimierung der Textfehlerkorrektur PHP -Syntax zu erreichen Jul 25, 2025 pm 08:57 PM

Um die Textfehlerkorrektur und die Syntaxoptimierung mit AI zu realisieren, müssen Sie die folgenden Schritte ausführen: 1. Wählen Sie ein geeignetes AI -Modell oder ein geeignetes AI -Modell oder ein geeignetes AI -Modell wie Baidu, Tencent API oder Open Source NLP -Bibliothek aus; 2. Rufen Sie die API über die Curl oder das Guzzle von PHP auf und verarbeiten Sie die Rückgabeergebnisse. 3.. Informationen zur Fehlerkorrektur in der Anwendung anzeigen und ermöglichen den Benutzern, zu wählen, ob sie angenommen werden sollen. 4. Verwenden Sie PHP-L und PHP_CODESNIFFER für die Syntaxerkennung und -codeoptimierung. 5. sammeln Sie kontinuierlich Feedback und aktualisieren Sie das Modell oder die Regeln, um den Effekt zu verbessern. Konzentrieren Sie sich bei der Auswahl von AIAPI auf die Bewertung von Genauigkeit, Reaktionsgeschwindigkeit, Preis und Unterstützung für PHP. Die Codeoptimierung sollte den PSR -Spezifikationen folgen, Cache vernünftigerweise verwenden, zirkuläre Abfragen vermeiden, den Code regelmäßig überprüfen und x verwenden

See all articles