Heim >Backend-Entwicklung >PHP-Tutorial >Planen mit Zend Job -Warteschlange
Verwenden Sie Zend Job -Warteschlange für die Aufgabenplanung
Kernpunkte
Die meisten Webanwendungen folgen einem synchronen Kommunikationsmodell. Nicht interaktive und langlebige Aufgaben (z. B. die Erzeugung der Berichtsberichte) sind jedoch besser für eine asynchrone Ausführung geeignet. Eine Möglichkeit, Aufgaben auf eine spätere Zeit zu laden oder sogar auf verschiedenen Servern auszuführen, besteht darin, das in Zend Server 5 bereitgestellte Job -Warteschlangenmodul zu verwenden (aber nicht in der Community -Ausgabe enthalten). Die Job -Warteschlange ermöglicht die Arbeitsplanung auf der Grundlage von Zeit, Priorität und sogar Abhängigkeiten. Jobs können regelmäßig verzögert oder ausgeführt werden und - vor allem - können parallel geführt werden! Am wichtigsten ist, dass Zend Server selbst eine Verwaltungs -GUI zur Verfolgung der Arbeitsplatzausführung bietet, einschließlich des Status, seiner Ausführungszeit und seiner Ausgabe. Der Hauptvorteil des Job -Warteschlangenmoduls liegt in seiner Fähigkeit, parallele Aufgaben auszuführen. Im Gegensatz zu Cron -Jobs erlaubt die Job -Warteschlange:
Einige Beispiele dafür, welche Jobwarteschlangen für asynchrone Aufgaben verwendet werden können, gehören:
wie man Jobwarteschlange verwendet
Die API von Job Queue kann über die Zendjobqueue -Klasse verwendet werden. Um die meisten Aufgaben auszuführen, stellen Sie eine Verbindung zum Job -Warteschlangenserver her, indem Sie das Zendjobqueue -Objekt instanziieren und einen Job mithilfe der Methode createHttpjob () erstellen.
<?php $queue = new ZendJobQueue(); $queue->createHttpJob("http://example.com/jobs/somejob.php");
Übergeben des Pfades zum Erstellen von CreateHttpjob () anstelle der vollständigen URL erstellt einen Job mit dem Wert des Hostnamens $ _server ["http_host"]. Beachten Sie, dass $ _server ["http_host"] nicht verfügbar ist, z. B. bei der Planung eines Jobs aus einem Cron -Skript.
<?php $queue = new ZendJobQueue(); $queue->createHttpJob("http://example.com/jobs/somejob.php");
Jobparameter können als Teil der Abfragezeichenfolge oder als zweiter Parameter von CreateHttpjob () als Array übergeben werden. Wenn das Argument als zweites Argument verabschiedet wird, muss das Array JSON -kompatibel sein. Um auf Parameter im Jobcode zuzugreifen, können Sie die statische Methode getCurrentjobParams () verwenden.
<?php // 这两个调用是等效的 $queue->createHttpJob("/jobs/somejob.php"); $queue->createHttpJob("http://" . $_SERVER["HTTP_HOST"] . "/jobs/somejob.php");
Andere Joboptionen können über den dritten Parameter createHttpjob () verwendet werden. Es ist ein assoziatives Array, das die folgenden Schlüssel enthält:
Zum Beispiel sieht das Erstellen eines verzögerten Jobs oder eines doppelten Jobs wie folgt aus:
<?php $params = ZendJobQueue::getCurrentJobParams();
fehlgeschlagen (und erfolgreich) kann wie folgt behandelt werden:
<?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);
erweitertes Beispiel
Angenommen, Ihre Webanwendung muss basierend auf der Anfrage des Benutzers eine Reihe von Berichten generieren und senden. Da PHP keine Multiprozessierung unterstützt und ein synchrones Kommunikationsmodell verwendet, müssen Benutzer auf alle angeforderten Berichte warten, die einzeln generiert werden und E -Mails senden. Durch die Verwendung von Job -Warteschlangen in diesem Fall kann der Benutzer nicht nur andere Vorgänge der Anwendung ausführen (da die Arbeit asynchron erledigt wird), sondern die Anwendung kann auch mehrere Berichte gleichzeitig verarbeiten (da der Job parallel ausgeführt werden kann) - die meisten Berichte, wenn nicht alle, werden zur gleichen Zeit ausgeführt.
<?php try { doSomething(); ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK); } catch (Exception $e) { ZendJobQueue::setCurrentJobStatus(ZendJobQueue::STATUS_LOGICALLY_FAILED, $e->getMessage()); }
Die Funktion ScheduleReport () gibt eine Liste der mit jedem geplanten Bericht verknüpften Stellenbeschreibungen zurück. In dieser Funktion prüft die isjobquedaemonrunning () -Methode der Zendjobqueue -Klasse, ob der entsprechende Dienst ausgeführt wird und ob der Job geplant werden kann. Abhängig von der Priorität des Berichts kann der Auftrag sofort oder nach zwei Minuten ausgeführt werden (um die Last auf dem Server zu reduzieren, wenn viele Berichte gleichzeitig angefordert werden). Nachdem der Job geplant ist, wird seine ID auf die Liste aller erfolgreich erstellten Jobs gespeichert. Das Verständnis der Job -ID ist sehr wichtig, um Jobs zu überwachen oder sogar Arbeitsplätze zu stornieren. So sieht der Anruf in die Funktion planereport () aus:
<?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; }
Wie bereits erwähnt, können auch geplante Jobs storniert werden. Sobald der Job jedoch im Gange ist, wird er abgeschlossen sein. Wenn die angeforderte Priorität nicht dringend ist, hat der Benutzer zwei Minuten Zeit, um die Zustellung geplanter Berichte zu stornieren.
<?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)) { // 显示错误消息 }Die Funktion
covornReport () löscht den Job einfach aus der geplanten Berichtswarteschlange, die nicht ausgeführt wurde. Dann sieht das Jobskript so aus:
<?php function cancelReport($jobID) { $queue = new ZendJobQueue(); return $queue->removeJob($jobID); } if ($jobID !== false && cancelReport($jobID)) { // 作业已成功从队列中删除 }Die Funktion
runReport () erstellt und sendet Berichte basierend auf den bereitgestellten Parametern. Nach Abschluss wird der Jobstatus auf den Erfolg festgelegt (logischer Fehler, wenn ein Fehler auftritt).
Alternativen
Natürlich gibt es Alternativen zur Berufswarteschlange. Cron, PCNTL_Fork und sogar Java-basierte Lösungen über PHP/Java Bridge können je nach Ihren Anforderungen betrachtet werden. Es gibt mehr interessante Werkzeuge wie Gearman, Node.js und Rabbitmq.
Zusammenfassung
Während Zend Servers Job -Warteschlange nicht die einzige Möglichkeit ist, Warteschlangen und parallele Verarbeitung in PHP zu bewältigen, ist es eine äußerst einfache Lösung, die von "The PHP Company" unterstützt wird und sehr einfach zu bedienen ist. Da Zends PhpCloud erfolgreicher wird, sollte die Adoption von Job -Warteschlangen umfangreicher sein. Wenn Sie den vollständigen Inhalt des Beispielcode in diesem Artikel sehen möchten, finden Sie ihn auf GitHub. Bilder von Varina und Jay Patel/Shutterstock
FAQs über Zend Queue (FAQ)
Zend Queue ist eine Komponente des Zend -Frameworks, die eine einfache API für verschiedene Warteschlangensysteme liefert. Es ermöglicht Entwicklern, Daten oder Task -Warteschlangen asynchron zu erstellen, zu verwalten und zu verarbeiten. Dies bedeutet, dass Aufgaben im Hintergrund ausgeführt werden können, wodurch die Leistung und Benutzererfahrung der Webanwendung verbessert werden. Es unterstützt mehrere Backends wie Array, SQLite usw.
Zend Queue verbessert die Leistung von Webanwendungen, indem sie eine asynchrone Verarbeitung von Aufgaben ermöglicht. Dies bedeutet, dass die Aufgabe im Hintergrund ausgeführt werden kann, ohne den Hauptausführungs -Thread zu blockieren. Dies kann die Reaktionsfähigkeit von Webanwendungen erheblich verbessern, da Benutzer nicht warten müssen, bis die Aufgabe abgeschlossen ist, bevor sie weiter mit der Anwendung interagieren.
Um eine neue Warteschlange in Zend Queue zu erstellen, können Sie die CreateQueue -Methode verwenden. Diese Methode erfordert zwei Parameter: den Namen der Warteschlange und das Timeout. Der Zeitüberschreitungsparameter ist optional und standardmäßig null. Hier ist ein Beispiel:
<?php $queue = new ZendJobQueue(); $queue->createHttpJob("http://example.com/jobs/somejob.php");
Um eine Warteschlange in Zend Warteschlange hinzuzufügen, können Sie die Sendenmethode verwenden. Diese Methode erfordert einen Parameter: Die Meldung wird der Warteschlange hinzugefügt. Hier ist ein Beispiel:
<?php // 这两个调用是等效的 $queue->createHttpJob("/jobs/somejob.php"); $queue->createHttpJob("http://" . $_SERVER["HTTP_HOST"] . "/jobs/somejob.php");
Um Nachrichten aus Warteschlangen in Zend Queue zu verarbeiten, können Sie die Empfangsmethode verwenden. Diese Methode ruft einen Satz von Nachrichten aus der Warteschlange zur Verarbeitung ab. Hier ist ein Beispiel:
<?php $params = ZendJobQueue::getCurrentJobParams();
Um eine Warteschlange in Zend Queue zu löschen, können Sie die Deletequeue -Methode verwenden. Diese Methode erfordert einen Parameter: den Namen der zu löschenden Warteschlange. Hier ist ein Beispiel:
<?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);
Um zu überprüfen, ob die Warteschlange in der Zend -Warteschlange vorhanden ist, können Sie die ISExists -Methode verwenden. Diese Methode erfordert einen Parameter: den Namen der Warteschlange, die überprüft werden soll. Hier ist ein Beispiel:
<?php try { doSomething(); ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK); } catch (Exception $e) { ZendJobQueue::setCurrentJobStatus(ZendJobQueue::STATUS_LOGICALLY_FAILED, $e->getMessage()); }
Um die Anzahl der Nachrichten in einer Warteschlange in einer Zend -Warteschlange zu berechnen, können Sie die Grafmethode verwenden. Diese Methode gibt die Anzahl der Nachrichten in der Warteschlange zurück. Hier ist ein Beispiel:
<?php $queue = new ZendJobQueue(); $queue->createHttpJob("http://example.com/jobs/somejob.php");
Um alle Nachrichten in der Warteschlange in Zend Queue zu löschen, können Sie die Säuberungsmethode verwenden. Diese Methode löscht alle Nachrichten in der Warteschlange. Hier ist ein Beispiel:
<?php // 这两个调用是等效的 $queue->createHttpJob("/jobs/somejob.php"); $queue->createHttpJob("http://" . $_SERVER["HTTP_HOST"] . "/jobs/somejob.php");
Um die Zeitüberschreitungszeit für eine Warteschlange in Zend Queue festzulegen, können Sie die SetTimeout -Methode verwenden. Diese Methode erfordert zwei Parameter: den Namen der Warteschlange und das Zeitübergang in Sekunden. Hier ist ein Beispiel:
<?php $params = ZendJobQueue::getCurrentJobParams();
Bitte beachten Sie, dass das obige Codebeispiel auf Zend_queue basiert, nicht auf der im Artikel erwähnten Zend -Job -Warteschlange. Die API von Zend Job -Warteschlange ist möglicherweise etwas anders, sodass Sie sich auf die offizielle Dokumentation von Zend Server beziehen müssen.
Das obige ist der detaillierte Inhalt vonPlanen mit Zend Job -Warteschlange. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!