Cet article présente principalement une brève discussion sur les principes d'implémentation de la file d'attente Laravel et les enregistrements de résolution de problèmes. Le contenu est assez bon, je vais le partager avec vous maintenant et le donner comme référence.
Problème
Les deux projets développés par la société utilisant Laravel sont déployés sur le même serveur de test et partagent le même redis. Lors de l'utilisation de files d'attente dans Laravel, des conflits se produisent.
Trouvez la cause du problème
Vous pouvez voir la méthode IlluminateQueueRedisQueue.php
dans la classe d'opération pushRaw()
de la file d'attente laravel :
// 将一任务推入队列中 public function pushRaw($payload, $queue = null, array $options = []) { $this->getConnection()->rpush($this->getQueue($queue), $payload); return Arr::get(json_decode($payload, true), 'id'); }
On peut voir à partir de cette méthode que l'implémentation redis de la file d'attente Lrarvel est implémentée via la structure de liste rpush(key, value)
consiste à pousser la valeur dans la file d'attente redis avec la clé. valeur comme clé, et la valeur de la clé est $this->getQueue($queue)
protected function getQueue($queue) { return 'queues:'.($queue ?: $this->default); }
, donc la clé dans la liste dans redis est épissée par 'queues:'.($queue ?: $this->default);
, et la valeur de $this->default
est RedisQueue
est chargée à partir de la configuration configqueue.php
lors de l'instanciation. $queue est transmis lors de l'ajout d'une file d'attente. 'queue' => 'default'
$this->dispatch( new jobClass()->onQueue($queue) )
// config\queue.php 文件中的redis配置部分 'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'expire' => 60, ],
À ce stade, la cause du conflit de file d'attente entre les deux projets a été trouvée. Étant donné que
dans la configuration de la file d'attente Redis utilise tous la valeur par défaut, lors du partage de Redis, la liste de files d'attente par défaut est entièrement « file d'attente : par défaut », ce qui entraîne des conflits.'queue' => 'default'
Parce que le nom de la file d'attente surveillée par la surveillance de la file d'attente est déterminé par le paramètre --queue, s'il n'est pas transmis, ce sera la valeur par défaut que nous avons définie ci-dessus. S'il est transmis, il sera traité dans l'ordre. d'avant en arrière selon le nom de la file d'attente entrante, voir le code
IlluminateQueueWorker.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 est le paramètre transmis par. --queue=. Lorsque $queue n'existe pas, il est appelé directement
Lorsque le paramètre existe, le paramètre sera analysé et le nom de la file d'attente devant sera traité en premier. va essayer d'obtenir la tâche de file d'attente à partir de la file d'attente spécifiée ou de la file d'attente par défaut$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); } }
Solution
Modifiez la file d'attente par défaut dans le fichier de configuration de la file d'attente en un nom différent, tel que : 'queue' => ; laravel2'.
Surveillance des files d'attente php artisan queue:listen redis --queue=laravel1,syncExpress
Enfin
Si vous rencontrez un problème, ne vous précipitez pas chez le médecin. Commencez par le code, analysez et comprenez les principes de mise en œuvre et trouvez le bon point. La solution peut être simple.
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois ! Recommandations associées :Analyse de la méthode d'utilisation de la file d'attente de messages et de la file d'attente asynchrone dans le framework Laravel de PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!