Laravel Queue and Task Scheduler : traitement simultané d'un grand nombre de tâches
Dans le développement d'applications Web modernes, il existe souvent des scénarios dans lesquels un grand nombre de tâches doivent être traitées. Par exemple, envoyer des e-mails, générer des rapports, traiter du Big Data, etc. Mais lorsque la charge de travail est très importante, une seule requête pour traiter ces tâches peut entraîner un retard trop long de la requête ou un épuisement des ressources système. Afin de résoudre ce problème, Laravel fournit des fonctions de file d'attente et de planificateur de tâches, qui peuvent traiter un grand nombre de tâches simultanément.
1. Laravel Queue
La file d'attente est un mécanisme qui pousse les tâches en arrière-plan pour un traitement asynchrone, notre application peut traiter des opérations fastidieuses en arrière-plan sans affecter la vitesse de réponse aux demandes de l'utilisateur.
Dans Laravel, nous pouvons utiliser diverses méthodes pour implémenter des fonctions de file d'attente, telles que la file d'attente de base de données, la file d'attente Redis, la file d'attente Beanstalkd, etc. Ici, nous prenons une file d'attente de base de données comme exemple pour montrer comment implémenter la fonction de tâches de traitement simultanées.
Tout d'abord, nous devons configurer le pilote de file d'attente dans le fichier de configuration de Laravel config/queue.php
. Nous choisissons d'utiliser la file d'attente de la base de données, définissons l'option connection
sur database
et définissons certaines configurations liées à la connexion à la base de données. config/queue.php
中配置队列驱动。我们选择使用数据库队列,将connection
选项设置为database
,以及设置一些数据库连接的相关配置。
'default' => env('QUEUE_CONNECTION', 'database'), 'connections' => [ 'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'retry_after' => 90, ], ],
2.创建队列表
接下来,我们需要创建一个用于存储队列任务的数据表。可以使用Laravel提供的Artisan命令php artisan queue:table
快速生成迁移文件,并执行迁移。
php artisan queue:table php artisan migrate
然后,我们需要创建一个任务类,用于处理具体的任务逻辑。在Laravel中,任务类一般放在app/Jobs
目录下,可以通过Artisan命令php artisan make:job
快速生成一个任务类。
php artisan make:job SendEmail
生成的任务类SendEmail
位于app/Jobs
目录下,我们可以在该类的handle
方法中编写任务逻辑。
<?php namespace AppJobs; use IlluminateBusQueueable; use IlluminateContractsQueueShouldQueue; use IlluminateFoundationBusDispatchable; use IlluminateQueueInteractsWithQueue; use IlluminateQueueSerializesModels; class SendEmail implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Execute the job. * * @return void */ public function handle() { // 处理发送邮件的逻辑 // ... } }
在任务类中,我们需要实现ShouldQueue
接口,并定义handle
方法来处理任务逻辑。
最后,我们可以通过以下代码将任务推送到队列中。
use AppJobsSendEmail; SendEmail::dispatch();
通过dispatch
方法将任务加入到队列中,系统会自动根据配置选择相应的队列驱动进行处理。
二、Laravel任务调度器
Laravel还提供了一个任务调度器的功能,可以将任务设置为定时执行或者周期性执行。我们可以通过任意的Laravel自带的时间表(Laravel Time Scheduling)来设置任务的执行规则。
首先,我们需要在app/Console/Kernel.php
文件的schedule
方法中定义任务调度。例如,我们定义一个每分钟执行一次的任务。
protected function schedule(Schedule $schedule) { $schedule->job(new SendEmail)->everyMinute(); }
在上述代码中,我们使用了任务类SendEmail
作为调度的执行体,然后通过everyMinute
方法设置任务执行频率为每分钟一次。
任务调度定义成功之后,我们需要在服务器上设置一个Cron表达式以便执行任务调度。
在Linux系统上,可以通过crontab
命令来编辑和设置Cron表达式。
crontab -e
然后,在打开的文件中加入以下代码:
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
上述代码表示每分钟执行一次php artisan schedule:run
rrreee
php artisan queue:table
fournie par Laravel pour générer rapidement des fichiers de migration et effectuer la migration. rrreee
Ensuite, nous devons créer une classe de tâches pour gérer une logique de tâche spécifique. Dans Laravel, les classes de tâches sont généralement placées dans le répertoire app/Jobs
. Vous pouvez générer rapidement une classe de tâches via la commande Artisan php artisan make:job
.
SendEmail
se trouve dans le répertoire app/Jobs
Nous pouvons écrire la logique des tâches dans la méthode handle
de cette classe. . 🎜rrreee🎜Dans la classe de tâches, nous devons implémenter l'interface ShouldQueue
et définir la méthode handle
pour gérer la logique de la tâche. 🎜dispatch
, et le système sélectionnera automatiquement le pilote de file d'attente correspondant pour le traitement en fonction de la configuration. 🎜🎜2. Laravel Task Scheduler🎜🎜Laravel fournit également une fonction de planificateur de tâches, qui peut définir des tâches à exécuter régulièrement ou périodiquement. Nous pouvons définir des règles d'exécution des tâches via n'importe lequel des propres plannings de Laravel (Laravel Time Scheduling). 🎜🎜🎜Définir la planification des tâches🎜🎜🎜Tout d'abord, nous devons définir la planification des tâches dans la méthode schedule
du fichier app/Console/Kernel.php
. Par exemple, nous définissons une tâche qui est exécutée toutes les minutes. 🎜rrreee🎜Dans le code ci-dessus, nous utilisons la classe de tâches SendEmail
comme corps d'exécution du planning, puis définissons la fréquence d'exécution de la tâche à une fois par minute via everyMinute
méthode. 🎜crontab
. 🎜rrreee🎜Ensuite, ajoutez le code suivant au fichier ouvert : 🎜rrreee🎜Le code ci-dessus signifie que la commande php artisan planning:run
sera exécutée toutes les minutes, ce qui déclenchera la planification des tâches. 🎜🎜Grâce à la configuration ci-dessus, nous pouvons réaliser la fonction d'exécution planifiée et d'exécution périodique des tâches. 🎜🎜Résumé : 🎜🎜Grâce aux fonctions de file d'attente Laravel et de planificateur de tâches, nous pouvons facilement réaliser la nécessité de traiter un grand nombre de tâches simultanément. La file d'attente peut pousser les tâches en arrière-plan pour un traitement asynchrone afin d'éviter de bloquer les demandes des utilisateurs. Le planificateur de tâches permet à nos tâches d'être exécutées régulièrement ou périodiquement selon des règles de temps, améliorant ainsi l'efficacité du traitement des tâches. 🎜🎜Ce qui précède est une introduction à la file d'attente et au planificateur de tâches Laravel. J'espère que cela sera utile à tout le monde ! 🎜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!