Laravel队列作业在后台不起作用

时间:2016-10-24 11:39:30

标签: laravel

HY!我有一个应用程序,我必须在某些操作(如用户创建等)发送一些电子邮件。问题是它们没有在后台运行,而是我必须等到该过程完成,然后它将我重定向到另一个页面。 我将database驱动程序与queuesLaravel 5.2一起使用。 用户创建后我的电子邮件代码,用于exp:

$this->dispatch(new WelcomeEmail($user));
Artisan::call('queue:work');

其中WelcomeEmail是推送到队列的作业。这种类型的代码放在我希望发送电子邮件的所有地方。有什么问题?

3 个答案:

答案 0 :(得分:3)

首先,您不希望在调度程序中对“队列”命令使用Artisan::call

你应该打开你的终端并执行:php artisan queue:listen --timeout=0 --tries=1你应该让它成为 然后,您可以访问您的页面,其中将调用$ this-> dispatch或甚至更好的调度方法。该页面上的代码应为:
dispatch(new WelcomeEmail($user));

在生产服务器上,您应该使用supervisord监视php artisan queue:listen命令,以确保它始终正常运行。

如需进一步阅读,请访问:https://laravel.com/docs/5.2/queues

答案 1 :(得分:1)

我不知道为什么更改.env不足以解决问题,但是从

更改了此行之后

'default' => env('QUEUE_CONNECTION', 'sync'),

'default' => env('QUEUE_CONNECTION', 'database'), 中的

config/queue.php file 一切正常。

答案 2 :(得分:0)

我遇到了类似的问题,但由于是单一的工作,我不想让守护进程总是运行,还有更新代码问题,....所以我解决了直接从PHP运行命令,像:

exec(' nohup php / my_folder / artisan queue:work --once> / dev / null 2>& 1&');

这将启动一个作业然后关闭,而不等待结果。但要注意laravel日志文件权限,o。如果您在linux下运行,用户可以根据上下文和配置进行更改。

希望可以帮助别人。