Maison > développement back-end > tutoriel php > Planification avec la file d'attente de l'emploi Zend

Planification avec la file d'attente de l'emploi Zend

尊渡假赌尊渡假赌尊渡假赌
Libérer: 2025-03-01 10:21:11
original
207 Les gens l'ont consulté

Utilisez la file d'attente de travaux zend pour la planification des tâches

Scheduling with Zend Job Queue

Points de base

  • Le module de file d'attente de travail de Zend Server permet l'exécution asynchrone des tâches non interactives et longues, prend en charge un fonctionnement parallèle, une exécution retardée ou régulière des tâches et est gérée via l'interface graphique.
  • L'API de la file d'attente de travaux est accessible via la classe ZendJobqueue, qui permet de créer des travaux, de passer des paramètres et de définir d'autres options de travail telles que la priorité, la persistance et la planification.
  • Comme le montre l'exemple d'extension, la file d'attente de travaux peut être utilisée pour améliorer l'expérience utilisateur et améliorer l'efficacité de l'application, et les tâches peuvent être planifiées et exécutées en parallèle, réduisant le temps d'attente des utilisateurs.
  • Bien qu'il existe d'autres alternatives pour gérer les files d'attente et le traitement parallèle dans PHP (par exemple Cron, PCNTL_FORK, Gearman, Node.js et RabbitMQ), Job Fidue fournit une solution simple et facile à utiliser.

La plupart des applications Web suivent un modèle de communication synchrone. Cependant, les tâches non interactives et longues (telles que la génération de rapports) conviennent plus à l'exécution asynchrone. Une façon de décharger les tâches ultérieurement ou même d'exécuter sur différents serveurs consiste à utiliser le module de file d'attente de travaux fournis dans Zend Server 5 (mais non inclus dans l'édition communautaire). La file d'attente d'emploi permet la planification des travaux en fonction du temps, de la priorité et même des dépendances. Les travaux peuvent être retardés ou exécutés régulièrement et - surtout, peut être exécuté en parallèle! Plus important encore, Zend Server lui-même fournit une interface graphique de gestion pour suivre l'exécution du travail, y compris son statut, son temps d'exécution et sa sortie. Le principal avantage du module de file d'attente de travaux réside dans sa capacité à exécuter des tâches en parallèle. Contrairement aux travaux Cron, la file d'attente de travaux permet:

  • Exécutez des tâches maintenant sans attendre qu'ils terminent (asynchrone)
  • Exécutez la tâche une fois, mais pas immédiatement (travail retardé)
  • Exécutez régulièrement des tâches (similaires aux travaux répétés dans Cron, mais ils peuvent être entièrement contrôlés via l'API PHP - démarrer, arrêter, faire une pause, reprendre)
  • Interroger l'état du travail via l'API, les défaillances et les réanimations de processus, et suivez les travaux passés, actuels et en attente via l'interface graphique.

Certains exemples de la file d'attente de l'emploi peuvent être utilisés pour les tâches asynchrones incluent:

  • Préparer des données pour la prochaine demande (précalculée)
  • Données préalables
  • générer des rapports périodiques
  • Envoyez un e-mail
  • nettoyer les données ou fichiers temporaires
  • Communiquez avec les systèmes externes
  • synchroniser les données backend avec les appareils mobiles

Comment utiliser la file d'attente de travail

L'API de la file d'attente

peut être utilisée via la classe ZendJobqueue. Pour effectuer la plupart des tâches, vous vous connectez au serveur de files d'attente de travail en instanciant l'objet ZendJobqueue et en créant un travail à l'aide de la méthode createHttpjob ().

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

passer le chemin de CreateHttpJob () au lieu de l'URL complète créera un travail avec la valeur du nom d'hôte $ _Server ["http_host"]. Notez que $ _Server ["http_host"] n'est pas disponible, comme lors de la planification d'un travail à partir d'un script cron.

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Les paramètres de travail peuvent être passés dans le cadre de la chaîne de requête ou comme deuxième paramètre de createHttpjob () en tant que tableau. Si l'argument est passé comme deuxième argument, le tableau doit être compatible JSON. Pour accéder aux paramètres dans le code de travail, vous pouvez utiliser la méthode statique GetCurrentJobParams ().

<?php
// 这两个调用是等效的
$queue->createHttpJob("/jobs/somejob.php");
$queue->createHttpJob("http://" . $_SERVER["HTTP_HOST"] . "/jobs/somejob.php");
Copier après la connexion
Copier après la connexion
Copier après la connexion

D'autres options de travail peuvent être utilisées via le troisième paramètre de CreateHttpJob (). Il s'agit d'un tableau associatif contenant les clés suivantes:

  • Nom - Nom du travail facultatif
  • Priorité - Priorité du travail, définie par les constantes correspondantes priority_low, priority_ormal, priority_high et priority_urgent
  • persistant - valeur booléenne indiquant si l'historique du travail est toujours préservé
  • Prédécesseur - ID de travail prédécesseur entier
  • http_headers - En-tête http joint
  • Calendrier - Commande de calendrier de style cron
  • calendrier_time - l'heure du travail doit être exécutée (mais selon la charge de la file d'attente du travail, elle peut en fait fonctionner après cette heure)

