Я создаю задание, помещаю его в пользовательскую очередь и пытаюсь использовать драйвер 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
ничего не показывает (только несвязанные трансляции событий). Что тут происходит?
Вы помните, чтобы бежать php artisan queue:listen --queue=live
?
Вам нужно определить имя очереди при запуске команды прослушивания, в противном случае вы в конечном итоге только слушаете default
очередь.
Если вы хотите запустить несколько очередей и управлять вещами в производстве, вы можете использовать что-то вроде Выскочка (не имеет прямого отношения к настройке очередей Laravel, но обеспечивает хорошую отправную точку) или Руководитель управлять процессами. Оба из них доступны в Forge и Homestead.
Наконец, предполагая, что вы находитесь на Laravel 5, вы можете рассмотреть возможность запуска php artisan queue:work --daemon --queue=live
так как это снижает нагрузку на ЦП при запуске работника, так как он не перезагружает платформу при каждом задании. Но вы должны помнить, чтобы перезапустить работника при развертывании нового кода для ваших заданий, в противном случае ничего не получится.
Других решений пока нет …