Heim >Backend-Entwicklung >PHP-Tutorial >Analyse der Methode zur Verwendung von Nachrichtenwarteschlangen und asynchronen Warteschlangen im Laravel-Framework von PHP

Analyse der Methode zur Verwendung von Nachrichtenwarteschlangen und asynchronen Warteschlangen im Laravel-Framework von PHP

不言
不言Original
2018-06-13 10:48:192964Durchsuche

In diesem Artikel wird hauptsächlich die Methode zur Verwendung der Nachrichtenwarteschlange und der asynchronen Warteschlange im Laravel-Framework von PHP vorgestellt. Für Versionen nach Laravel 5.0 ist die Beispielumgebung das Linux-System

Warteschlangenkonfiguration

Lassen Sie mich zunächst erklären, wie die Warteschlange in meinem vorherigen Projekt verwendet wird.

Unsere aktuellen Projekte verwenden alle Symfony, ältere Projekte verwenden Symfony1.4 und neuere Projekte verwenden Symfony2. Das Gesamtgefühl bei der Verwendung von Symfony ist sehr angenehm, insbesondere Symfony2, das im Allgemeinen viele Designideen von Java-Frameworks verwendet. Es unterstützt jedoch keine Warteschlange. In Symfony haben wir auch mehrere Prozesse mithilfe der Warteschlange durchlaufen. Ich habe zuerst Zhang Yans httpsqs verwendet. Dieser ist einfach zu verwenden, hat aber einen einzigen Punkt. Schließlich ist unser Projekt immer noch offiziell für externe Dienste bestimmt. Deshalb haben wir ActiveMQ, ein Open-Source-Projekt unter Apache, untersucht und festgestellt, dass es unter Apache ein neueres MQ gibt, nämlich Apollo. Letztendlich haben wir uns für Apollo entschieden.

Das Hauptanwendungsszenario der Warteschlange in unserem Projekt besteht darin, einige zeitaufwändige Funktionen asynchron zu verarbeiten, z. B. die Synchronisierung von Daten von Drittanbietern, die synchrone Benachrichtigung unserer Datenbenutzer von Drittanbietern über Datenänderungen usw. Unsere allgemeine Idee ist folgende: Wenn in jedem Controller eine asynchrone Verarbeitung erforderlich ist, codieren Sie einfach ein JSON-Objekt und stopfen Sie es in Apollo. Schreiben Sie einen weiteren Arbeitsbefehl, analysieren Sie das JSON-Objekt in diesem Befehl und rufen Sie verschiedene Methoden basierend auf den darin enthaltenen Aktionen und Parametern auf. Das gleichzeitige Ausführen von Command als Daemon-Prozess auf verschiedenen Maschinen entsprechend den Geschäftsanforderungen kann auch als Lösung zur Implementierung asynchroner Multitasking-Anwendungen in Betracht gezogen werden. Ich habe es weiter verwendet, bis ich Laravel entdeckt habe. Planen Sie, es zu erforschen. Es ist nicht unmöglich, es nach Möglichkeit zu ersetzen. hehe.

Da ich gerade erst angefangen habe zu lernen, bin ich natürlich direkt zu laravel5 gegangen. Routen, Controller und Ansichten sind im Grunde die gleichen wie bei Symfony, daher ist der Einstieg nicht schwierig. Studieren Sie abschließend die Warteschlange.

1. Die Installation von Laravle und die Verwendung von Composer ist sehr einfach.

composer global require "laravel/installer=~1.1"
vi ~/.bash_profile

Fügen Sie ~/.composer/vendor/bin zu den Umgebungsvariablen hinzu.

source ~/.bash_profile

Sie können Laravel direkt in der Befehlszeile verwenden. Probieren Sie es aus.

laravel -V

Wenn Sie Folgendes sehen können, bedeutet das Erfolg.

Laravel Installer version 1.2.1

2. Erstellen Sie ein Projekt.

laravel new guagua

3. Redis und Warteschlange konfigurieren.

4. Erstellen Sie einen Controller,

php artisan make:controller DefaultController

Schieben Sie 100 Warteschlangenaufgaben in die Aktion des Controllers.

for($i = 0; $i < 100; $i ++) {
  Queue::push(new SendEmail("ssss".$i));
}

5. Befehl zum Erstellen einer Warteschlange

php artisan make:command SendEmail --queued

Ändern Sie app/Commands/SendEmail.php und fügen Sie eine private Variable hinzu.

protected $msg;

Ändern Sie gleichzeitig den Konstruktor.

public function __construct($msg)
{
  $this->msg = $msg;
}

