博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel5.5之事件监听、任务调度、队列
阅读量:6717 次
发布时间:2019-06-25

本文共 3025 字,大约阅读时间需要 10 分钟。

一、事件监听

流程:

clipboard.png

1.1 创建event

php artisan make:event UserLogin

LoginController.php

/**     * The user has been authenticated.     *     * @param  \Illuminate\Http\Request  $request     * @param  mixed  $user     * @return mixed     */    protected function authenticated(Request $request, $user)    {        event(new UserLogin($user));    }

1.2 创建listener

1.2.1 方式一:手动创建

php artisan make:listener EmailAdminUserLogin --event=UserLogin

1.2.2 方式二:推荐如下方式:自动生成事件和监听

//应用程序的事件监听器映射class EventServiceProvider extends ServiceProvider{    /**     * The event listener mappings for the application.     *     * @var array     */    protected $listen = [        'App\Events\UserLogin' => [            'App\Listeners\UserLogin\EmailAdminUserLogin',            'App\Listeners\UserLogin\TraceUser',            'App\Listeners\UserLogin\AddUserLoginCounter',        ],        'App\Events\UserLogout' => [            'App\Listeners\UserLogout\EmailAdminUserLogout',            'App\Listeners\UserLogout\TraceUser',        ],    ];    /**     * Register any events for your application.     *     * @return void     */    public function boot()    {        parent::boot();        Event::listen('event.*', function ($eventName, array $data) {            //        });    }}

生成事件 & 监听器:php artisan event:generate

二、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方式

clipboard.png

2.2 command方式

生成命令:php artisan make:command SayHello

Kernel.php

protected function schedule(Schedule $schedule){    $schedule->command('message:hi')             ->everyMinute();}

执行:php artisan schedule:run

三、队列任务

3.1 驱动的必要设置

    QUEUE_DRIVER=database

如:数据库驱动

php artisan queue:tablephp 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个用户:

clipboard.png

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个队列任务:

clipboard.png

3.4 运行队列处理器

php artisan queue:work

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

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

php artisan queue:work --once

clipboard.png

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

致谢

谢谢你看到这里,有什么问题可以在评论区留言交流,谢谢!

转载地址:http://esumo.baihongyu.com/

你可能感兴趣的文章
零零散散学算法之详解几种数据存储结构
查看>>
我的友情链接
查看>>
关于vmware station 12pro 简易安装
查看>>
有用的正则表达式
查看>>
mysql show status解释
查看>>
Spark 下操作 HBase(1.0.0 新 API)
查看>>
PostgreSQL数据库切割和组合字段函数
查看>>
Jboss & Wildfly
查看>>
.NET简谈组件程序设计之(渗入序列化过程)
查看>>
DataGuard参数配置详解
查看>>
2010(Flex 初次使用 小节:No.2)
查看>>
VirtualBox 共享文件夹自动挂载
查看>>
PHP中使用PDO执行LIMIT语句无结果的问题
查看>>
apache日志统计工具
查看>>
查询rowid行数据所对应的数据对象编号,文件编号,块编号和行编号
查看>>
JSP数据库编程指南
查看>>
关于开发体系和开发过程
查看>>
配置管理小报101014:如何看wincvs的diff信息?
查看>>
消费者行为学
查看>>
构建HTTP中间件
查看>>