A large crowd of people dressed in medieval-style clothing, including robes, cloaks, and hats, walking in a procession through an ornate, dimly lit cathedral-like structure with arched ceilings and sunlight streaming through the windows.

In diesem Beitrag sehen wir uns an, wie man mit dem Queue-Plugin von CakePHP Hintergrundaufgaben effizient verwalten und ausführen kann. Wir werden die Struktur, Implementierung und Vorteile dieses Ansatzes untersuchen, mit einem Schwerpunkt auf densrc/Job Verzeichnis und zugehörige Komponenten von Willow CMS.

Übersicht über CakePHP-Warteschlangen und -Jobs

CakePHP bietet ein robustes Queue -Plugin, mit dem Entwickler zeit- oder ressourcenintensive Aufgaben auf Hintergrundprozesse auslagern können. Dies ist besonders nützlich für Vorgänge, die nicht sofort ausgeführt werden müssen oder deren synchrone Ausführung die Benutzererfahrung verlangsamen könnte.

Das Queue-Plugin erweitert die Fähigkeiten von CakePHP, indem es eine flexible und effiziente Möglichkeit zur Verwaltung dieser Hintergrundjobs bietet.

Willow CMS-Jobstruktur

Sehen wir uns an, wie Willow CMS seinen arbeitsbezogenen Code organisiert:

  • Alle Berufsklassen finden Sie im src/Job Verzeichnis
  • Jeder Job wird als separate Klasse definiert und erbt von einer Basis-Jobklasse, die vom Queue-Plugin bereitgestellt wird.
  • Jobs werden normalerweise mit einem beschreibenden Suffix benannt, wie zum BeispielUpdateJob ,AnalysisJob , oderProcessJob

Hier ist die Verzeichnisstruktur:

src/
└── Job/
    ├── ArticleSeoUpdateJob.php
    ├── ArticleSummaryUpdateJob.php
    ├── ArticleTagUpdateJob.php
    ├── CommentAnalysisJob.php
    ├── ImageAnalysisJob.php
    ├── ProcessImageJob.php
    ├── SendEmailJob.php
    ├── TagSeoUpdateJob.php
    ├── TranslateArticleJob.php
    ├── TranslateI18nJob.php
    └── TranslateTagJob.php

Dadurch können verschiedene Arten von Hintergrundaufgaben innerhalb der Anwendung leicht gefunden und verwaltet werden.

Warteschlangenjobs in Willow CMS

Willow CMS verwendet das Queue-Plugin, um Jobs für eine spätere Ausführung in die Warteschlange zu stellen. Dies geschieht, indem Nachrichten in eine Warteschlange gestellt werden. Die Nachricht kann Daten enthalten, die der Job benötigt, um seine Aufgabe zu erledigen. Sehen wir uns an, wie dies normalerweise gemacht wird:

In src/Model/Table/ArticlesTable.php finden wir Beispiele für Warteschlangenjobs:

$this->queueJob('App\Job\ArticleTagUpdateJob', $data);

Diese Codezeile stellt einenArticleTagUpdateJob mit den bereitgestellten$data . Der queueJob Die Methode ist ein Wrapper um die Joberstellungsfunktion des Queue-Plugins und vereinfacht das Hinzufügen von Jobs zur Warteschlange. In Zukunft werde ich dies umgestalten, da wir dieselbe Methode auch in der TagsTable verwenden.

Jobarten und ihre Zwecke

