Php

php-resqueの設計と使用



Design Use Php Resque



php-resque-1.2-注釈付き php-resqueソースプロジェクトを読んでください、私たちはスターを歓迎します

PHPプランの設計

抽象的背景のResqueでは、タスクは3つの役割によって共同で完了します。



  • 仕事|タスク:ジョブはバックグラウンドで必要です。ここで例示されているメールの送信などのタスクは、ジョブとして抽象化できます。ジョブは、のResqueのクラスです。
  • キュー|キュー:つまり、メッセージキューの上、Resqueでは、キューはRedisによって実装されます。 Resqueは、ジョブの挿入/抽出およびキューイングを実装できる単純なキューマネージャーも提供します。
  • 労働者|実行者:ジョブはキューから削除する責任があり、デーモンがバックグラウンドで実行できる方法で実行されます。
    次に、分割に基づいて、基本フローのバックグラウンドタスクは次のようになります。

Resqueには、非常に重要な設計があります。ワーカー、キューを処理でき、キューは多くを処理でき、ワーカープロセス/スレッドを増やすことで実行キューを高速化できます。

プロセスは次のとおりです。



  • 別のクラスとして背景を書くタスク、クラスは仕事です。
  • ローカルデーモンを使用する必要がある場合、システムはキューに入れるために必要なジョブクラス名とパラメータを使用します。
  • コマンドラインワーカー、および必要なプロセスパラメータで指定されたワーカーキューを開きます。
  • デーモンとして実行されているワーカー、およびタイミングがキューをチェックします。
  • そこにあるときのジョブキュー、および削除されたワーカージョブの実行、つまりインスタンス化されたジョブクラスクラスと実行方法。

php-resqueの使用

労働者を書く
php-resqueの事実、簡単な例が示されています。demo/ job.phpファイルは簡単なジョブです。

class PHP_Job { public function perform() { sleep(120) fwrite(STDOUT, 'Hello!') } }

こんにちはこのジョブは120秒でSTDOUTキャラクターに出力されます!

Resqueデザインでは、Jobメソッドを実行する必要があり、Workerはこのメソッドを自動的に実行します。



ジョブエンキュー
php-resqueは、最も単純な挿入キューの実装デモ/queue.phpも示しています。

if(empty($argv[1])) { die('Specify the name of a job to add. e.g, php queue.php PHP_Job') } require __DIR__ . '/init.php' date_default_timezone_set('GMT') Resque::setBackend('127.0.0.1:6379') $args = array( 'time' => time(), 'array' => array( 'test' => 'test', ), ) $jobId = Resque::enqueue('default', $argv[1], $args, true) echo 'Queued job '.$jobId.' '

この例では、queue.php cliはモードを実行する必要があります。cliは最初の引数としてジョブ名を受け取り、insert'default 'キューという名前で、ジョブIDが画面に出力されている間にキューが挿入されました。ターミナルに入る:

cd demo php queue.php PHP_Job

結果は画面に出力を見ることができます:

Queued job 52f5abf5344094efc417e7ea8f1aa083

そのジョブは正常に追加されました。ジョブクラス名一貫して記述したジョブの名前に注意してください:PHP_Job
この時点でredis-cliが接続されています。次の3つのキーを参照してください。

1) 'resque:job:52f5abf5344094efc417e7ea8f1aa083:status' 2) 'resque:queue:default' 3) 'resque:queues'

それぞれ、次のコマンドを使用したタイプを参照してください。

type resque:job:52f5abf5344094efc417e7ea8f1aa083:status type resque:queue:default type resque:queues

タイプはどれですか:文字列/リスト/セット
取得したresque:ジョブ:52f5abf5344094efc417e7ea8f1aa083:ステータスコンテンツビュー:

get resque:job:52f5abf5344094efc417e7ea8f1aa083:status

これは次のようになります。

'{'status':1,'updated':1438095296,'started':1438095296}'

更新された動作ステータスを表すジョブステータスは、更新時刻が開始時刻であることを示します。
情報はジョブ実行ステータスに保存されます。
php-resqueジョブの動作状態の例も参照してください。直接実行します。

php check_status.php 52f5abf5344094efc417e7ea8f1aa083

出力を見ることができます:

Tracking status of 52f5abf5344094efc417e7ea8f1aa083. Press [break] to stop. Status of 52f5abf5344094efc417e7ea8f1aa083 is: 1

作成したばかりのジョブステータス。 In Resque in a Jobには、次の4つの状態があります。

  • Resque_Job_Status :: STATUS_WAITING = 1(待機)
  • Resque_Job_Status :: STATUS_RUNNING = 2(実行中)
  • Resque_Job_Status :: STATUS_FAILED = 3(失敗)
  • Resque_Job_Status :: STATUS_COMPLETE = 4(終了)

resqueを削除します:queue:デフォルトの表示コンテンツ(コードの前に定義されたデフォルトのキューのキー名):

lrange resque:queue:default 0 -1

これは次のようになります。

1) '{'class':'PHP_Job','args':[{'time':1438095296,'array':{'test':'test'}}],'id':'52f5abf5344094efc417e7ea8f1aa083'}'

クラスがジョブクラスを表し、argsパラメータがジョブの実行を示し、idがジョブIDを表す場合、このジョブIDに基づいてクエリ実行状態情報に移動できます。
実行する各ジョブに情報が格納されます。追加するのは1つだけなので、デフォルトのキューは1つの値だけです。

resqueの削除:キューの内容を表示します:

smembers resque:queues

これは次のようになります。

1) 'default'