par exemple, la création d'un travail retardé ou un travail en double ressemble à ceci:

<?php
$params = ZendJobQueue::getCurrentJobParams();
Copier après la connexion
Copier après la connexion
Copier après la connexion

Échec (et réussi) peut être géré comme suit:

<?php
$params = array("p1" => 10, "p2" => "somevalue");

// 一小时后处理
$options = array("schedule_time" => date("Y-m-d H:i:s", strtotime("+1 hour")));
$queue->createHttpJob("http://example.com/jobs/somejob.php", $params, $options);

// 每隔一天凌晨1:05处理
$options = array("schedule" => "5 1 */2 * *");
$queue->createHttpJob("http://example.com/jobs/somejob.php", $params, $options);
Copier après la connexion
Copier après la connexion

Exemple étendu

Supposons que votre application Web doit générer et envoyer un ensemble de rapports en fonction de la demande de l'utilisateur. En règle générale, comme PHP ne prend pas en charge le multiprocessement et utilise un modèle de communication synchrone, les utilisateurs doivent attendre que tous les rapports demandés soient générés un par un et envoyer des e-mails. L'utilisation de la file d'attente de travaux dans ce cas permet non seulement à l'utilisateur d'effectuer d'autres opérations de l'application (car le travail sera effectué de manière asynchrone), mais l'application peut traiter plusieurs rapports simultanément (car le travail peut être exécuté en parallèle) - donc la plupart des rapports, sinon tous, seront terminés à peu près le même temps.

<?php
try {
    doSomething();
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK);
}
catch (Exception $e) {
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::STATUS_LOGICALLY_FAILED, $e->getMessage());
}
Copier après la connexion
Copier après la connexion
La fonction ScheduleReport () renvoie une liste des identifiants de travail associés à chaque rapport planifié. Dans cette fonction, la méthode isJobqueuedAemrunning () de la classe ZendJobqueue vérifie si le service correspondant est en cours d'exécution et si le travail peut être planifié. Selon la priorité du rapport, le travail peut être planifié pour s'exécuter immédiatement ou après deux minutes (afin de réduire la charge sur le serveur si de nombreux rapports sont demandés en même temps). Une fois le travail prévu, son identifiant est enregistré sur la liste de tous les travaux créés avec succès. Il est très important de comprendre l'identification de l'emploi pour pouvoir surveiller les emplois ou même annuler des emplois. Voici à quoi ressemble l'appel à la fonction ScheduleReport ():

