欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  神坛PHP

解析Laravel5.5之事件监听、任务调度、队列

程序员文章站 2022-01-04 19:58:25
...


二、Laravel 的任务调度(计划任务)功能 Task Scheduling

2.1 call方式

protected function schedule(Schedule $schedule)

    {

        $schedule->call(function (){

            \Log::info('我是call方法实现的定时任务');

        })->everyMinute();

    }


执行:php artisan schedule:run


2.2 crontab方式

echo '***** php /user/schedule/artisan schedule:run >> /dev/null 2>&1' >task.txt

crontab task.txt

crontab -l 看出任务


2.3 command方式

生成命令:php artisan make:command SayHello


namespace App\Console\Commands;

use Illuminate\Console\Command;

class SayHello extends Command

{

    /**

     * The name and signature of the console command.

     *

     * @var string

     */

    protected $signature = 'message:hi';

    /**

     * The console command description.

     *

     * @var string

     */

    protected $description = 'Command description';

    /**

     * Create a new command instance.

     *

     * @return void

     */

    public function __construct()

    {

        parent::__construct();

    }

    /**

     * Execute the console command.

     *

     * @return mixed

     */

    public function handle()

    {

        //书写处理逻辑

        \Log::info('早上好,用户');

    }

}


Kernel.php

protected function schedule(Schedule $schedule)

{

    $schedule->command('message:hi')

             ->everyMinute();

}


执行:php artisan schedule:run


三、队列任务

3.1 驱动的必要设置

QUEUE_DRIVER=database

如:数据库驱动

php artisan queue:table

php artisan migrate


3.2 创建任务

生成任务类:php artisan make:job SendReminderEmail

class SendReminderEmail implements ShouldQueue

{

    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $user;

    /**

     * Create a new job instance.

     *

     * @param User $user

     */

    public function __construct(User $user)

    {

        $this->user = $user;

    }

    /**

     * Execute the job.

     *

     * @return void

     */

    public function handle()

    {

        \Log::info('send reminder email to user' . $this->user->email);

    }

}


3.3 分发任务

你写好任务类后,就能通过 dispatch 辅助函数来分发它了。唯一需要传递给 dispatch 的参数是这个任务类的实例:

利用模型工厂生成30个用户:

php artisan tinker

>>>factory(\App\User::class,30)->create()


public function store(Request $request)

{

    $users = User::where('id','>',24)->get();

    foreach ($users as $user){

        $this->dispatch(new SendReminderEmail($user));

    }

    return 'Done';

}

Route::get('/job', 'UserController@store');

数据库表jobs生成5个队列任务


3.4 运行队列处理器

php artisan queue:work

Tips:要注意,一旦 queue:work 命令开始,它将一直运行,直到你手动停止或者你关闭控制台

处理单一任务:你可以使用 --once 选项来指定仅对队列中的单一任务进行处理

php artisan queue:work --once



拓展:使用 Beanstalkd 管理队列,Supervisor 则是用来监听队列的任务,并在队列存在任务的情况下自动帮我们去执行,免去手动敲 php artisan 的命令,保证自己的队列可以正确执行