Lassen Sie uns einige der Jobtypen in Willow CMS und ihre Zwecke untersuchen:

  1. ArticleSeoUpdateJob : Aktualisiert SEO-Metadaten für Artikel mithilfe des Anthropic API-Dienstes. Es ruft den Artikel ab, generiert SEO-Inhalte (wie Metabeschreibungen und Schlüsselwörter) mithilfe von KI und aktualisiert den Artikel mit den neuen SEO-Metadaten. Der Job übernimmt auch die Fehlerprotokollierung und das Leeren des Caches. Sehen Sie sich hier die Quelle an.

  2. ArticleSummaryUpdateJob : Generiert und aktualisiert Artikelzusammenfassungen mithilfe des TextSummaryGenerators, der den Anthropic API-Dienst verwendet. Er ruft den Artikel ab, generiert eine Zusammenfassung und einen Einleitungstext (falls diese nicht vorhanden sind) und aktualisiert den Artikel mit dem neuen Inhalt. Der Job übernimmt auch die Fehlerprotokollierung und stellt sicher, dass vorhandene Zusammenfassungen nicht überschrieben werden. Den Quelltext finden Sie hier .

  3. ArticleTagUpdateJob : Aktualisiert Tags, die Artikeln zugeordnet sind, mithilfe des Anthropic API-Dienstes. Es ruft den Artikel ab, generiert neue Tags basierend auf dem Artikelinhalt und aktualisiert den Artikel mit den neuen Tags. Der Job verarbeitet sowohl Tags auf Stammebene als auch verschachtelte untergeordnete Tags und umfasst Fehlerprotokollierung und Cache-Löschung. Sehen Sie sich hier die Quelle an.

  4. CommentAnalysisJob : Analysiert Kommentare zur Stimmungsanalyse/Spamerkennung mithilfe des Anthropic API-Dienstes. Den Quellcode finden Sie hier .

  5. ImageAnalysisJob : Führt mithilfe des Anthropic API-Dienstes Bildanalysen zur Generierung von Alternativtexten und zur Stichwortverschlagwortung für die Suche durch. Den Quelltext finden Sie hier .

  6. ProcessImageJob : Bewältigt Bildverarbeitungsaufgaben wie Größenänderung, Formatkonvertierung oder Optimierung. Den Quelltext finden Sie hier .

  7. SendEmailJob : Verwaltet das Senden von E-Mails und ermöglicht eine bessere Handhabung großer E-Mail-Stapel oder Wiederholungsversuche bei Fehlern. Den Quelltext finden Sie hier .

  8. TagSeoUpdateJob : Aktualisiert SEO-Informationen für Tags und generiert Metabeschreibungen und verwandte SEO-bezogene Inhalte mithilfe des Anthropic API-Dienstes. Den Quelltext finden Sie hier .

  9. TranslateArticleJob , TranslateI18nJob , TranslateTagJob : Erledigen Sie Übersetzungsaufgaben für Artikel, Internationalisierungszeichenfolgen und Tags mit der Google Cloud Translate API. Sehen Sie sich den Quelltext für TranslateArticleJob , TranslateI18nJob , TranslateTagJob an.

Schauen wir uns dieArticleTagUpdateJob , das für die Aktualisierung der Tags eines Artikels mithilfe der Anthropic API verantwortlich ist:


declare(strict_types=1);

namespace App\Job;

use App\Service\Api\Anthropic\AnthropicApiService;
use Cake\Cache\Cache;
use Cake\Log\LogTrait;
use Cake\ORM\Entity;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;
use Cake\Queue\Job\JobInterface;
use Cake\Queue\Job\Message;
use Interop\Queue\Processor;

class ArticleTagUpdateJob implements JobInterface
{
    use LogTrait;

    public static int $maxAttempts = 3;
    public static bool $shouldBeUnique = true;

    private AnthropicApiService $anthropicService;

    public function __construct(?AnthropicApiService $anthropicService = null)
    {
        $this->anthropicService = $anthropicService ?? new AnthropicApiService();
    }

    // Jobs must have an execute method which is the default entry point for the task
    public function execute(Message $message): ?string
    {
        // The message will contain the data we set when queuing the message, so get it
        $id = $message->getArgument('id');
        $title = $message->getArgument('title');

         // Logging is always useful and will show up in the Admin Logs area...
        $this->log(
            sprintf('Received article tag update message: %s : %s', $id, $title),
            'info',
            ['group_name' => 'App\Job\ArticleTagUpdateJob']
        );

        // You can load models to work with data from a Job
        $articlesTable = TableRegistry::getTableLocator()->get('Articles');
        $tagsTable = TableRegistry::getTableLocator()->get('Tags');

        // And use models just like you would anywhere else in a CakePHP application
        $article = $articlesTable->get(
            $id,
            fields: ['id', 'title', 'body'],
            contain: ['Tags' => ['fields' => ['id']]]
        );

        $allTags = $tagsTable->getSimpleThreadedArray();

        try {
            // Making use of the anthropic service class
            $tagResult = $this->anthropicService->generateArticleTags(
                $allTags,
                (string)$article->title,
                (string)strip_tags($article->body),
            );

            if (isset($tagResult['tags']) && is_array($tagResult['tags'])) {
                $newTags = $this->processAndSaveTags($tagsTable, $tagResult['tags']);
                $article->tags = $newTags;

                if ($articlesTable->save($article, ['validate' => false, 'noMessage' => true])) {
                    $this->log(
                        sprintf('Article tag update completed successfully. Article ID: %s', $id),
                        'info',
                        ['group_name' => 'App\Job\ArticleTagUpdateJob']
                    );

                    Cache::clear('articles');

                    return Processor::ACK;
                }
            }
        } catch (Exception $e) {
            $this->log(
                sprintf(
                    'Article Tag update failed. ID: %s Title: %s Error: %s',
                    $id,
                    $title,
                    $e->getMessage(),
                ),
                'error',
                ['group_name' => 'App\Job\ArticleTagUpdateJob']
            );
        }
        // Something went wrong if we got here so tell he queue plugin to reject this run of the job
        return Processor::REJECT;
    }

    // Other helper methods... see the full source on GitHub
}

Dieser Job demonstriert mehrere Aspekte der Job-Einrichtung von Willow CMS:

  1. API-Integration : Es verwendet eine externe API (Anthropic), um Tags für Artikel zu generieren, und zeigt, wie Hintergrundjobs in Dienste von Drittanbietern integriert werden können.

  2. Fehlerbehandlung : Der Job beinhaltet eine umfassende Fehlerbehandlung über das Queue-Plugin, das Mechanismen zum Verwalten von Jobfehlern, Wiederholungsversuchen und zur Protokollierung bietet.

  3. Protokollierung : Im gesamten Job wird eine umfassende Protokollierung durchgeführt, die wertvolle Erkenntnisse für die Überwachung und Fehlerbehebung bietet.

  4. Rückgabewerte : Dieexecute Methode gibt zurückProcessor::ACK auf Erfolg undProcessor::REJECT bei einem Fehler, sodass das Warteschlangensystem Wiederholungsversuche und Fehler entsprechend verarbeiten kann.

  5. Datenbankoperationen : Es interagiert mit mehreren Datenbanktabellen (Artikel und Tags), um Daten abzurufen und zu aktualisieren.

  6. Jobkonfiguration : Die Klasse definiert Eigenschaften wie$maxAttempts Und$shouldBeUnique um das Jobausführungsverhalten zu steuern.

  7. Dependency Injection : Der Job verwendet Konstruktor-Injection, um notwendige Abhängigkeiten wie den AnthropicApiService zu erhalten. Dies erleichtert den Wechsel zu einem anderen KI-Dienst von Google, OpenAI usw.

  8. Zwischenspeichern : Nach erfolgreichen Tag-Updates löscht der Job den Artikel-Cache, um sicherzustellen, dass den Benutzern aktuelle Daten bereitgestellt werden.

  9. Einzelverantwortung : Die Jobklasse ist für die Einzelaufgabe der Pflege der mit einem Artikel verknüpften Tags verantwortlich, wodurch der Code wartbarer und leichter verständlich wird.

  10. Trennung der Belange : Durch die Verlagerung dieser relativ zeitaufwändigen Aufgabe in einen Hintergrundjob bleibt die Aktion „Artikel speichern“ sauber und reaktionsfähig.

Jobkonfiguration und -auslösung

Willow CMS verwendet die Konfigurationsoptionen des Queue-Plugins, um die Auftragsausführung zu optimieren. Hier sind einige wichtige Aspekte der Auftragskonfiguration und -auslösung:

  1. Warteschlangenkonfiguration : Das Warteschlangen-Plugin wird in der Anwendung konfiguriert config/app.php Datei. Diese Konfiguration umfasst Einstellungen wie die Warteschlangen-Engine (z. B. Redis, Datenbank), Worker-Optionen und Wiederholungsstrategien.

  2. Jobspezifische Einstellungen : Wie in derArticleTagUpdateJob Beispielsweise können einzelne Jobklassen spezifische Einstellungen definieren:

    public static int $maxAttempts = 3;
    public static bool $shouldBeUnique = true;
    

    Diese Einstellungen steuern die maximale Anzahl der Wiederholungsversuche und stellen sicher, dass sich immer nur eine Instanz des Auftrags in der Warteschlange befindet.

  3. Warteschlangen und Auslösen von Jobs : Jobs werden als Reaktion auf bestimmte Ereignisse oder Aktionen innerhalb der Anwendung in die Warteschlange gestellt. Beispiel:

    • Nach dem Erstellen oder Aktualisieren eines Artikels:$this->queueJob('App\Job\ArticleTagUpdateJob', ['id' => $article->id]);
    • Nach dem Hochladen eines Bildes:$this->queueJob('App\Job\ProcessImageJob', ['image_id' => $image->id]);

Jobs werden mithilfe des Queue Worker ausgelöst. In der Entwicklungsumgebung wird der Queue Worker manuell über die Befehlszeile ausgeführt – siehe ReadMe . In einer Produktionsumgebung wird der Queue Worker automatisch über Supervisord ausgeführt.

  1. Jobdaten : Die in die Warteschlange gestellten Nachrichten können Daten enthalten, auf die innerhalb des Jobs zugegriffen werden kann, indemgetArgument() Methode in der Nachricht. Um die Dinge einfach zu halten, habe ich in der Nachricht nur die absolut notwendigen Informationen für den Job eingefügt, in diesem Fall die ID des Modelldatensatzes, mit dem der Job arbeiten wird, und den Titel, damit die Protokolle hilfreiche Informationen enthalten können, falls etwas schief geht.
        $id = $message->getArgument('id');
        $title = $message->getArgument('title');

Schlagwörter

KI Code Entwicklung KuchenPHP Infrastruktur DevOps Mikrodienste Merkmale