1

Symfony のセットアップに、DB からジョブを取得して処理するコマンドを実装しました。

コマンドの複数のインスタンスを一度に実行して、ジョブをより迅速に処理するにはどうすればよいですか。マルチスレッドが PHP でサポートされていないことは知っていますが、コマンドがシェルから呼び出されるのを見て、回避策があるかどうか疑問に思っていました。

以下を使用してコマンドを呼び出します。

app/console job:process

4

3 に答える 3

7

これを解決する方法は、複数のワーカーでワーク キューを使用することです。複数のプロセスを手動で実行し、並行性を心配するよりも、管理とスケーリングが簡単です。

PHP /symfony で作業するために私が見つけた最も単純な汎用キューは、 LeezyPheanstalkBundleを使用してsymfony2に統合できるbeanstalkd です。

于 2013-05-31T22:49:50.000 に答える
0

この正確な問題を解決する方法についてブログ投稿を書きました。https://plume.baucum.me/~/Absolutely/running-multiple-processes-simultaneously-in-a-symfony-command

ここですべてを再ハッシュするのは長すぎますが、基本的な概念は、コマンドがオプションでジョブの ID を受け取ることです。このコマンドは、ID が指定されているかどうかを確認します。そうでない場合は、DB からすべてのジョブを取得し、それらをループして、ジョブ ID パラメーターを使用して自分自身を呼び出します。各コマンドが開始されると、それを配列に格納し、配列が大きすぎる場合は、レート調整のためにスリープします。コマンドが終了したら、それらをアレイから削除します。

コマンドがジョブ ID で実行されると、Symfony のロック コンポーネントを使用してロックが作成されるため、ジョブが誤って一度に 2 回処理されることはありません。ジョブが終了またはエラーになったときに、ジョブのロックを解除することが重要です。ID とロックを取得すると、実際にジョブを処理するために記述したコードが呼び出されます。

この手法を使用して、各タスクを同期的に実行するため、実行に数時間かかっていたコマンドを数分で実行できるようになりました。さまざまなスロットルを試して、リソースの使用率とタスクの実行にかかる時間のバランスをとってください。

于 2020-06-10T16:31:55.300 に答える