Maison > cadre php > Laravel > Files d'attente Laravel et planificateur de tâches : traitement simultané d'un grand nombre de tâches

Files d'attente Laravel et planificateur de tâches : traitement simultané d'un grand nombre de tâches

王林
Libérer: 2023-08-13 09:51:15
original
2283 Les gens l'ont consulté

Files dattente Laravel et planificateur de tâches : traitement simultané dun grand nombre de tâches

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.

  1. Configuration du pilote de file d'attente

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,
    ],
],
Copier après la connexion

2.创建队列表

接下来,我们需要创建一个用于存储队列任务的数据表。可以使用Laravel提供的Artisan命令php artisan queue:table快速生成迁移文件,并执行迁移。

php artisan queue:table
php artisan migrate
Copier après la connexion
  1. 创建任务类

然后,我们需要创建一个任务类,用于处理具体的任务逻辑。在Laravel中,任务类一般放在app/Jobs目录下,可以通过Artisan命令php artisan make:job快速生成一个任务类。

php artisan make:job SendEmail
Copier après la connexion

生成的任务类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()
    {
        // 处理发送邮件的逻辑
        // ...
    }
}
Copier après la connexion

在任务类中,我们需要实现ShouldQueue接口,并定义handle方法来处理任务逻辑。

  1. 推送任务到队列

最后,我们可以通过以下代码将任务推送到队列中。

use AppJobsSendEmail;

SendEmail::dispatch();
Copier après la connexion

通过dispatch方法将任务加入到队列中,系统会自动根据配置选择相应的队列驱动进行处理。

二、Laravel任务调度器

Laravel还提供了一个任务调度器的功能,可以将任务设置为定时执行或者周期性执行。我们可以通过任意的Laravel自带的时间表(Laravel Time Scheduling)来设置任务的执行规则。

  1. 定义任务调度

首先,我们需要在app/Console/Kernel.php文件的schedule方法中定义任务调度。例如,我们定义一个每分钟执行一次的任务。

protected function schedule(Schedule $schedule)
{
    $schedule->job(new SendEmail)->everyMinute();
}
Copier après la connexion

在上述代码中,我们使用了任务类SendEmail作为调度的执行体,然后通过everyMinute方法设置任务执行频率为每分钟一次。

  1. 初始化任务调度

任务调度定义成功之后,我们需要在服务器上设置一个Cron表达式以便执行任务调度。

在Linux系统上,可以通过crontab命令来编辑和设置Cron表达式。

crontab -e
Copier après la connexion

然后,在打开的文件中加入以下代码:

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
Copier après la connexion

上述代码表示每分钟执行一次php artisan schedule:runrrreee

2. Créer une table de file d'attente

Ensuite, nous devons créer une table de données pour stocker les tâches de file d'attente. Vous pouvez utiliser la commande Artisan php artisan queue:table fournie par Laravel pour générer rapidement des fichiers de migration et effectuer la migration.

rrreee

    Créer une classe de tâches

    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.

    rrreee🎜La classe de tâches générée 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. 🎜
      🎜Pousser la tâche vers la file d'attente🎜🎜🎜Enfin, nous pouvons pousser la tâche vers la file d'attente via le code suivant. 🎜rrreee🎜Ajoutez la tâche à la file d'attente via la méthode 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. 🎜
        🎜Initialiser la planification des tâches🎜🎜🎜Une fois la planification des tâches définie avec succès, nous devons définir une expression Cron sur le serveur pour effectuer la planification des tâches. 🎜🎜Sur les systèmes Linux, vous pouvez modifier et définir des expressions Cron via la commande 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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal