我正在创建一个作业,将其推送到自定义队列,并尝试使用Redis驱动程序在作业到达队列时处理作业,但没有成功:
class MyController extends Controller {
public function method() {
$job = (new UpdateLiveThreadJob())->onQueue('live');
$this->dispatch($job);
}
}
这是我的队列配置:
'default' => env('QUEUE_DRIVER'),
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'expire' => 60,
],
这是我的.env
文件:
# Drivers (Queues & Broadcasts)
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=redis
BROADCAST_DRIVER=redis
这是我的工作:
class UpdateLiveThreadJob extends Job implements SelfHandling, ShouldQueue
{
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// Rerender content
$templatedOutput = view('templates.livethreadcontents')->with([
'updates' => collect(Redis::lrange('live:updates', 0, -1))->reverse()->map(function($update) {
return json_decode($update);
})
])->render();
// Connect to external service
// Update Thread
}
}
事实上,我可以将handle
方法更改为不执行任何操作,以确保作业中没有任何实际导致它失败的内容,并且它仍然不会处理:
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
print_r('test');
}
使用Redis,我可以看到它被推到了队列中:
> lrange queues:live 0 -1
> // json encoded job present
> llen queues:live
> // shows there is a job in the queue
然而,据我所知,它从未真正开火。观看php artisan queue:listen
不会显示任何内容(仅显示不相关的事件广播)。这是怎么回事?
Laravel 5.3对队列进行了更改。现在您将运行php artisan queue:work --queue=live
,这应该可以满足您的需要。
我在下面留下了我的原始答案。
你还记得运行php artisan queue:listen --queue=live
吗?
运行侦听命令时需要定义队列名称,否则最终只侦听default
队列。
如果你想在生产中运行多个队列并管理事务,你可以使用Upstart(与设置Laravel队列没有直接关系,但提供了一个很好的起点)或Supervisor来管理流程。这两者都可以在Forge和Homestead上获得。
最后,假设您使用的是Laravel 5,您可能需要考虑运行php artisan queue:work --daemon --queue=live
,因为这减少了运行worker的CPU开销,因为它不会为每个作业重新加载框架。但是,当您为作业部署新代码时,必须记住重新启动工作程序,否则就无法处理问题。