Dieser Artikel führt hauptsächlich eine kurze Diskussion der Implementierungsprinzipien der Laravel-Warteschlange und der Problemlösungsaufzeichnungen ein. Der Inhalt ist jetzt recht gut und dient als Referenz.
Problem
Die beiden vom Unternehmen unter Verwendung von Laravel entwickelten Projekte werden auf demselben Testserver bereitgestellt und verwenden dieselben Redis. Bei der Verwendung von Warteschlangen in Laravel kommt es zu Konflikten.
Finden Sie die Ursache des Problems
Sie können die IlluminateQueueRedisQueue.php
-Methode in der Operationsklasse pushRaw()
der Laravel-Warteschlange sehen:
// 将一任务推入队列中 public function pushRaw($payload, $queue = null, array $options = []) { $this->getConnection()->rpush($this->getQueue($queue), $payload); return Arr::get(json_decode($payload, true), 'id'); }
Aus dieser Methode ist ersichtlich, dass die Redis-Implementierung der Lrarvel-Warteschlange durch die Listenstruktur implementiert wird. rpush(key, value)
besteht darin, den Wert mit dem Schlüsselwert als in die Redis-Warteschlange zu verschieben Schlüssel, und der Wert des Schlüssels ist durch $this->getQueue($queue)
Das erhaltene
protected function getQueue($queue) { return 'queues:'.($queue ?: $this->default); }
, sodass die Schlüssel in der Liste in Redis durch 'queues:'.($queue ?: $this->default);
gespleißt werden , und der Wert von $this->default
wird durch RedisQueue
instanziiert. configqueue.php
wird aus der 'queue' => 'default'
-Konfiguration geladen, und $queue wird übergeben, wenn eine Warteschlange $this->dispatch( new jobClass()->onQueue($queue) )
hinzugefügt wird.
// config\queue.php 文件中的redis配置部分 'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'expire' => 60, ],
Zu diesem Zeitpunkt wurde die Ursache für den Warteschlangenkonflikt zwischen den beiden Projekten gefunden. Da 'queue' => 'default'
in der Redis-Warteschlangenkonfiguration alle den Standardstandard verwenden, lautet die Standardwarteschlangenliste bei der Freigabe von Redis alle „queue:default“, was zu Konflikten führt.
Da der von der Warteschlangenüberwachung überwachte Warteschlangenname durch den Parameter --queue bestimmt wird, ist er der oben festgelegte Standardwert. Wenn er übergeben wird, wird er der Reihe nach verarbeitet Von vorne nach hinten entsprechend dem Namen der eingehenden Warteschlange, siehe Code IlluminateQueueWorker.php
für Details:
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 ist der von -- übergebene Parameter. queue=. Wenn $queue nicht vorhanden ist, wird es direkt aufgerufen. $connection->pop()
Wenn der Parameter vorhanden ist, wird der Parameter zuerst analysiert und der Warteschlangenname wird zuerst verarbeitet. Es wird versucht, die Warteschlangenaufgabe aus der angegebenen Warteschlange oder der Standardwarteschlange abzurufen 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); } }
Lösung
Ändern Sie die Standardwarteschlange in der Warteschlangenkonfigurationsdatei in einen anderen Namen, z. B.: 'queue' => ; laravel2'. Warteschlangenüberwachung php artisan queue:listen redis --queue=laravel1,syncExpress
Endlich
Wenn Sie auf ein Problem stoßen, eilen Sie nicht zum Arzt. Beginnen Sie mit dem Code, analysieren und verstehen Sie die Implementierungsprinzipien und finden Sie den richtigen Punkt. Die Lösung kann einfach sein. Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website. Verwandte Empfehlungen:Analyse der Methode zur Verwendung der Nachrichtenwarteschlange und der asynchronen Warteschlange im Laravel-Framework von PHP
Das obige ist der detaillierte Inhalt vonÜber das Implementierungsprinzip der Laravel-Warteschlange und wie das Problem gelöst werden kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!