Remodifizierte Handle-Methode

public function handle() {
  sleep(4);
  echo $this->msg."\t".date("Y-m-d H:i:s")."\n";
  $this->delete();
}

6. Routen ändern

Route::get(&#39;/&#39;, [
  &#39;as&#39; => &#39;index&#39;,
  &#39;uses&#39; => &#39;DefaultController@index&#39;
]);

7. Überwachungswarteschlange

php artisan queue:listen

An Um Multitasking zu überprüfen, haben wir drei Fenster gleichzeitig geöffnet und denselben Befehl ausgeführt.

8. Starten Sie den Dienst mit dem integrierten Server von Laravel

php artisan serve --port 8080

Öffnen Sie den Browser und besuchen Sie http:/ / localhost:8080/seite. Natürlich können Sie auch Nginx, Apache usw. verwenden. Es sind jedoch verschiedene Konfigurationen erforderlich, und die integrierten Konfigurationen sind einfach zu verwenden.

Sie können den Ausführungsstatus jeder Warteschlange in der Konsole sehen, wie unten gezeigt. Sie sehen, dass 100 Aufgaben gleichmäßig auf drei Jobs verteilt sind.

2016321142239283.png (862×658)

An diesem Punkt habe ich im Grunde den Effekt erreicht, den ich wollte. Es wurde bestätigt, dass Laravel die Warteschlange problemlos implementieren und Multitasking bewältigen kann.

use AppCommandsCommand wird im vom Befehl make generierten Code verwendet, aber beim Ausführen wird angezeigt, dass keine solche Datei vorhanden ist. Die Lösung besteht darin, es auf die Verwendung von IlluminateConsoleCommand umzustellen. Ich weiß nicht, warum dieses Problem auf niedriger Ebene auftritt. Liegt es an einem Problem mit meinem Mac-System oder an meinem Charakter?
Beim Pushen der Warteschlange in der Aktion des Controllers findet keine asynchrone Ausführung statt und sie wird weiterhin im Skript der Aktion ausgeführt. Es wurde festgestellt, dass es sich um ein Konfigurationsproblem handelte. Es stellte sich heraus, dass nicht nur queue.php in der Konfiguration geändert werden musste, sondern auch verwandte Konfigurationen in .evn. Obwohl das Problem gelöst ist, spüre ich immer noch Schmerzen in meinen Hoden und kann es nicht verstehen. Ich muss noch Laravel lernen.

So verwenden Sie asynchrone Warteschlangen

1. Konfiguration

Die Definition der Warteschlange wird hier nicht vorgestellt . . Es gibt zwei Schlüssel zur Verwendung asynchroner Warteschlangen:

(1)存储队列的地方
(2)执行任务的服务
打开 config/queue.php ,这是Laravel5关于队列的配置文件。首先我们可以通过 default 参数指定默认队列驱动,默认配置是 sync , 这是同步队列,我们要做异步队列首先就要改变这里。假设我们用 database 作为驱动,队列任务将会存放在数据库中,而我们后面会另外启动一个后台服务来处理队列任务,这就是异步方式了。

&#39;default&#39; => &#39;database&#39;

修改完配置后,我们需要创建一个表来存放队列任务,Laravel5已经在自带artisan命令中内置了一个指令用来生成数据迁移,只需要两条命令即可,当然你得实现配置好数据库连接。

php artisan queue:table
php artisan migrate

这样就自动在数据库中创建了 jobs 表。

2.启动队列监听服务

通过下面这条指令启动队列监听服务,它会自动处理 jobs 表中的队列任务:

php artisan queue:listen

在linux中,如果想让它在后台执行,可以这样:

nohup php artisan queue:listen &

3.添加队列任务

关于队列任务的添加,手册里说的比较详细,这里就简单举个例子吧。

首先,通过artisan创建一个队列命令:

php artisan make:command SendEmail --queued

这样会生成 app/Commands/SendEmail.php 这个类文件,这个类会被标识为队列命令,你可以在 handle 方法中写自己的业务逻辑。

在控制器中,可以简单通过 Bus::dispatch 分发任务:

Bus::dispatch(new \App\Commands\SendEmail());

你会发现任务不会立即执行,而是被放到 jobs 表中,由队列监听服务处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

如何解决Laravel中log无法写入的问题

关于PHP的autoLoad自动加载机制的分析

Das obige ist der detaillierte Inhalt vonAnalyse der Methode zur Verwendung von Nachrichtenwarteschlangen und asynchronen Warteschlangen im Laravel-Framework von PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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