2012-08-05 8 views
19

php-resqueを使用して、サーバ上でffmpeg変換をキューに入れて実行しようとしています。私はそれがどのようにうまくいくのかを広く理解していますが、細部に問題があり、チュートリアルが見つかりません。具体的には、私は自分の職業授業をどこに置くべきか、そして授業を私の労働者に与える方法と私の労働者を始める方法を理解していません。私が読んだところでは、「あなたの申請を進行中にするには、自動ローダーまたはそれを含む職業クラスを労働者に伝えることも含まれています。php-resqueをセットアップして使用する適切な方法は何ですか?

誰かがphp-resqueを使用する全体的な構造を概説できることを望みます。

答えて

35

希望する場所にジョブクラスを配置できます。アプリケーションの構造によって異なります。

たとえば、ジョブ・クラスに

を作成する方法

、のはffmpegの変換に使用するクラスVideoConversionを、としましょう。メインアプリケーションで

class VideoConversion { 

    public function perform() { 
     // The code for video conversion here 
    } 

} 

、PHP-resqueを使用する前に、あなたはその

public function uploadVideo() { 
    // Upload and move the video to a temp folder 
    // Convert the video 
} 

のようなものを持っていて、「ビデオを変換する」の部分をキューにしたいとしましょう。ちょうどconvertキューにキューイングしてみましょう:仕事をキューイングするとき

public function uploadVideo() { 
    // Upload and move the video to a temp folder 
    // Let's suppose you need to convert a 'source video' to a 'destination video' 
    Resque::enqueue('convert', 'VideoConversion', array('origine-video.avi', 'destination-video.avi')); 
} 

、我々はVideoConversionクラスへの送信元と送信先の動画へのパスを通過しました。他の引数を渡すこともできます。これはVideoConversionクラスの記述方法に依存します。

ワーカーはconvertキューをポーリングし、VideoConversionジョブを実行します。作業者が行うことは、VideoConversionクラスをインスタンス化し、perform()メソッドを実行することです。

ジョブ引数(array('origine-video.avi', 'destination-video.avi'))、Resque::enqueueでジョブをキューイング第3引数は、$this->argsを介しperform()方法内側利用できるようになります。

# VideoConversion.php 
class VideoConversion 
{ 
    public function perform() { 
    // $this->args == array('origine-video.avi', 'destination-video.avi'); 
    // Convert the video 
} 

VideoConversionクラスはどこにでも置くことができますが、あなたはどこでそれを見つけるためにあなたの労働者に伝える必要があり、あなたの仕事のクラス

を探します。 はinclude_pathのあなたの.htaccessまたはApacheの設定で

入れますジョブクラスは、インクルードパスにすべてのジョブ・クラスを含むディレクトリを追加することを行うための複数の方法をあります。あなたの労働者は自動的にそれらを見つけるでしょう。

この方法の主な問題は、すべてのジョブクラスが同じフォルダに存在し、すべてのジョブクラスがすべての場所で使用できることです。

はどこジョブ・クラス「オートローダ」を指すようにAPP_INCLUDE引数を使用して、労働者を起動すると、あなたの仕事のクラス

を見つけるために、各作業員に知らせます。

APP_INCLUDE=/path/to/autoloader.php QUEUE=convert php resque.php 

上記のコマンドは、新しいワーカー、ポーリングconvertという名前のキューを開始します。 ファイル/path/to/autoloader.phpもワーカーに渡しています。 (see here to learn to start a worker

技術的には、作業員はそのファイルにinclude '/path/to/autoloader.php';を含めます。

次に、あなたの仕事のクラスを検索する方法を労働者に伝えることができます。

利用の基本的な '/path/to/autoloader.php' は

を含める:

include /path/to/VideoConversion.php 
include /path/to/anotherClass.php 
... 

オートローダーを使用する

ジョブクラスを読み込むためにphpオートローダーを使用してください。

使用set_include_path()

set_include_path('path/to/job'); 

そうすれば、あなたの仕事はただ、この労働者のためにinclude_pathです。

閉会

APP_INCLUDE

はあなたが開始している作業者にバインドされ思いました。別の労働者を開始する場合は、 APP_INCLUDEをもう一度使用してください。各作業員ごとに異なるファイルを使用できます。

ジョブクラスを設計して、複数のジョブを実行することもできます。その方法を説明するtutorialがあります。キューシステムの基本から、キューシステムの使用方法と実装方法までをカバーしています。

まだ十分でない場合は、resqueのドキュメントをご覧ください。 php-resque APIはまったく同じです。違いは、ResqueジョブクラスはRubyで書かれていますが、php-resqueはPHPで書かれていることです。

+0

こんにちは神様、 私はあなたのブログの記事をバックグラウンドジョブに関連していたし、彼らは優れていた。 Windows7でも同じ手順を実行しています。ジョブは適切にキューに入れられます。私はRedisコンソールからそれを見ることができます。しかし、Resqueコマンドを実行すると、ジョブがポップされます(カウントはRedis Consoleでカウントダウンされます)が、ジョブは空です。実際のPHP-Resqueライブラリにfwriteを入れてチェックしました。 Resque.phpクラスのpopメソッドがアイテム($ item)を取得していますが、常に空です。 何が間違っている可能性がありますか?これはWindows OSと関係がありますか? ありがとうございます。 –

+0

Redis popコマンドは常にnullを返しますか? cliモードのphpがredisを使うように正しく設定されていることを確認してください。 – Wa0x6e

+0

あなたの役に立つチュートリアルシリーズのための@ Kamisama thx。特定のキューに対して一度に1つのジョブしか処理しないようにするにはどうすればよいですか? –

関連する問題