キューに保存されているすべての名前は次のとおりです。キューは1つしかないため、値は1つだけです。

ワーカーの実行がないため、ジョブまたは待機状態が作成されただけです。
ワーカーを実行する
今回は、demo /resque.phpを直接記述します。

date_default_timezone_set('GMT') require 'job.php' require '../bin/resque'

労働者は少なくとも2つの部分の必要性を見ることができます:

直接ジョブクラスファイルが含まれる場合があります。自動ロードメカニズムphpを使用して、ジョブクラスが適切で自動的にロードできるパスを指定することもできます。
Resqueのデフォルトワーカーで構成:bin / resque
ターミナルで実行されています:

QUEUE=default php resque.php

QUEUEフロント部分は設定された環境変数であり、現在のワーカーのみがデフォルトキューの処理を担当するように指定します。使用することもできます

QUEUE=* php resque.php

すべてのキューを処理します。

出力を実行した後

#!/usr/bin/env php *** Starting worker jun-Ubuntu:23437:*

psコマンドで確認します。

ps aux | grep resque

phpデーモンがすでに実行されていることがわかります

jun 23437 1.0 0.3 314148 14884 pts/16 S+ 23:23 0:00 php resque.php

この時点でredis-cliに接続するには、キーを確認してください。次のキーが表示されます。

1) 'resque:job:52f5abf5344094efc417e7ea8f1aa083:status' 2) 'resque:workers' 3) 'resque:queues' 4) 'resque:worker:jun-Ubuntu:25122:*:started' 5) 'resque:worker:jun-Ubuntu:25122:*'

それぞれの新しいキーがどのタイプであるかを確認してください。

type resque:workers type resque:worker:jun-Ubuntu:25122:*:started type resque:worker:jun-Ubuntu:25122:*

設定されているタイプ/文字列/文字列
内容が取り出されましたが、書き込みコマンドはありません。前の内容を参照してください。
resque:労働者の内容は次のとおりです。

1) 'jun-Ubuntu:25122:*'

これはすべてワーカープロセスIDに保存されます。ワーカーは1つしかないため、値は1つだけです。
resque:ワーカー:jun-Ubuntu:25122: :コンテンツは次のように開始されました(jun-Ubuntuキー入力:25122: ホスト+ワーカープロセスID +キュー名):

'Tue Jul 28 15:29:37 GMT 2015'

ここでは、ジョブの開始時刻に保存されます。
resque:ワーカー:jun-Ubuntu:25122: 次のとおりです(jun-Ubuntuキー入力:25122: ホスト+ワーカープロセスID +キュー名):

'{'queue':'default','run_at':'Tue Jul 28 15:29:37 GMT 2015','payload':{'class':'PHP_Job','args':[{'time':1438097296,'array':{'test':'test'}}],'id':'52f5abf5344094efc417e7ea8f1aa083'}}'

これが、現在実行中のジョブこのワーカーに保存されているすべての情報です。
一方、resque:job:52f5abf5344094efc417e7ea8f1aa083:コンテンツステータスが次のように変更されました。

'{'status':2,'updated':1438097377}'

2つのステータス変更(実行中)a。
コマンドを使用して、ジョブの前に確認できます

php check_status.php 52f5abf5344094efc417e7ea8f1aa083

redis-cliビューキーに接続する前の2分間は、次のキーを参照してください。

1) 'resque:job:52f5abf5344094efc417e7ea8f1aa083:status' 2) 'resque:workers' 3) 'resque:stat:processed' 4) 'resque:stat:processed:jun-Ubuntu:25122:*' 5) 'resque:queues' 6) 'resque:worker:jun-Ubuntu:25122:*:started'

容易さの位置付け、処理、福祉の位置付け、処理:Jun-Team:25122; 文字列タイプは、それぞれ、すべてのワーカーが成功したジョブを実行し、ワーカーの数jun-Ubuntu:25122: 成功したジョブ実行の数。
今回もresqueを表示します:job:52f5abf5344094efc417e7ea8f1aa083:コンテンツのステータスは、の状態4(終了)になることがわかりました。
ジョブビューの前の命令を確認するためにも使用でき、次の結果が得られます。

Status of 52f5abf5344094efc417e7ea8f1aa083 is: 4

これは、タスクの実行が終了したことを意味します。Hello!の出力中に画面に表示されます。

これまでのところ、すべてのプレゼンテーションResqueインスタンスの中で最も単純なものの1つを正常に完了しました。より複雑なケースと残りの問題については、次のログで説明します。

Redisは、コンテンツに対応するキーを要約し、その意味は次のとおりです。

  • resque:workers(set)-すべてのワーカーを格納します。各値は{worker host}:{Process ID}:{name} queueof
  • resque:queues(set)-すべてのキュー名を格納します
  • resque:queue:default(list)-実行を待機しているジョブキューを保存します
  • resque:ジョブ:52f5abf5344094efc417e7ea8f1aa083:ステータス(文字列)-情報が保存されたジョブのステータス
  • resque:stat:processed(string)-ジョブの成功回数を実行するためにすべてのワーカーを保存します
  • resque:stat:processed:jun-Ubuntu:25122:*(文字列)-ジョブの成功回数を実行するためにワーカーを保存します
  • resque:worker:jun-Ubuntu:25122:*:started(文字列)-ワーカーの開始時間を節約します
  • resque:worker:jun-Ubuntu:25122:*(文字列)-現在ワーカーのジョブを実行しているすべての情報を保存します

参考文献からの引用:
PHPの軽量メッセージキュー命令php-resque