この記事では、主に 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' となり、競合が発生します。
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 サイトの他の関連記事を参照してください。