2009-05-26 9 views
33

私はCakePHPにXML-RPC APIとWebフロントエンドを介してアップロードされたファイルを処理しています。 ClamAVでファイルをスキャンする必要があり、サムネイルを生成する必要があります。すべてのリソースを消費する作業は、ユーザーが待つ必要がない時間がかかります。ですから、私は一般的にPHPと特にCakePHPで非同期処理を検討しています。PHP(CakePHP)の非同期処理またはメッセージキュー

私は有望に見えるCakePHPのMultiTask pluginを見つけました。私はまた、droprbeanstalkdのようなさまざまなメッセージキューの実装に出くわしました。もちろん、何らかの種類のケーキシェルを使って実装された、何らかのバックグラウンドプロセスも必要です。私はPHP_Forkを使ってマルチスレッドを見て、マルチスレッドのPHPデーモンを実装しました。

私はこれらすべての作品を最良の方法で一緒に収める方法についていくつかアドバイスが必要です。

  • 長時間実行するデーモンをPHPで記述することをお勧めしますか?私は何のために気を付けるべきですか?
  • 外部メッセージキューの実装の利点は何ですか? MultiTaskプラグインは外部メッセージキューを使用しません。タスクを格納するためにMySQLテーブルを使用して独自のロールを作成します。
  • どのメッセージキューを使用する必要がありますか?落ちる?ビーンストーク?他に何か?
  • バックエンドプロセッサはどのように実装する必要がありますか?フォークPHPデーモンは良いアイデアか、単にトラブルを求めていますか?

私の現在の計画は、MultiTaskプラグインを使用するか、独自のMySQLテーブル実装ではなく、beanstaldを使用するように編集することです。キュー内のジョブは、単純にタスク名と一連のパラメータで構成されます。 PHPデーモンは、着信ジョブを監視し、それらを子スレッドの1つに渡します。単に与えられたパラメータでCakePHPタスクを実行します。

これに関する意見、アドバイス、コメント、試合錯誤、または炎はありますか?

+0

また、いくつかの情報があります。 @ [queue-deferred-execution-in-cakephp /](http://www.dereuromark.de/2013/12/22/queue-deferred-execution-in-cakephp/)を処理しています。 – mark

答えて

25

私はBeanstalkDで優れた結果を得ており、バックエンドはPHPで書かれてジョブを取得してから処理します。実際のジョブの実行をbashスクリプトでラップして、終了しても実行し続けるようにしています(スクリプトがチェックして実際に終了するときに 'exit(UNIQNUM);'を実行しない限り)。このようにして、再起動されたPHPスクリプトは、使用されている可能性のあるメモリをすべて消去し、実行する25/50/100のジョブごとに新たに起動することができます。

BeanstalkDジョブに優先度と遅延を設定することができるという利点があります。「これを優先度を下げて実行しますが、10秒間は開始しないでください。私はまた、いくつかの時間にいくつかのジョブをキューに入れました(これは現在5秒後に30秒後に実行されます)。

適切なネットワーク構成で(ネットワークの残りの部分にアクセス可能なIPアドレスで実行する)、1台のサーバーでBeanstalkdデーモンを実行し、他の多くのマシンからポーリングすることもできます多数のタスクが生成されているため、サーバー間で作業を分割できます。特定のマシンで特定のタスクを実行する必要がある場合は、そのマシンのホスト名である「チューブ」を作成しました。これは、グローバルではないにしても、クラスタ内で一意でなければなりません(ファイルのアップロードに便利です)。私はそれが完全にイメージのサイズを変更するために働いていることがわかりました。しばしば、完成した小さなイメージをファイルシステムに返す前に、それを参照するWebページ自体が到着するURLを参照します。

私のブログでこの件に関して一連の記事を書こうとしています(既に数百万のライブリクエストを送信したコードのテクニックを含む) - 私のURLはuser profileからリンクされています、スタックオーバーフロー。

Gearmanについて

+1

ありがとう、それは役に立ちました。私は現時点でBeanstalkdと一緒に働いています。これまでのところ、私は単純なCakePHPモデルの動作を作成しました。これは "遅延"と呼ばれ、モデルの遅延メソッド呼び出しです。遅延動作は、Beanstaldにコールを置き、バックグラウンドで実行されているCake Shellは、Beanstalkdからメッセージを取得し、コールを実行します。これまでの私の唯一の心配は、Beanstalkdは永続的ではないということです。あなたはそれに何か問題がありましたか?もしBeanstalkdが死んで、あなたの画像の一部が決してサイズ変更されなかったら? –

+0

まだ10万の文字列を入れても、それは私にはまだ死んだことはありません。また、画像のサイズが変更されない場合、画像はアップロードディレクトリに保存され、後で実行することもできます。 –

+0

私はリンク先のBeanstalkdサイトがPHPプログラミングプロジェクトのどのような種類にも関係していないと思われるので変更したと思います – Rick

4

Beanstalkdのようなメッセージキューを使用すると、(同じサーバー上であっても)好きなだけ多くのプロセスを開始できます。各ワーカープロセスは、キューから1つのジョブを取り出して処理します。より多くの容量が必要な場合は、さらに多くのワーカーとサーバーを追加できます。

単一のスレッドワーカーを使用することについての素晴らしい点は、プロセス内で同期を処理する必要がないことです。ジョブキューは、ジョブが2度処理されないようにします。

0

EC2と併用するAmazon SQSもチェックする価値がありますか?

+4

いいえ、ありがとうございます。私は自信を持っていたい。ラックと大きなパイプを備えたISP以外の外部サービスには依存しません。 –

+0

私は、SQSにもかなりのレイテンシがあることを理解しています。人のログイン時に情報を取得している場合は、ビデオをトランスコードする場合やサウンドを発する場合は問題ありません。 –

0

何を(私はBeanstalkdの対象とジョブのキューイングにseries of articlesを書きましたか)?良いサポートとPHPでの統合と並列タスク、スケーリング、モニタリングなどの機能...