ホームページ >バックエンド開発 >PHPチュートリアル >Zendジョブキューを使用したスケジューリング

Zendジョブキューを使用したスケジューリング

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌オリジナル
2025-03-01 10:21:11211ブラウズ

タスクスケジューリングにZendジョブキューを使用します

Scheduling with Zend Job Queue

コアポイント

  • Zend Serverのジョブキューモジュールは、非対話的および長期にわたるタスクの非同期実行を可能にし、並列操作、タスクの遅延または定期的な実行をサポートし、GUIを通じて管理されます。
  • ジョブキューAPIは、Zendjobqueueクラスを通じてアクセスできます。これにより、ジョブの作成、パラメーターの合格、優先度、永続性、スケジューリングなどの他のジョブオプションの設定が可能になります。
  • 拡張例に示すように、ジョブキューを使用してユーザーエクスペリエンスを向上させ、アプリケーションの効率を向上させることができ、タスクを並行してスケジュールおよび実行してユーザーの待機時間を短縮できます。
  • PHPのキューと並列処理を処理する他の代替手段がありますが(例:Cron、Pcntl_fork、Gearman、node.js、rabbitmq)、Job Queueはシンプルで使いやすいソリューションを提供します。

ほとんどのWebアプリケーションは、同期通信モデルに従います。ただし、非同期および長期にわたるタスク(レポート生成など)は、非同期実行により適しています。タスクを後でオフロードするか、異なるサーバーで実行する1つの方法は、Zend Server 5で提供されているジョブキューモジュールを使用することです(ただし、コミュニティエディションには含まれていません)。ジョブキューを使用すると、時間、優先度、さらには依存関係に基づいてジョブスケジューリングが可能になります。ジョブは定期的に遅延または実行することができ、最も重要なことに、並行して実行できます!最も重要なことは、Zend Server自体が、そのステータス、実行時間、出力など、ジョブの実行を追跡するための管理GUIを提供することです。ジョブキューモジュールの主な利点は、タスクを並行して実行する機能にあります。 Cron Jobsとは異なり、ジョブキューは以下を許可します

    タスクが(非同期的に)完了するのを待たずにタスクを実行します
  • タスクを一度実行しますが、すぐにはありません(ジョブの遅延)
  • タスクを定期的に実行します(Cronでの繰り返しのジョブと同様ですが、PHP APIを介して完全に制御できます - 開始、停止、一時停止、履歴書)
  • APIを介したジョブステータスのクエリ、障害を処理し、必要とし、過去、現在、保留中のジョブをGUIで追跡します。
非同期タスクに使用できるジョブキューの例には、次のものがあります。

次のリクエストのためにデータを準備(事前に計算)
  • precache data
  • 定期的なレポートを生成します
  • メールを送信します
  • 一時的なデータまたはファイルをクリーンにします
  • 外部システムと通信
  • バックエンドデータをモバイルデバイスと同期します
ジョブキューの使用方法

ジョブキューのAPIは、zendjobqueueクラスで使用できます。ほとんどのタスクを実行するには、Zendjobqueueオブジェクトをインスタンス化し、createhttpjob()メソッドを使用してジョブを作成することにより、ジョブキューサーバーに接続します。

完全なURLの代わりにcreatehttpjob()にパスを通過すると、ホスト名$ _server ["http_host"]の値でジョブが作成されます。 $ _server ["http_host"]は、Cronスクリプトからジョブをスケジュールするときなど、利用できないことに注意してください。

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");

ジョブパラメーターは、クエリ文字列の一部として、またはcreatehttpjob()の2番目のパラメーターとして配列として渡すことができます。引数が2番目の引数として渡された場合、配列はJSON互換でなければなりません。ジョブコードのパラメーターにアクセスするには、getCurrentJobParams()staticメソッドを使用できます。

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