<?php
function scheduleReport($reportList, $recipient) {
    // 已调度作业列表
    $jobList = array();

    $queue = new ZendJobQueue();

    // 检查Job Queue是否正在运行
    if ($queue->isJobQueueDaemonRunning() && count($reportList) > 0) {
        foreach ($reportList as $report) {
            $params = array("type" => $report["type"],
                            "start" => $report["start"],
                            "length" => $report["length"],
                            "recipient" => $recipient);
            $options = array("priority" => $report["priority"]);

            // 除非优先级为紧急,否则在两分钟内执行作业
            if ($report["priority"] != ZendJobQueue::PRIORITY_URGENT) {
                $options["schedule_time"] = date("Y-m-d H:i:s", strtotime("+2 minutes"));
            }

            $jobID = $queue->createHttpJob("http://example.com/jobs/report.php", $params, $options);

            // 将作业ID添加到已成功调度作业的列表中
            if ($jobID !== false) {
                $jobList[] = $jobID;
            }
        }
    }

    return $jobList;
}
Copier après la connexion
Comme mentionné précédemment, les travaux prévus peuvent également être annulés. Cependant, une fois le travail en cours, il sera achevé. Par conséquent, si la priorité demandée n'est pas urgente, l'utilisateur a deux minutes pour annuler la livraison des rapports planifiés.

La fonction
<?php
// 设置每日销售报告和每月财务报告的请求
$reportList = array(
    array("type" => "sales",
          "start" => "2011-12-09 00:00:00",
          "length" => 1,
          "priority" => ZendJobQueue::PRIORITY_URGENT),
    array("type" => "finance",
          "start" => "2011-11-01 00:00:00",
          "length" => 30,
          "priority" => ZendJobQueue::PRIORITY_NORMAL));

// 调度报告
$jobList = scheduleReport($reportList, "user@example.com");

// 验证报告是否已调度
if (empty($jobList)) {
    // 显示错误消息
}
Copier après la connexion
CancelReport () supprime simplement le travail de la file d'attente de rapport planifiée qui n'a pas commencé à s'exécuter. Ensuite, le script de travail ressemble à ceci:

La fonction
<?php
function cancelReport($jobID) {
    $queue = new ZendJobQueue();
    return $queue->removeJob($jobID);
}

if ($jobID !== false && cancelReport($jobID)) {
    // 作业已成功从队列中删除
}
Copier après la connexion
runReport () prépare et envoie enfin des rapports en fonction des paramètres fournis. Une fois terminé, l'état du travail est défini sur le succès (échec logique si une erreur se produit).

Alternatives

Bien sûr, il existe des alternatives à la file d'attente d'emplois. Cron, PCNTL_FORK et même des solutions basées sur Java via le pont PHP / Java peuvent être utiles, selon vos besoins. Il existe des outils plus intéressants, tels que Gearman, Node.js et Rabbitmq.

Résumé

Bien que la file d'attente de travaux de Zend Server ne soit pas le seul moyen de gérer les files d'attente et le traitement parallèle dans PHP, c'est une solution extrêmement simple, prise en charge par "la société PHP" et est très facile à utiliser. Le phpcloud de Zend étant de plus en plus réussi, l'adoption de la file d'attente de l'emploi devrait être plus étendue. Si vous souhaitez voir le contenu complet de l'exemple de code de cet article, vous pouvez le trouver sur GitHub. images de Varina et Jay Patel / Shutterstock

FAQ sur la file d'attente Zend (FAQ)

Quelles sont les principales fonctions de la file d'attente Zend?

La file d'attente Zend est un composant du framework Zend qui fournit une API simple pour divers systèmes de file d'attente. Il permet aux développeurs de créer, gérer et traiter des données ou des files d'attente de tâches de manière asynchrone. Cela signifie que les tâches peuvent être exécutées en arrière-plan, améliorant ainsi les performances et l'expérience utilisateur de l'application Web. Il prend en charge plusieurs backends, tels que le tableau, SQLite, etc.

Comment la file d'attente Zend améliore-t-elle les performances des applications Web?

La file d'attente Zend améliore les performances des applications Web en permettant un traitement asynchrone des tâches. Cela signifie que la tâche peut être exécutée en arrière-plan sans bloquer le fil d'exécution principal. Cela peut améliorer considérablement la réactivité des applications Web, car les utilisateurs n'ont pas à attendre que la tâche se termine avant de continuer à interagir avec l'application.

Comment créer une nouvelle file d'attente dans la file d'attente Zend?

