3

GearmanとGearmanManagerのサイクル全体はまだ初めてです。サーバーが動作していて、サーバーの起動時にジョブがすでにキュー(MySQLテーブル)にあるかどうかを確認しました。ただし、PHPから、可能であればワーカーの内部から、キューに新しいジョブを追加できる必要があります。

現在、新しいコードベースの展開で作成する仕事があります。これは実行する最初のジョブであり、その目的はレポート用のデータを収集して保存することです。

これは毎正時に実行する必要があるので、このwhen_to_runコラムを利用したいと思います。Gearmanのドキュメントを熟考してきましたが、実際にキューにジョブを追加する方法についてはまだ混乱しています。

私は実行してみました:

<?php
$gm = new GearmanClient;
$gm->addServer();
$gm->doBackground('Metadata_Ingest_Report', '', com_create_guid());

ちなみに、はい、php-pecl-uuidをインストールしています。

上記のコードはハングし、何もしません。DBにジョブが追加されることはなく、何も起こりません。

これは、仕事がどのように送られるかを完全に理解しておらず、RTMに最善を尽くしているためですが、運がありません。

したがって、私に指摘できることがある場合、または誰かがMySQLキューにジョブをセットアップして追加する方法を説明する時間があれば、GearmanManagerのワーカーがそれらをピックアップするのは素晴らしいことです。

編集:したがって、を呼び出す必要があるよう$gm->addServer('127.0.0.1')です。ドキュメントによると127.0.0.1、デフォルトであると想定されていますが、PHP5.4.11を実行している場合はそうではないようです。$gm->runTasks()の後に呼び出すと、タスクを実行できるようになりました$gm->addTask()。呼び出すだけ$gm->addTask()で、タスクがDBに追加され、GearmanManagerがそれを確認してスプールします。まだ掘っています...

よろしく、
アンドリュー

4

2 に答える 2

4

したがって、when_to_run機能はに公開されていないようpecl-gearmanです。このため、組み込みメソッドを使用して将来のジョブをスケジュールすることはできません。また、ライブラリがDBレコードを本来のように作成していないようです(これは、実際には、実行前にジョブをDBにオフロードしていないGearmandである可能性があります。

これを回避するために、次のことを行うことにしました。

将来のジョブのスケジューリング

  1. 手動でジョブをに挿入しgearman_queueます。
  2. 毎分CRONを実行して、キューテーブルにpingを実行し、when_to_run <= time()
  3. addTask($function, $payload)およびを介してこれらのジョブを起動しrunTasks()ます。には、DBからの$payloadUUIDも含まれています。
  4. GearmanManagerはジョブを取得し、ペイロードをそれぞれのワーカーに渡します。
  5. ワーカーが実行され、完了すると、。を使用してDBからアイテムが削除されますDELETE

すぐにジョブを実行する

  1. gearmand_queueのを使用してジョブを手動でINSERTしwhen_to_runますNULL
  2. 実行addTask($function, $payload)してrunTasks()。には、DBからの$payloadUUIDも含まれています。
  3. GearmanManagerは仕事を引き受け、ペイロードを彼らの抵抗力のある労働者に渡します。
  4. ワーカーが実行され、完了すると、。を使用してDBからアイテムが削除されますDELETE

結論

Gearmand Job Server、GearmanManager、およびpecl-gearmanはすべて、サポートされているものとその実行方法に関して同期がとれていないようです。ほとんどの場合、この問題はpecl-gearmanがGearmandと話しているコアの中にあると思います。

また、pecl-gearmanプロジェクトで次の機能リクエストを開きましたwhen_to_runhttps ://bugs.php.net/bug.php?id = 64120

于 2013-02-04T19:20:31.270 に答える
0

タスクを追加する前に、ギアマンサーバーを起動します。

Linuxの場合:

/usr/bin/gearmand -d  -L 127.0.0.1 -q libdrizzle /
--libdrizzle-user=your_db_user --libdrizzle-password=your_db_pass /
--libdrizzle-db=your_db_name --libdrizzle-mysql -vvvv

タスクを追加した後、worker.phpのようなワーカーを作成します。

<?php

$worker= new GearmanWorker(); 

$worker->addServer(); 

while ($worker->work());

function Metadata_Ingest_Report( $job )
{ 
    // do something
}

そしてこの労働者を始める

/usr/bin/php worker.php
于 2013-02-04T14:10:42.370 に答える