その他のジョブオプションは、createhttpjob()の3番目のパラメーターを使用して使用できます。これは、次のキーを含む連想配列です。

    名前 - オプションのジョブ名
  • 優先度 - 職務優先度、対応する定数優先_low、priority_normal、priority_high、priority_urgentで定義
  • 永続的 - 職業履歴が常に保存されているかどうかを示すブール値
  • 前身 - 整数の前身ジョブID
  • http_headers - 添付のHTTPヘッダー
  • スケジュール-CRONスタイルのスケジュールコマンド
  • schedule_time - ジョブを実行する必要があります(ただし、ジョブキューの負荷に応じて、実際に実行される可能性があります)
  • たとえば、
  • ジョブや重複したジョブを作成すると、次のようになります。

失敗(および成功)は、次のように処理できます

<?php
$params = ZendJobQueue::getCurrentJobParams();

拡張例

<?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);

ユーザーのリクエストに基づいて、Webアプリケーションが一連のレポートを生成して送信する必要があると仮定します。通常、PHPはマルチプロセスをサポートせず、同期通信モデルを使用するため、ユーザーは要求されたすべてのレポートが1つずつ生成されるのを待ってメールを送信する必要があります。この場合のジョブキューを使用すると、ユーザーがアプリケーションの他の操作を実行できるだけでなく(作業が非同期に行われるため)、アプリケーションは複数のレポートを同時に処理できます(ジョブは並行して実行できるため) - ほとんどのレポートはほぼ同時に完了します。 ScheduleReport()関数は、スケジュールされた各レポートに関連付けられたジョブ識別子のリストを返します。この関数では、ZendjobqueueクラスのIsjo​​bqueuedaemonrunning()メソッドは、対応するサービスが実行されているかどうか、ジョブをスケジュールできるかどうかを確認します。レポートの優先順位に応じて、ジョブはすぐにまたは2分後に実行するようにスケジュールできます(多くのレポートが同時に要求された場合、サーバーの負荷を減らすため)。ジョブがスケジュールされた後、そのIDは、すべての成功裏に作成されたジョブのリストに保存されます。ジョブIDを理解することは、ジョブを監視したり、ジョブをキャンセルできるために非常に重要です。スケジュールポート()関数への呼び出しが次のようになります。

前述のように、スケジュールされたジョブもキャンセルできます。ただし、ジョブが進行中に完了します。したがって、要求された優先度が緊急でない場合、ユーザーはスケジュールされたレポートの配信をキャンセルするために2分かかります。

<?php
try {
    doSomething();
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK);
}
catch (Exception $e) {
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::STATUS_LOGICALLY_FAILED, $e->getMessage());
}
cancelReport()関数は、実行を開始していないスケジュールされたレポートキューからジョブを削除するだけです。次に、ジョブスクリプトは次のようになります:

<?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;
}
runReport()関数は、最終的に提供されたパラメーターに基づいてレポートを準備して送信します。完了後、ジョブステータスは成功に設定されます(エラーが発生した場合は論理的な障害)。

<?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)) {
    // 显示错误消息
}
代替

もちろん、ジョブキューに代わるものがあります。 Cron、PCNTL_FORK、さらにはPHP/Javaブリッジを介したJavaベースのソリューションでさえ、ニーズに応じて検討する価値があります。 Gearman、Node.js、Rabbitmqなど、より興味深いツールが存在します。

概要

Zend Serverのジョブキューは、PHPでキューと並列処理を処理する唯一の方法ではありませんが、「The PHP Company」でサポートされている非常に簡単なソリューションであり、非常に使いやすいです。 Zendのphpcloudがより成功するにつれて、ジョブキューの採用はより広範になるはずです。この記事でサンプルコードの完全な内容を表示したい場合は、GitHubで見つけることができます。 VarinaとJay Patel/Shutterstockの写真

Zend Queue(FAQ)

についてのFAQ

Zendキューの主な機能は何ですか?