Pour créer une nouvelle file d'attente dans la file d'attente Zend, vous pouvez utiliser la méthode CreateQueue. Cette méthode nécessite deux paramètres: le nom de la file d'attente et le délai d'attente. Le paramètre de délai d'expiration est facultatif et par défaut nul. Voici un exemple:

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Comment ajouter un message à une file d'attente dans la file d'attente Zend?

Pour ajouter des messages à une file d'attente dans la file d'attente Zend, vous pouvez utiliser la méthode d'envoi. Cette méthode nécessite un paramètre: le message est ajouté à la file d'attente. Voici un exemple:

<?php
// 这两个调用是等效的
$queue->createHttpJob("/jobs/somejob.php");
$queue->createHttpJob("http://" . $_SERVER["HTTP_HOST"] . "/jobs/somejob.php");
Copier après la connexion
Copier après la connexion
Copier après la connexion

Comment traiter les messages à partir de files d'attente dans la file d'attente Zend?

Pour traiter les messages à partir de files d'attente dans la file d'attente Zend, vous pouvez utiliser la méthode de réception. Cette méthode récupère un ensemble de messages de la file d'attente pour le traitement. Voici un exemple:

<?php
$params = ZendJobQueue::getCurrentJobParams();
Copier après la connexion
Copier après la connexion
Copier après la connexion

Comment supprimer une file d'attente dans la file d'attente Zend?

Pour supprimer une file d'attente dans la file d'attente Zend, vous pouvez utiliser la méthode Deletequeue. Cette méthode nécessite un paramètre: le nom de la file d'attente est supprimé. Voici un exemple:

<?php
$params = array("p1" => 10, "p2" => "somevalue");

// 一小时后处理
$options = array("schedule_time" => date("Y-m-d H:i:s", strtotime("+1 hour")));
$queue->createHttpJob("http://example.com/jobs/somejob.php", $params, $options);

// 每隔一天凌晨1:05处理
$options = array("schedule" => "5 1 */2 * *");
$queue->createHttpJob("http://example.com/jobs/somejob.php", $params, $options);
Copier après la connexion
Copier après la connexion

Comment vérifier si une file d'attente existe dans la file d'attente Zend?

Pour vérifier si la file d'attente existe dans la file d'attente Zend, vous pouvez utiliser la méthode iSexistes. Cette méthode nécessite un paramètre: le nom de la file d'attente à vérifier. Voici un exemple:

<?php
try {
    doSomething();
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK);
}
catch (Exception $e) {
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::STATUS_LOGICALLY_FAILED, $e->getMessage());
}
Copier après la connexion
Copier après la connexion

Comment calculer le nombre de messages dans une file d'attente dans une file d'attente Zend?

Pour calculer le nombre de messages dans une file d'attente dans une file d'attente Zend, vous pouvez utiliser la méthode du nombre. Cette méthode renvoie le nombre de messages dans la file d'attente. Voici un exemple:

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Comment effacer tous les messages dans les files d'attente dans la file d'attente Zend?

Pour effacer tous les messages dans la file d'attente dans la file d'attente Zend, vous pouvez utiliser la méthode Purge. Cette méthode supprime tous les messages dans la file d'attente. Voici un exemple:

<?php
// 这两个调用是等效的
$queue->createHttpJob("/jobs/somejob.php");
$queue->createHttpJob("http://" . $_SERVER["HTTP_HOST"] . "/jobs/somejob.php");
Copier après la connexion
Copier après la connexion
Copier après la connexion

Comment définir le temps mort des files d'attente dans la file d'attente Zend?

Pour définir l'heure du délai d'expiration pour une file d'attente dans la file d'attente Zend, vous pouvez utiliser la méthode Settimeout. Cette méthode nécessite deux paramètres: le nom de la file d'attente et le délai d'expiration en secondes. Voici un exemple:

<?php
$params = ZendJobQueue::getCurrentJobParams();
Copier après la connexion
Copier après la connexion
Copier après la connexion

Veuillez noter que l'exemple de code ci-dessus est basé sur Zend_queue, et non sur la file d'attente de travail Zend mentionnée dans l'article. L'API de la file d'attente de travaux Zend peut être légèrement différente, vous devez donc vous référer à la documentation officielle du serveur Zend.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal