<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 問題 公司項目使用Laravel的開發的兩個項目在同一個測試服務器部署,公用同一個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實現是通過list結構實現的,`rpush(key, value)`是將value推入鍵值為key的redis隊列,key的值則是通過`$this->getQueue($queue)` 獲取到的 ~~~ protected function getQueue($queue) { return 'queues:'.($queue ?: $this->default); } ~~~ 所以的redis中list中的key是` 'queues:'.($queue ?: $this->default);`拼接的,$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, ], ~~~ 至此,兩個項目的隊列沖突原因就找到了。因為redis隊列配置中` 'queue' => 'default' `都使用的默認的default,所以當共用redis時,默認的隊列list 都是'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' => laravel1','queue' => laravel2'`。 隊列監聽 `php artisan queue:listen redis --queue=laravel1,syncExpress`
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看