Heim > Backend-Entwicklung > PHP-Tutorial > Laravel-Warteschlangendienst

Laravel-Warteschlangendienst

高洛峰
Freigeben: 2016-11-15 14:23:30
Original
1111 Leute haben es durchsucht

QueueServiceProvider

Die meisten Registrierungen der verschiedenen Dienste von Laravel sind über verschiedene ServiceProvider gebunden, und Warteschlangendienste sind keine Ausnahme. Öffnen Sie die Namespace-Datei IlluminateQueueQueueServiceProvider und suchen Sie die Registermethode

public function register()
{
   // 注册队列管理器 一旦实例化,为队列连接器注册各种解析器,这些连接器负责创建接受队列配置和实例化各种不同队列处理的类。
   // 按照配置文件注册一个默认连接方式 在此使用 redis
    $this->registerManager();
   // 注册队列各种命令 队列连接 重启等。
    $this->registerWorker();
   // 注册队列监听命令
    $this->registerListener();
   // 5.1后弃用
    $this->registerSubscriber();
   // 注册队列失败处理
    $this->registerFailedJobServices();
   // Register the Illuminate queued closure job. 什么用,后面再看。
    $this->registerQueueClosure();
}
Nach dem Login kopieren

Aufgabenerstellung und -zuweisung

php artisan make:job SendReminderEmail
Nach dem Login kopieren

Eine Warteschlangenaufgabenklasse wird gemäß dem Dokument generiert. Diese Klasse erbt den Namensraum AppJobsJob und implementiert die Schnittstellen SelfHandling und ShouldQueue. Es gibt keine Vorgabe für die Verwendung (überspringen Sie es vorerst). Der Schwerpunkt liegt auf den beiden Merkmalen, die verschiedene Vorgänge für Warteschlangenaufgaben implementieren, wie z. B. Löschen, Wiederholen, Verzögern usw.
Bei der Aufgabenzuweisung verwenden wir die Hilfsfunktion „dispatch“, die eigentlich die Dispatcher-Methode der Dispatcher-Klasse unter IlluminateBus ist

public function dispatch($command, Closure $afterResolving = null)
{    

    if ($this->queueResolver && $this->commandShouldBeQueued($command)) {
        // 队列执行
        return $this->dispatchToQueue($command);
    } else {
        // 立即执行
        return $this->dispatchNow($command, $afterResolving);
    }
}
protected function commandShouldBeQueued($command)
{
    if ($command instanceof ShouldQueue) {  // 就这用。。
        return true;
    }

    return (new ReflectionClass($this->getHandlerClass($command)))->implementsInterface(
        'Illuminate\Contracts\Queue\ShouldQueue'
    );
}
Nach dem Login kopieren

Hier werfen wir zunächst einen Blick auf die

public function register()
{
    $this->app->singleton('Illuminate\Bus\Dispatcher', function ($app) {
        return new Dispatcher($app, function () use ($app) {

        // 'queue.connection' => 'Illuminate\Contracts\Queue\Queue', 再回看 QueueServiceProvider 的 registerManager 方法,就很清晰了。

            return $app['Illuminate\Contracts\Queue\Queue']; // 默认队列连接
        });
    });
}
Nach dem Login kopieren
unter dem Namensraum IlluminateBusBusServiceProvider

Sehen Sie sich „dispatchToQueue“

public function dispatchToQueue($command)
{
    $queue = call_user_func($this->queueResolver); // 在此为设置的默认值 将实例化 RedisQueue
    
    // 异常则抛出!
    if (! $queue instanceof Queue) {
        throw new RuntimeException('Queue resolver did not return a Queue implementation.');
    }
    if (method_exists($command, 'queue')) {
        // 可以自定义
        return $command->queue($queue, $command);
    } else {
        // 在此使用的是进入队列方式  最终结果类似 $queue->push(); 看 RedisQueue 下的 push 方法。
        return $this->pushCommandToQueue($queue, $command);
    }
}
Nach dem Login kopieren

unten an und Sie werden den gesamten Prozess der Eingabe der oben genannten Aufgabe in die Warteschlange verstehen. Was ist mit dem Entfernen von Aufgaben aus der Warteschlange? Wir können im Dokument sehen, dass wir die Warteschlange überwachen, indem wir die Anweisung php artisan queue:work ausführen. Werfen wir einen Blick auf den Namensraum IlluminateQueueConsoleWork(). Werfen wir einen Blick selbst.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage