专栏首页唐成勇Laravel5.5之事件监听、任务调度、队列

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

一、事件监听

流程:

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

2.2 command方式

生成命令:php artisan make:command SayHello

<?php

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个用户:

    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 的命令,保证自己的队列可以正确执行

致谢

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

参考文档:Laravel5.5 的事件系统 参考视频01:Coding 10编程原动力 - Laravel5.5 事件监听 参考视频02:Coding 10编程原动力 - Laravel5.5 定时任务 参考视频03:轻松使用 Laravel 队列

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker简介、常用命令与实践(二)

    Docker Hub 上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像。 从 Docker 镜像仓库获取镜像的命令是 docker pull。其命...

    唐成勇
  • Swoole入门到实战(一):PHP7&Swoole源码安装、玩转网络通信引擎、异步非堵塞IO场景

    source FileName 作用:在当前bash环境下读取并执行FileName中的命令。 用于重新执行刚修改的初始化文档,如 .bash_pro...

    唐成勇
  • Laravel之collection

    通过 API 后获取到数据,将数据转化为得分的一种机制,首先会尝试 foreach 的方式,然后再用 Laravel 的 Collection 来优化和...

    唐成勇
  • 携程酒店真实房价抓取

    携程的反爬机制有点让人害怕,当某些参数不对的时候,直接返回的房价价格比实际价格要高,这也可以当作“千人千面”吧。

    Python编程与实战
  • 推荐系统遇上深度学习(三十)--深度矩阵分解模型理论及实践

    本文提出了一种基于神经网络结构的矩阵分解模型。该模型综合考虑了用户对物品的显式评分和非偏好隐式反馈,然后通过两组神经网络将用户和物品的特征提取到一个低维空间;并...

    石晓文
  • 基于Django的电子商务网站开发(连载22)

    表3-4为商品信息列表的测试用例。测试目的是把测试数据中的商品信息插入到数据库中,检验这个商品的列表信息是否可以正确地被显示出来。

    小老鼠
  • Oracle数据库重做日志及归档日志的工作原理说明

    Oracle数据库重做日志及归档日志的工作原理: lgwr进程将redo log buffer中的重做数据写入到redo log中,此时的redo log分组,...

    洗尽了浮华
  • 【php设计模式】策略模式

    策略模式是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化...

    码缘
  • Presto介绍与常用查询优化方法

    Hive使用MapReduce作为底层计算框架,是专为批处理设计的。但随着数据越来越多,使用Hive进行一个简单的数据查询可能要花费几分到几小时,显然不能满足交...

    高广超
  • 译文:Python深度学习框架评价

    原文链接https://indico.io/blog/python-deep-learning-frameworks-reviewed/ 麦迪逊月 - 201...

    小莹莹

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动