Laravelキューの実装原理と問題解決方法について

不言
リリース: 2023-03-31 22:22:01
オリジナル
2299 人が閲覧しました

この記事では、主に Laravel キューの実装原理と問題解決の記録について簡単に説明します。非常に優れた内容なので、参考として共有します。

問題

Laravel を使用して会社が開発した 2 つのプロジェクトは、同じテスト サーバーにデプロイされ、同じ Redis を共有します。 Laravelでキューを使用すると競合が発生します。

問題の原因を見つける

laravel キューの操作クラスIlluminate\Queue\RedisQueue.php にpushRaw() が表示されます。メソッド:

// 将一任务推入队列中 public function pushRaw($payload, $queue = null, array $options = []) { $this->getConnection()->rpush($this->getQueue($queue), $payload); return Arr::get(json_decode($payload, true), 'id'); }
ログイン後にコピー

このメソッドから、Lrarvel キューの Redis 実装がリスト構造 ## を通じて実装されていることがわかります。 #rpush(key, value)は、キー値が key である Redis キューに value をプッシュします。key の値は、$this->getQueue($queue)を通じて取得されます。

protected function getQueue($queue) { return 'queues:'.($queue ?: $this->default); }
ログイン後にコピー

つまり、redis のリストのキーは

'queues:'.($queue ?: $this->default);spliced ,$this->default値はRedisQueue です。インスタンス化中にconfig\queue.php構成からロードされます。'queue' =>キューを追加する場合、default'、$queue は$this->dispatch( new jobClass()->onQueue($queue) )です。

// config\queue.php 文件中的redis配置部分 'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'expire' => 60, ],
ログイン後にコピー

現時点で、2 つのプロジェクト間のキュー競合の原因が判明しました。 Redis キュー構成の

'queue' => 'default'はデフォルトのデフォルトを使用するため、redis を共有する場合、デフォルトのキュー リストはすべて 'queue:default' となり、競合が発生します。

キュー監視で監視するキュー名は --queue パラメータで決まるため、渡されない場合は上記で設定したデフォルト値になります。受信キュー名に従って前から後ろに、詳細についてはコード

Illuminate\Queue\Worker.phpを参照してください:

protected function getNextJob($connection, $queue) { if (is_null($queue)) { return $connection->pop(); } foreach (explode(',', $queue) as $queue) { if (! is_null($job = $connection->pop($queue))) { return $job; } } }
ログイン後にコピー

$queue は渡される --queue= パラメータです。$queue が存在しない場合は、

$connection->pop() を直接呼び出します。パラメータが存在する場合、パラメータが解析され、キュー名が返されます。フロントが最初に処理され、キュー名がpop( $queue) に渡され、pop()は指定されたキューまたはデフォルトのキューからキュー タスクを取得しようとします

// Illuminate\Queue\RedisQueue.php public function pop($queue = null) { $original = $queue ?: $this->default; $queue = $this->getQueue($queue); if (! is_null($this->expire)) { $this->migrateAllExpiredJobs($queue); } $job = $this->getConnection()->lpop($queue); if (! is_null($job)) { $this->getConnection()->zadd($queue.':reserved', $this->getTime() + $this->expire, $job); return new RedisJob($this->container, $this, $job, $original); } }
ログイン後にコピー

これで、キュー実行の原理が理解できました。

解決策

キュー構成ファイル内のデフォルトのキューを次のように変更します。 'queue' =>','queue' => ; laravel2」。

キューリスニング

php 職人キュー:リッスン redis --queue=laravel1,syncExpress

ついに問題が発生しました。病気のときは急いで医者に行かないでください。コードから始めて、実装の原則を分析して理解し、適切なポイントを見つけます。解決策は簡単かもしれません。上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

PHP の Laravel フレームワークにおけるメッセージ キュー キューと非同期キューの使用方法に関する分析

# ##################################

以上がLaravelキューの実装原理と問題解決方法についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!