app\Providers\EventServiceProvider.php
加入测试事件 /**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
// passport 移除失效令牌事件
'Laravel\Passport\Events\AccessTokenCreated' => [
'App\Listeners\RevokeOldTokens',
],
'Laravel\Passport\Events\RefreshTokenCreated' => [
'App\Listeners\PruneOldTokens',
],
// 测试事件
'App\Events\Test' => [
'App\Listeners\TestListener',
],
];
php artisan event:generate
生成事件和监听器
使用命令生成的监听器会自动帮你引入ShouldQueue(队列接口),接下来你要在刚刚生成的TestListener中implements该接口。<?php
namespace App\Listeners;
use App\Events\Test;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class TestListener implements ShouldQueue
{
/**
* 任务应该发送到的队列的连接的名称
*
* @var string|null
*/
public $connection = 'redis';
/**
* 任务应该发送到的队列的名称
*
* @var string|null
*/
public $queue = 'FMock';
}
<?php
namespace App\Events;
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class Test
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $user;
/**
* Create a new event instance.
*
* @param $user
*
* @return void
*/
public function __construct(User $user)
{
//
$this->user = $user;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('test');
}
}
TestListener.php中传入做具体修改操作:
<?php
namespace App\Listeners;
use App\Events\Test;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class TestListener implements ShouldQueue
{
/**
* 任务应该发送到的队列的连接的名称
*
* @var string|null
*/
public $connection = 'redis';
/**
* 任务应该发送到的队列的名称
*
* @var string|null
*/
public $queue = 'FMock';
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param Test $event
* @return void
*/
public function handle(Test $event)
{
//
$event->user->avatar = 'test' . rand();
$event->user->save();
}
}
<?php
/**
* @Author huaixiu.zhen
* http://litblc.com
* User: z00455118
* Date: 2018/12/19
* Time: 15:59
*/
namespace App\Http\Controllers\Web;
use App\Events\Test;
use App\Repositories\Eloquent\UserRepository;
class IndexController
{
public function index()
{
return 'hello web';
}
public function event(UserRepository $userRepository)
{
$user = $userRepository->find(14);
event(new Test($user));
return '事件测试';
}
}
php artisan queue:work redis --queue=FMock --daemon --quiet --delay=3 --sleep=3 --tries=3
该脚本定义了一下优化参数,执行redis中名字为FMock的队列,不输出任何信息,3秒一次,失败后3秒重新执行,最多执行3次。
public $queue = 'FMock';
,所以要在配置文件中增加: 'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'FMock',
'retry_after' => 90,
],
搞定!
执行一下我们的控制器方法,快速(3s内)查看redis,就可以看到queues:FMock的键值,队列执行完毕则被删除。
这段测试代码可以在我的gayhub找到并执行。