laravel 任务队列_laravel 队列实例(一)

导语

之前在写事件/监听器的实例,数据都是直接入库的,实际这一步可以放到队列中去执行。laravel 队列有多种驱动可以选择,这里就使用 redis。

创建队列

使用 php artisan make:job BrowseLogQueue 即可创建队列文件,最终生成 Jobs/BrowseLogQueue.php 文件

功能只是数据入库,代码很简单。需要注意的是,可以在类中指定最大失败次数等配置,代码如下

/**

* 浏览记录入库

*/

namespace App\Jobs;

use App\Events\NotifyAdmin;

use App\Models\BrowseLog;

use Illuminate\Bus\Queueable;

use Illuminate\Queue\SerializesModels;

use Illuminate\Queue\InteractsWithQueue;

use Illuminate\Contracts\Queue\ShouldQueue;

use Illuminate\Foundation\Bus\Dispatchable;

use Exception;

class BrowseLogQueue implements ShouldQueue

{

use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

// 最大失败次数

public $tries = 5;

// 超时

public $timeout = 120;

protected $ip_addr;

protected $request_url;

protected $city_name;

protected $created_at;

protected $updated_at;

/**

* Create a new job instance.

*

* @return void

*/

public function __construct($ip_addr, $request_url, $city_name, $now)

{

$this->ip_addr = $ip_addr;

$this->request_url = $request_url;

$this->city_name = $city_name;

$this->created_at = $now;

$this->updated_at = $now;

}

/**

* Execute the job.

*

* @return void

*/

public function handle(BrowseLog $browseLog)

{

$log = new $browseLog;

$log->ip_addr = $this->ip_addr;

$log->request_url = $this->request_url;

$log->city_name = $this->city_name;

$log->created_at = $this->created_at;

$log->updated_at = $this->updated_at;

$log->save();

}

/**

* 任务失败

* @param Exception $exception

*/

public function failed(Exception $exception)

{

// 发送邮件,通知管理员

event(new NotifyAdmin($exception->getMessage()));

}

}

分发任务

将监听器 CreateBrowseLog.php 文件修改如下

/**

* Handle the event.

*

* @param UserBrowse $event

* @return void

*/

public function handle(UserBrowse $event)

{

// 本地访问不做记录

$arr = ['127.0.0.1'];

if (!in_array($event->ip_addr, $arr)) {

/*$log = new \App\Models\BrowseLog();

$log->ip_addr = $event->ip_addr;

$log->request_url = $event->request_url;

$log->city_name = $event->city_name;

$log->save();*/

BrowseLogQueue::dispatch($event->ip_addr, $event->request_url, $event->city_name, now());

/*BrowseLogQueue::dispatch($event->ip_addr, $event->request_url, $event->city_name)->delay(now()->addMinute(1)); 延时添加

*/

}

}

运行队列

最后一步就是运行队列,执行 php artisan queue:work

运行没有问题,但是到此并没有结束,还需要使用 Supervisor 进程守护,下篇文章继续。

参考资料:队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值