Maison  >  Article  >  développement back-end  >  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

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

不言
不言original
2018-06-13 10:48:192822parcourir

Cet article présente principalement 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. Pour les versions postérieures à Laravel 5.0, l'exemple d'environnement est le système Linux. Les amis dans le besoin peuvent s'y référer

configuration de la file d'attente

Tout d'abord, laissez-moi vous expliquer comment utiliser la file d'attente dans mon projet précédent.

Nos projets actuels utilisent tous symfony, les projets plus anciens utilisent symfony1.4 et les projets plus récents utilisent symfony2. La sensation générale d'utiliser symfony est très agréable, en particulier symfony2, qui utilise généralement de nombreuses idées de conception issues des frameworks Java. Mais il ne prend pas en charge la file d'attente. Dans Symfony, nous avons également parcouru plusieurs processus utilisant la file d'attente. J'ai d'abord utilisé les httpsqs de Zhang Yan. Celui-ci est simple à utiliser, mais il y a des points uniques. Après tout, notre projet sert toujours officiellement le monde extérieur, nous avons donc étudié ActiveMQ, un projet open source sous Apache, et avons découvert qu'il existe un MQ plus récent sous Apache, qui est Apollo. Finalement, nous avons décidé d'utiliser Apollo.

Le principal scénario d'application de la file d'attente dans notre projet est de traiter de manière asynchrone certaines fonctions chronophages, telles que la synchronisation des données tierces, la notification synchrone à nos utilisateurs de données tiers des modifications de données, etc. Notre idée générale est la suivante : si un traitement asynchrone est nécessaire dans chaque contrôleur, encodez simplement un objet json et insérez-le dans Apollo. Écrivez une autre commande de travail, analysez l'objet json dans cette commande et appelez différentes méthodes en fonction des actions et des paramètres qu'il contient. Selon les besoins de l'entreprise, exécuter Command sur différentes machines en même temps qu'un processus démon peut également être considéré comme une solution pour implémenter des applications multitâches asynchrones. J'ai continué à l'utiliser jusqu'à ce que je découvre Laravel. Prévoyez de le rechercher. Il n'est pas impossible de le remplacer si possible. héhé.

Depuis que je viens de commencer à apprendre, bien sûr, je suis allé directement sur Laravel5. Les routes, les contrôleurs et les vues sont fondamentalement les mêmes que ceux de Symfony, il n'est donc pas difficile de démarrer. Enfin, étudiez la file d’attente.

1. Installer laravle et utiliser composer est très simple.

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

Ajoutez ~/.composer/vendor/bin aux variables d'environnement.

source ~/.bash_profile

Vous pouvez utiliser Laravel directement depuis la ligne de commande. Essayez-le.

laravel -V

Si vous pouvez voir ce qui suit, cela signifie le succès.

Laravel Installer version 1.2.1

2. Créez un projet.

laravel new guagua

3. Configurez Redis et la file d'attente.

4. Créez un contrôleur,

php artisan make:controller DefaultController

poussez 100 files d'attente dans la tâche d'action du contrôleur. .

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

5. Commande pour créer une file d'attente

php artisan make:command SendEmail --queued

Modifiez app/Commands/SendEmail.php et ajoutez une variable privée.

protected $msg;

Modifiez le constructeur en même temps.

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

Méthode de poignée modifiée

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

6. Modifier les itinéraires

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

7. Surveiller la file d'attente

php artisan queue:listen

Pour vérifier le multitâche, nous ouvrons trois fenêtres en même temps et exécutons la même commande.

8. Démarrez le service avec le serveur intégré de Laravel

php artisan serve --port 8080

Ouvrez le navigateur et visitez http. : //localhost:8080/page. Bien sûr, vous pouvez également utiliser nginx, apache, etc. Cependant, diverses configurations sont requises et celles intégrées sont faciles à utiliser.

Vous pouvez voir l'état d'exécution de chaque file d'attente dans la console, comme indiqué ci-dessous. Vous pouvez voir que 100 tâches sont réparties à parts égales entre trois emplois.


2016321142239283.png (862×658)

À ce stade, j'ai essentiellement obtenu l'effet que je souhaitais. Il est vérifié que Laravel peut facilement implémenter une file d'attente et gérer le multitâche.

use AppCommandsCommand est utilisé dans le code généré par la commande make, mais lors de l'exécution, il indique qu'il n'existe pas de fichier de ce type. La solution est de le modifier pour utiliser IlluminateConsoleCommand ; je ne sais pas pourquoi ce problème de bas niveau se produit. Est-ce un problème avec mon système Mac ou un problème avec mon personnage ?

Lorsque vous poussez la file d'attente dans l'action du contrôleur, il n'y a pas d'exécution asynchrone et elle est toujours exécutée dans le script de l'action. Il a été constaté qu'il s'agissait d'un problème de configuration. Il s'est avéré que non seulement queue.php dans config devait être modifié, mais que les configurations associées dans .evn devaient également être modifiées. Bien que le problème ait été résolu, je ressens toujours une douleur dans mes couilles et je n'arrive pas à la comprendre. Il faut encore apprendre Laravel.

Comment utiliser les files d'attente asynchrones

1. Configuration

La définition de la file d'attente ne sera pas présentée ici. . Il existe deux clés pour utiliser les files d'attente asynchrones :

(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自动加载机制的分析

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn