Maison >développement back-end >tutoriel php >Planification avec la file d'attente de l'emploi Zend
Utilisez la file d'attente de travaux zend pour la planification des tâches
Points de base
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:
Certains exemples de la file d'attente de l'emploi peuvent être utilisés pour les tâches asynchrones incluent:
Comment utiliser la file d'attente de travail
L'API de la file d'attentepeut ê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");
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");
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");
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:
par exemple, la création d'un travail retardé ou un travail en double ressemble à ceci:
<?php $params = ZendJobQueue::getCurrentJobParams();
É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);
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()); }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; }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)) { // 显示错误消息 }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)) { // 作业已成功从队列中删除 }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)
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.
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.
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");
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");
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();
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);
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()); }
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");
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");
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();
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!