Dans cet article, nous verrons comment utiliser le plugin Queue de CakePHP pour gérer et exécuter efficacement les tâches en arrière-plan. Nous explorerons la structure, la mise en œuvre et les avantages de cette approche, en mettant l'accent sur lessrc/Job
répertoire et composants associés de Willow CMS.
Présentation des files d'attente et des tâches CakePHP
CakePHP fournit un plugin de file d'attente robuste qui permet aux développeurs de décharger les tâches chronophages ou gourmandes en ressources vers des processus d'arrière-plan. Ceci est particulièrement utile pour les opérations qui n'ont pas besoin d'être exécutées immédiatement ou qui pourraient ralentir l'expérience utilisateur si elles sont effectuées de manière synchrone.
Le plugin Queue étend les capacités de CakePHP en fournissant un moyen flexible et efficace de gérer ces tâches en arrière-plan.
Structure des tâches de Willow CMS
Examinons comment Willow CMS organise son code lié aux tâches :
- Toutes les catégories d'emplois sont situées dans le
src/Job
annuaire - Chaque tâche est définie comme une classe distincte, héritant d'une classe de tâches de base fournie par le plug-in de file d'attente
- Les emplois sont généralement nommés avec un suffixe descriptif, tel que
UpdateJob
,AnalysisJob
, ouProcessJob
Voici la structure du répertoire :
src/
└── Job/
├── ArticleSeoUpdateJob.php
├── ArticleSummaryUpdateJob.php
├── ArticleTagUpdateJob.php
├── CommentAnalysisJob.php
├── ImageAnalysisJob.php
├── ProcessImageJob.php
├── SendEmailJob.php
├── TagSeoUpdateJob.php
├── TranslateArticleJob.php
├── TranslateI18nJob.php
└── TranslateTagJob.php
Cela facilite la localisation et la gestion de différents types de tâches d’arrière-plan au sein de l’application.
Mise en file d'attente des tâches dans Willow CMS
Willow CMS utilise le plug-in de file d'attente pour mettre les tâches en file d'attente en vue d'une exécution ultérieure. Cela se fait en plaçant les messages dans une file d'attente. Le message peut contenir des données dont la tâche aura besoin pour faire son travail. Voyons comment cela se fait généralement :
Dans src/Model/Table/ArticlesTable.php , nous pouvons trouver des exemples de tâches en file d'attente :
$this->queueJob('App\Job\ArticleTagUpdateJob', $data);
Cette ligne de code met en file d'attente uneArticleTagUpdateJob
avec le fourni$data
. Le queueJob
La méthode est un wrapper autour de la fonctionnalité de création de tâches du plug-in de file d'attente, simplifiant le processus d'ajout de tâches à la file d'attente. À l'avenir, je vais refactoriser cela puisque nous utilisons également la même méthode dans la TagsTable.
Types d'emplois et leurs objectifs
Explorons certains des types de travaux dans Willow CMS et leurs objectifs :
ArticleSeoUpdateJob : met à jour les métadonnées SEO des articles à l'aide du service API Anthropic. Il récupère l'article, génère du contenu SEO (comme des méta-descriptions et des mots-clés) à l'aide de l'IA et met à jour l'article avec les nouvelles métadonnées SEO. Le travail gère également la journalisation des erreurs et la suppression du cache. Voir la source ici .
ArticleSummaryUpdateJob : génère et met à jour les résumés d'articles à l'aide de TextSummaryGenerator, qui utilise le service API Anthropic. Il récupère l'article, génère un résumé et un lede (s'ils n'existent pas) et met à jour l'article avec le nouveau contenu. Le travail gère également la journalisation des erreurs et garantit que les résumés existants ne sont pas écrasés. Voir la source ici .
ArticleTagUpdateJob : met à jour les balises associées aux articles à l'aide du service API Anthropic. Il récupère l'article, génère de nouvelles balises en fonction du contenu de l'article et met à jour l'article avec les nouvelles balises. La tâche gère à la fois les balises de niveau racine et les balises enfants imbriquées, et inclut la journalisation des erreurs et la suppression du cache. Voir la source ici .
CommentAnalysisJob : analyse les commentaires pour l'analyse des sentiments/la détection de spam à l'aide du service API Anthropic. Voir la source ici .
ImageAnalysisJob : effectue une analyse des images pour générer du texte alternatif et baliser des mots-clés pour la recherche à l'aide du service API Anthropic. Voir la source ici .
ProcessImageJob : gère les tâches de traitement d'image telles que le redimensionnement, la conversion de format ou l'optimisation. Voir la source ici .
SendEmailJob : gère l'envoi d'e-mails, permettant une meilleure gestion des gros lots d'e-mails ou des tentatives en cas d'échec. Voir la source ici .
TagSeoUpdateJob : met à jour les informations SEO des balises, génère des méta-descriptions et du contenu SEO associé à l'aide du service API Anthropic. Voir la source ici .
TranslateArticleJob , TranslateI18nJob , TranslateTagJob : gérez les tâches de traduction des articles, des chaînes d'internationalisation et des balises respectivement à l'aide de l'API Google Cloud Translate. Consultez la source de TranslateArticleJob , TranslateI18nJob , TranslateTagJob .
Regardons de plus près leArticleTagUpdateJob
, qui est responsable de la mise à jour des balises d'un article à l'aide de l'API Anthropic :
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
}
Ce travail démontre plusieurs aspects de la configuration des tâches de Willow CMS :
Intégration API : elle utilise une API externe (Anthropic) pour générer des balises pour les articles, montrant comment les tâches en arrière-plan peuvent s'intégrer à des services tiers.
Gestion des erreurs : le travail intègre une gestion complète des erreurs via le plug-in de file d'attente, qui offre des mécanismes de gestion des échecs, des tentatives et de la journalisation des travaux.
Journalisation : une journalisation complète est mise en œuvre tout au long du travail, fournissant des informations précieuses pour la surveillance et le débogage.
Valeurs de retour : Le
execute
la méthode renvoieProcessor::ACK
sur le succès etProcessor::REJECT
en cas d'échec, permettre au système de file d'attente de gérer les nouvelles tentatives et les échecs de manière appropriée.Opérations de base de données : il interagit avec plusieurs tables de base de données (articles et balises) pour récupérer et mettre à jour des données.
Configuration du travail : La classe définit des propriétés telles que
$maxAttempts
et$shouldBeUnique
pour contrôler le comportement d'exécution des tâches.Injection de dépendances : le travail utilise l'injection de constructeur pour recevoir les dépendances nécessaires, telles que AnthropicApiService. Cela facilite le passage à un autre service d'IA de Google, OpenAI, etc.
Mise en cache : après des mises à jour de balises réussies, la tâche efface le cache des articles pour garantir que de nouvelles données sont fournies aux utilisateurs.
Responsabilité unique : La classe de travail est responsable de la tâche unique de maintenance des balises liées à un article, rendant le code plus maintenable et plus facile à comprendre.
Séparation des préoccupations : en déplaçant cette tâche relativement longue dans une tâche d'arrière-plan, l'action d'enregistrement de l'article reste propre et réactive.
Configuration et déclenchement des tâches
Willow CMS utilise les options de configuration du plug-in de file d'attente pour affiner l'exécution des tâches. Voici quelques aspects clés de la configuration et du déclenchement des tâches :
Configuration de la file d'attente : le plug-in de file d'attente est configuré dans l'application
config/app.php
fichier. Cette configuration inclut des paramètres tels que le moteur de file d'attente (par exemple, Redis, base de données), les options de travail et les stratégies de nouvelle tentative.Paramètres spécifiques au travail : comme indiqué dans le
ArticleTagUpdateJob
par exemple, les classes d'emploi individuelles peuvent définir des paramètres spécifiques :public static int $maxAttempts = 3; public static bool $shouldBeUnique = true;
Ces paramètres contrôlent le nombre maximal de tentatives de nouvelle tentative et garantissent qu'une seule instance du travail se trouve dans la file d'attente à la fois.
Mise en file d'attente et déclenchement des tâches : les tâches sont mises en file d'attente en réponse à des événements ou des actions spécifiques au sein de l'application. Par exemple :
- Après avoir créé ou mis à jour un article :
$this->queueJob('App\Job\ArticleTagUpdateJob', ['id' => $article->id]);
- Après avoir téléchargé une image :
$this->queueJob('App\Job\ProcessImageJob', ['image_id' => $image->id]);
- Après avoir créé ou mis à jour un article :
Les tâches sont déclenchées à l'aide de Queue Worker . Dans l'environnement de développement, Queue Worker est exécuté manuellement sur la ligne de commande - voir le fichier ReadMe . Dans un environnement de production, Queue Worker est exécuté automatiquement via Supervisord
- Données de travail : Le message placé dans la file d'attente peut contenir des données accessibles dans le travail à l'aide de l'
getArgument()
méthode sur le message. Pour garder les choses simples, je ne mets que les informations minimales nécessaires au travail dans le message, dans ce cas, l'ID de l'enregistrement de modèle avec lequel le travail fonctionnera et le titre afin que si quelque chose ne va pas, les journaux puissent inclure des informations utiles.
$id = $message->getArgument('id');
$title = $message->getArgument('title');