Heim > Backend-Entwicklung > PHP-Tutorial > Planen mit Zend Job -Warteschlange

Planen mit Zend Job -Warteschlange

尊渡假赌尊渡假赌尊渡假赌
Freigeben: 2025-03-01 10:21:11
Original
207 Leute haben es durchsucht

Verwenden Sie Zend Job -Warteschlange für die Aufgabenplanung

Scheduling with Zend Job Queue

Kernpunkte

    Das Job-Warteschlangenmodul von
  • Zend Server ermöglicht eine asynchrone Ausführung nicht-interaktiver und langlebiger Aufgaben, unterstützt parallelen Betrieb, verzögerte oder regelmäßige Ausführung von Aufgaben und wird über die GUI verwaltet.
  • Die API der Jobwarteschlange ist über die Zendjobqueue -Klasse zugänglich, mit der Jobs erstellen, Parameter übergeben und andere Stellenoptionen wie Priorität, Persistenz und Planung festgelegt werden können.
  • Wie in der Erweiterungsbeispiel gezeigt, kann die Jobwarteschlange zur Verbesserung der Benutzererfahrung und zur Verbesserung der Anwendungseffizienz verwendet werden. Aufgaben können parallel geplant und ausgeführt werden, wodurch die Wartezeit der Benutzer verkürzt werden.
  • Während es andere Alternativen gibt, um Warteschlangen und parallele Verarbeitung in PHP (z. B. Cron, PCNTL_FORK, Gearman, Node.js und Rabbitmq) zu handhaben, bietet Job Warteschlange eine einfache und einfach zu verwendende Lösung.

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:

  • Aufgaben ausführen jetzt, ohne darauf zu warten, dass sie (asynchron)
  • abgeschlossen werden,
  • Führen Sie die Aufgabe einmal aus, aber nicht sofort (verzögerter Job)
  • Aufgaben regelmäßig ausführen (ähnlich wie bei wiederholten Jobs in Cron, aber sie können vollständig über die PHP -API kontrolliert werden - Start, Stoppen, Pause, Lebenslauf)
  • Stellen Sie den Jobstatus durch die API, Prozessfehler und Erfordernis und verfolgen Sie die vergangenen, aktuellen und ausstehenden Jobs über die GUI.

Einige Beispiele dafür, welche Jobwarteschlangen für asynchrone Aufgaben verwendet werden können, gehören:
  • Daten für die nächste Anforderung vorbereiten (precalculiert)
  • PRECACHE -Daten
  • Generieren Sie periodische Berichte
  • senden Sie eine E -Mail
  • temporäre Daten oder Dateien reinigen
  • mit externen Systemen kommunizieren
  • Backend -Daten synchronisieren mit mobilen Geräten

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Ü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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Andere Joboptionen können über den dritten Parameter createHttpjob () verwendet werden. Es ist ein assoziatives Array, das die folgenden Schlüssel enthält:

  • Name - optionaler Jobname
  • Priorität - Jobpriorität, definiert durch die entsprechenden Konstanten Priority_low, Priority_Normal, Priority_High und Priority_urgent
  • persistent - Boolescher Wert, der angibt, ob die Arbeitsplatzgeschichte immer erhalten bleibt
  • Vorgänger - Ganzzahl Vorgänger Job ID
  • http_Headers - Angehängte HTTP -Header
  • Zeitplan - Befehl im Cron -Stil
  • Zeitplan_Time - Zeit, die der Job ausgeführt werden sollte (aber gemäß der Last der Jobwarteschlange kann er tatsächlich nach dieser Zeit ausgeführt werden)

Zum Beispiel sieht das Erstellen eines verzögerten Jobs oder eines doppelten Jobs wie folgt aus:
<?php
$params = ZendJobQueue::getCurrentJobParams();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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);
Nach dem Login kopieren
Nach dem Login kopieren

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());
}
Nach dem Login kopieren
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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)) {
    // 显示错误消息
}
Nach dem Login kopieren
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)) {
    // 作业已成功从队列中删除
}
Nach dem Login kopieren
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)

Was sind die Hauptfunktionen der Zend -Warteschlange?

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.

Wie verbessert Zend Queue die Leistung von Webanwendungen?

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.

Wie erstelle ich eine neue Warteschlange in Zend Queue?

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wie füge ich einer Warteschlange in Zend Queue eine Nachricht hinzu?

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wie verarbeitet man Nachrichten aus Warteschlangen in Zend Queue?

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();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wie lösche ich eine Warteschlange in Zend Warteschlange?

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);
Nach dem Login kopieren
Nach dem Login kopieren

Wie kann ich überprüfen, ob in Zend Warteschlange eine Warteschlange existiert?

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());
}
Nach dem Login kopieren
Nach dem Login kopieren

Wie berechnet man die Anzahl der Nachrichten in einer Warteschlange in einer Zend -Warteschlange?

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wie kann man alle Nachrichten in Warteschlangen in Zend Queue löschen?

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");
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wie setzen Sie die Zeitüberschreitungszeit der Warteschlangen in Zend Queue fest?

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();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage