web-dev-qa-db-ja.com

PHP(CakePHP)の非同期処理またはメッセージキュー

XML-RPCAPIとWebフロントエンドを介してアップロードされたファイルを処理するCakePHPでWebサイトを構築しています。ファイルはClamAVでスキャンする必要があり、サムネイルを生成する必要があります。ユーザーが待つ必要のない、ある程度の時間がかかるすべてのリソース集約型の作業。そこで、私はPHP全般、特にCakePHPを使用した非同期処理を検討しています。

有望に見えるCakePHPの MultiTaskプラグイン に出くわしました。また、 droprbeanstalkd などのさまざまなメッセージキューの実装にも出くわしました。もちろん、おそらく何らかのケーキシェルを使用して実装された、ある種のバックグラウンドプロセスも必要になります。マルチスレッドPHPデーモンを実装するために PHP_Fork を使用するMultiTaskを見ました。

これらすべての部品を最良の方法で組み合わせる方法について、いくつかのアドバイスが必要です。

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

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

これに関する意見、アドバイス、コメント、落とし穴、炎はありますか?

33
Sander Marechal

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

これを使用する利点のいくつかは、BeanstalkDジョブに優先度と遅延を設定できることです。「これを低い優先度で実行しますが、10秒間開始しないでください」。また、ある時点で多数のジョブをキューに入れました(これを今、5秒で実行し、30秒後に再度実行します)。

適切なネットワーク構成(およびネットワークの残りの部分へのアクセス可能なIPアドレスで実行)を使用して、1つのサーバーでbeanstalkdデーモンを実行し、他の複数のマシンからポーリングすることもできます。生成されるタスクの数に応じて、作業をサーバー間で分割できます。特定のタスクセットを特定のマシンで実行する必要がある場合は、そのマシンのホスト名である「チューブ」を作成しました。これは、グローバルではないにしても、クラスター内で一意である必要があります(ファイルのアップロードに役立ちます)。画像のサイズ変更には完全に機能し、それを参照するWebページ自体が到達するURLを参照する前に、完成した小さい画像をファイルシステムに返すことがよくありました。

私は実際に私のブログのためにこの主題に関する一連の記事を書き始めようとしています(私はすでに数百万のライブリクエストをプッシュしたコードのいくつかのテクニックを含みます)-私のURLは私の ユーザープロファイル ここ、Stackoverflowで。

(私は 一連の記事 Beanstalkdとジョブのキューイングをテーマに書いています)

25
Alister Bulman

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

シングルスレッドワーカーを使用することの良い点は、プロセス内で同期を処理する必要がないことです。ジョブキューは、ジョブが2回処理されないことを確認します。

4
Peter Stuifzand

ギアマンはどうですか? PHPの優れたサポートと統合、および並列タスク、スケーリング、監視などの機能...

0
giuseppe

EC2と組み合わせて使用​​する Amazon SQS もチェックする価値があるかもしれませんか?

0
neilcrookes