33

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

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

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

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

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

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

4

4 に答える 4

25

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

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

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

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

( Beanstalkd とジョブのキューイングに関する一連の記事を書きました)

于 2009-06-02T16:22:23.580 に答える
4

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

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

于 2009-05-26T10:29:03.510 に答える
0

Amazon SQSを EC2 と組み合わせて使用​​することも検討する価値があるでしょうか?

于 2009-05-26T19:48:50.900 に答える
0

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

于 2015-09-12T13:48:25.467 に答える