[英]Laravel Job Queue not processing using Redis driver
我正在創建一個作業,將其推送到自定義隊列,並嘗試使用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
嗎php artisan queue:listen --queue=live
?
您需要在運行listen命令時定義隊列名稱,否則您最終只會監聽default
隊列。
如果您想在生產中運行多個隊列和管理事物,您可以使用Upstart (與設置Laravel隊列無直接關系,但提供良好的起點)或Supervisor來管理流程。 這兩種都可以在Forge和Homestead上找到。
最后假設您使用的是Laravel 5,您可能需要考慮運行php artisan queue:work --daemon --queue=live
因為這樣可以減少運行worker的CPU開銷,因為它不會為每個作業重新加載框架。 但是,您必須記住在為作業部署新代碼時重新啟動工作程序,否則將無法獲取任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.