Zend Queueは、さまざまなキューイングシステムにシンプルなAPIを提供するZendフレームワークのコンポーネントです。開発者は、データまたはタスクキューを非同期に作成、管理、および処理できます。これは、タスクをバックグラウンドで実行できるため、Webアプリケーションのパフォーマンスとユーザーエクスペリエンスが向上することを意味します。配列、SQLiteなどの複数のバックエンドをサポートします。

ZendキューはWebアプリケーションのパフォーマンスをどのように改善しますか?

Zendキューは、タスクの非同期処理を許可することにより、Webアプリケーションのパフォーマンスを向上させます。これは、メインの実行スレッドをブロックすることなく、タスクをバックグラウンドで実行できることを意味します。これにより、ユーザーはアプリケーションと対話し続ける前にタスクが完了するのを待つ必要がないため、Webアプリケーションの応答性を大幅に改善できます。

Zendキューで新しいキューを作成する方法は?

Zendキューで新しいキューを作成するには、CreateQueueメソッドを使用できます。この方法には、キューの名前とタイムアウトの2つのパラメーターが必要です。タイムアウトパラメーターはオプションで、デフォルトはnullになります。例は次のとおりです。

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");
Zendキューのキューにメッセージを追加する方法は?

Zendキューのキューにメッセージを追加するには、Sendメソッドを使用できます。この方法には、パラメーターが必要です。メッセージをキューに追加します。例は次のとおりです。

<?php
// 这两个调用是等效的
$queue->createHttpJob("/jobs/somejob.php");
$queue->createHttpJob("http://" . $_SERVER["HTTP_HOST"] . "/jobs/somejob.php");
Zend Queueでキューからメッセージを処理する方法は?

Zend Queueのキューからのメッセージを処理するには、受信方法を使用できます。このメソッドは、処理のためにキューから一連のメッセージを取得します。例は次のとおりです。

<?php
$params = ZendJobQueue::getCurrentJobParams();
Zendキューでキューを削除する方法は?

Zendキューでキューを削除するには、Deletequeueメソッドを使用できます。この方法には、パラメーターが必要です。キューの名前を削除します。例は次のとおりです。

<?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);
Zendキューにキューが存在するかどうかを確認する方法は?

キューがZendキューに存在するかどうかを確認するには、Isexistsメソッドを使用できます。この方法には、1つのパラメーターが必要です。チェックするキューの名前。例は次のとおりです。

<?php
try {
    doSomething();
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK);
}
catch (Exception $e) {
    ZendJobQueue::setCurrentJobStatus(ZendJobQueue::STATUS_LOGICALLY_FAILED, $e->getMessage());
}
Zendキュー内のキュー内のメッセージの数を計算する方法は?

Zendキュー内のキュー内のメッセージの数を計算するには、Countメソッドを使用できます。このメソッドは、キュー内のメッセージの数を返します。例は次のとおりです。

<?php
$queue = new ZendJobQueue();
$queue->createHttpJob("http://example.com/jobs/somejob.php");

Zend Queueのキュー内のすべてのメッセージをクリアする方法は?

Zendキュー内のキュー内のすべてのメッセージをクリアするには、パージメソッドを使用できます。このメソッドは、キュー内のすべてのメッセージを削除します。例は次のとおりです。

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

Zendキューでキューのタイムアウト時間を設定するにはどうすればよいですか?

Zendキューのキューのタイムアウト時間を設定するには、SettimeOutメソッドを使用できます。この方法には、キューの名前とタイムアウトの2つのパラメーターが必要です。例は次のとおりです。

<?php
$params = ZendJobQueue::getCurrentJobParams();

上記のコードの例は、記事に記載されているZendジョブキューではなく、Zend_Queueに基づいていることに注意してください。 ZendジョブキューのAPIはわずかに異なる場合があるため、Zendサーバーの公式ドキュメントを参照する必要があります。

以上がZendジョブキューを使用したスケジューリングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。