根拠:Cron、PHP 5.3(mysqli)、MySQL> 5.1-ほとんどすべてのホスティングに固執するのは簡単です。
タスクを取得(キャプチャ)する操作はアトミック(1つのUPDATE要求)です。 ロックとRCに問題はありません。
ワーカーと優先順位のグループにタスクを分散し、データの配列を実行可能なメソッド(関数)に転送する可能性。
完了したタスクを処理する3つのモード:レコードを別のテーブルに移動し、レコードを削除し、レコードを残して、正常に処理されたものとしてマークします。
不完全なタスクやエラーで処理されたタスクの処理は、開発者の良心にかかっています。
400行のコード(PHPDOCをすべて使用)のすべてについて。
制限:現在の実装は永続的な接続には適していませんが、誰かがそれを必要とする場合、簡単に終了できます。 別の言語に書き換えたい場合でも:)
キューでの非ブロッキング作業の可能性は、UPDATE要求でユーザー変数を使用し、後続の選択で実現します。 このテクニックに記事全体を捧げることはばかげています。 ケースに適用できる最終的な実装は、はるかに優れています(私たちはあなたと一緒に練習していますよね?)。 他のすべての点で、それはグループと優先順位を持つ独占的に古典的なラインナップです。
使用例(クライアント):
$task_server = \DBTaskServer::create('localhost', 'root', '', 'testDB', 'jobs_queue'); $task_server->addTask('mywork', $data);
myworkは、ワーカーが使用できる機能です。 $データの配列が渡されます。 静的クラスメソッドの呼び出しを指定することもできます。
$task_server->addTask('MyWork::doWork', $data);
ワーカーの例:
\DBTaskServer::create('localhost', 'root', '', 'testDB', 'jobs_queue') // . ->setByCLIAgruments($argv) // . ->setMode(\DBTaskServer::MODE_MARK_AS_COMPLETED) // . ->run(); // .
パラメーターを使用してコンソールからワーカーを起動します。
/path/to/script/worker.php [max_tasks_per_lifecycle] [comma_separated_group_ids]
名前が示すように、最初のオプションは、作業を完了する前にワーカーが完了できるタスクの数を示します(もちろん、それらが使用可能な場合を除きます)。2番目のオプションは、このワーカーが処理するタスクのgroup_id値です。 グループが指定されていない場合、ワーカーはグループを処理します。
例:
/path/to/script/worker.php 100 3,5,6
グループ3、5、6から100個のタスクを完了します。
タスクが見つからない場合、ワーカーはすぐに作業を終了します。
クラウンにワーカーを追加します。
0-59/5 * * * * /path/to/script/worker.php 5 3 >/dev/null 2>&1
5分ごとに、group_id = 3で5つのジョブを処理します。
アーカイブには、クライアント、ワーカー、サーバークラス自体(ドキュメント化)、タスクテーブルを含むsqlファイルの例が含まれています。
ここからダウンロードします(最大5kB)。
素敵なコードがあります。