Laravel Queue und Task Scheduler: Gleichzeitige Verarbeitung einer großen Anzahl von Aufgaben
In der modernen Webanwendungsentwicklung gibt es häufig Szenarien, in denen eine große Anzahl von Aufgaben verarbeitet werden muss. Versenden Sie beispielsweise E-Mails, erstellen Sie Berichte, verarbeiten Sie Big Data usw. Wenn die Anzahl der Aufgaben jedoch sehr groß ist, kann eine einzelne Anforderung zur Verarbeitung dieser Aufgaben dazu führen, dass die Anforderung lange verzögert wird oder die Systemressourcen erschöpft sind. Um dieses Problem zu lösen, bietet Laravel Warteschlangen- und Aufgabenplanerfunktionen, die eine große Anzahl von Aufgaben gleichzeitig verarbeiten können.
1. Laravel Queue
Queue ist ein Mechanismus, der Aufgaben zur asynchronen Verarbeitung in den Hintergrund verschiebt. Über die Warteschlange kann unsere Anwendung zeitaufwändige Vorgänge im Hintergrund verarbeiten, ohne die Antwortgeschwindigkeit des Benutzers zu beeinträchtigen.
In Laravel können wir verschiedene Methoden verwenden, um Warteschlangenfunktionen zu implementieren, z. B. Datenbankwarteschlange, Redis-Warteschlange, Beanstalkd-Warteschlange usw. Hier nehmen wir als Beispiel eine Datenbankwarteschlange, um zu demonstrieren, wie die Funktion gleichzeitiger Verarbeitungsaufgaben implementiert wird.
Zuerst müssen wir den Warteschlangentreiber in Laravels Konfigurationsdatei config/queue.php
konfigurieren. Wir entscheiden uns für die Verwendung der Datenbankwarteschlange, setzen die Option connection
auf database
und legen einige Konfigurationen für die Datenbankverbindung fest. 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
verwenden, um schnell Migrationsdateien zu generieren und die Migration durchzuführen. rrreee
Dann müssen wir eine Aufgabenklasse erstellen, um bestimmte Aufgabenlogik zu verarbeiten. In Laravel werden Aufgabenklassen im Allgemeinen im Verzeichnis app/Jobs
abgelegt. Sie können eine Aufgabenklasse schnell über den Artisan-Befehl php artisan make:job
generieren.
SendEmail
befindet sich im Verzeichnis app/Jobs
. Wir können Aufgabenlogik in die Methode handle
dieser Klasse schreiben . 🎜rrreee🎜In der Task-Klasse müssen wir die Schnittstelle ShouldQueue
implementieren und die Methode handle
definieren, um die Task-Logik zu verarbeiten. 🎜dispatch
zur Warteschlange hinzu, und das System wählt automatisch den entsprechenden Warteschlangentreiber zur Verarbeitung entsprechend der Konfiguration aus. 🎜🎜2. Laravel Task Scheduler🎜🎜Laravel bietet auch eine Taskplaner-Funktion, mit der Aufgaben so eingestellt werden können, dass sie regelmäßig oder periodisch ausgeführt werden. Wir können Aufgabenausführungsregeln über jeden der eigenen Zeitpläne von Laravel festlegen (Laravel Time Scheduling). 🎜🎜🎜Aufgabenplanung definieren🎜🎜🎜Zuerst müssen wir die Aufgabenplanung in der Methode schedule
der Datei app/Console/Kernel.php
definieren. Beispielsweise definieren wir eine Aufgabe, die jede Minute ausgeführt wird. 🎜rrreee🎜Im obigen Code verwenden wir die Aufgabenklasse SendEmail
als Ausführungskörper des Zeitplans und legen dann die Häufigkeit der Aufgabenausführung über everyMinute
auf einmal pro Minute fest Verfahren. 🎜crontab
bearbeiten und festlegen. 🎜rrreee🎜Fügen Sie dann den folgenden Code zur geöffneten Datei hinzu: 🎜rrreee🎜Der obige Code bedeutet, dass der Befehl php artisan scheme:run
jede Minute ausgeführt wird, wodurch die Aufgabenplanung ausgelöst wird. 🎜🎜Durch die obige Konfiguration können wir die Funktion der geplanten Ausführung und periodischen Ausführung von Aufgaben realisieren. 🎜🎜Zusammenfassung: 🎜🎜Durch die Funktionen der Laravel-Warteschlange und des Aufgabenplaners können wir die Notwendigkeit, eine große Anzahl von Aufgaben gleichzeitig zu verarbeiten, leicht erkennen. Die Warteschlange kann Aufgaben zur asynchronen Verarbeitung in den Hintergrund verschieben, um ein Blockieren von Benutzeranforderungen zu vermeiden. Der Aufgabenplaner ermöglicht die regelmäßige oder periodische Ausführung unserer Aufgaben nach Zeitregeln und verbessert so die Effizienz der Aufgabenbearbeitung. 🎜🎜Das Obige ist eine Einführung in die Laravel-Warteschlange und den Aufgabenplaner. Ich hoffe, es wird für alle hilfreich sein! 🎜Das obige ist der detaillierte Inhalt vonLaravel-Warteschlangen und Aufgabenplaner: Gleichzeitige Verarbeitung einer großen Anzahl von Aufgaben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!