Rumah > Artikel > rangka kerja php > Barisan Laravel dan Penjadual Tugas: Memproses Sebilangan Besar Tugasan Secara serentak
Laravel Queue dan Penjadual Tugas: Memproses Sebilangan Besar Tugas Secara serentak
Dalam pembangunan aplikasi web moden, selalunya terdapat senario di mana sejumlah besar tugas perlu diproses. Contohnya, menghantar e-mel, menjana laporan, memproses data besar, dsb. Tetapi apabila jumlah tugasan adalah sangat besar, satu permintaan untuk memproses tugasan ini boleh menyebabkan permintaan itu ditangguhkan untuk masa yang lama atau sumber sistem kehabisan. Untuk menyelesaikan masalah ini, Laravel menyediakan baris gilir dan fungsi penjadual tugas, yang boleh memproses sejumlah besar tugas secara serentak.
1. Laravel Queue
Queue ialah mekanisme yang menolak tugasan ke latar belakang untuk pemprosesan tak segerak Melalui baris gilir, aplikasi kami boleh memproses operasi yang memakan masa di latar belakang tanpa menjejaskan kelajuan tindak balas permintaan pengguna.
Dalam Laravel, kita boleh menggunakan pelbagai kaedah untuk melaksanakan fungsi baris gilir, seperti baris gilir pangkalan data, gilir Redis, gilir Beanstalkd, dll. Di sini, kami mengambil baris gilir pangkalan data sebagai contoh untuk menunjukkan cara melaksanakan fungsi tugas pemprosesan serentak.
Mula-mula, kita perlu mengkonfigurasi pemacu gilir dalam fail konfigurasi Laravel config/queue.php
. Kami memilih untuk menggunakan baris gilir pangkalan data, tetapkan pilihan sambungan
kepada pangkalan data
dan tetapkan beberapa konfigurasi berkaitan sambungan pangkalan data. 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
yang disediakan oleh Laravel untuk menjana fail migrasi dan melakukan migrasi dengan cepat. rrreee
Kemudian, kita perlu mencipta kelas tugas untuk mengendalikan logik tugasan tertentu. Dalam Laravel, kelas tugas biasanya diletakkan dalam direktori app/Jobs
Anda boleh menjana kelas tugasan dengan cepat melalui perintah Artisan php artisan make:job
.
SendEmail
terletak dalam direktori app/Jobs
Kita boleh menulis logik tugasan dalam kaedah handle
kelas ini . 🎜rrreee🎜Dalam kelas tugasan, kita perlu melaksanakan antara muka ShouldQueue
dan mentakrifkan kaedah handle
untuk mengendalikan logik tugasan. 🎜jadual
fail app/Console/Kernel.php
. Sebagai contoh, kami mentakrifkan tugas yang dilaksanakan setiap minit. 🎜rrreee🎜Dalam kod di atas, kami menggunakan kelas tugas SendEmail
sebagai badan pelaksanaan jadual, dan kemudian menetapkan kekerapan pelaksanaan tugas kepada sekali seminit melalui everyMinute
kaedah. 🎜crontab
. 🎜rrreee🎜Kemudian, tambahkan kod berikut pada fail yang dibuka: 🎜rrreee🎜Kod di atas bermaksud arahan php artisan schedule:run
akan dilaksanakan setiap minit, yang akan mencetuskan penjadualan tugas. 🎜🎜Melalui konfigurasi di atas, kita boleh merealisasikan fungsi pelaksanaan berjadual dan pelaksanaan tugas secara berkala. 🎜🎜Ringkasan: 🎜🎜Melalui fungsi baris gilir Laravel dan penjadual tugas, kita boleh dengan mudah menyedari keperluan untuk memproses sejumlah besar tugas secara serentak. Barisan gilir boleh menolak tugas ke latar belakang untuk pemprosesan tak segerak untuk mengelakkan permintaan pengguna disekat. Penjadual tugas membolehkan tugasan kami dilaksanakan secara tetap atau berkala mengikut peraturan masa, meningkatkan kecekapan pemprosesan tugas. 🎜🎜Di atas adalah pengenalan kepada baris gilir dan penjadual tugas Laravel, saya harap ia akan membantu semua orang! 🎜Atas ialah kandungan terperinci Barisan Laravel dan Penjadual Tugas: Memproses Sebilangan Besar Tugasan Secara serentak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!