HY!我有一个应用程序,我必须在某些操作(如用户创建等)发送一些电子邮件。问题是它们没有在后台运行,而是我必须等到该过程完成,然后它将我重定向到另一个页面。
我将database
驱动程序与queues
,Laravel 5.2
一起使用。
用户创建后我的电子邮件代码,用于exp:
$this->dispatch(new WelcomeEmail($user));
Artisan::call('queue:work');
其中WelcomeEmail
是推送到队列的作业。这种类型的代码放在我希望发送电子邮件的所有地方。有什么问题?
答案 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下运行,用户可以根据上下文和配置进行更改。
希望可以帮助别人。