ホームページ  >  記事  >  バックエンド開発  >  Laravelキューの実装原理と問題解決方法について

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

不言
不言オリジナル
2018-06-13 11:45:522362ブラウズ

この記事では、主に 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。