嘿!我有一个应用程序,我必须发送一些电子邮件在某些行动(如用户创建等)。问题是他们不是在后台运行,而是我必须等待,直到该进程完成,然后它重定向到另一个页面。我使用database
驱动程序与queues
,Laravel 5.2
。我的电子邮件代码,为exp,用户创建后:
$this->dispatch(new WelcomeEmail($user));
Artisan::call('queue:work');
其中WelcomeEmail
是推入队列的作业。这种类型的代码放置在我希望发送电子邮件的所有位置。出了什么问题?
4条答案
按热度按时间wz8daaqr1#
首先,您不希望在调度程序中对“queue”命令使用
Artisan::call
。您应该打开终端并执行:
php artisan queue:listen --timeout=0 --tries=1
你应该顺其自然。然后你可以访问你的页面,在那里$this-〉dispatch或者更好的dispatch方法将被调用。
dispatch(new WelcomeEmail($user));
在生产服务器上,应该使用supervisord来监视
php artisan queue:listen
命令,以确保它始终处于启动和运行状态。如需进一步阅读,请访问:https://laravel.com/docs/5.2/queues
bxgwgixi2#
我不知道为什么更改
.env
不足以解决此问题,但将此行从'default' => env('QUEUE_CONNECTION', 'sync'),
到
config/queue.php file
中的'default' => env('QUEUE_CONNECTION', 'database'),
一切正常。ql3eal8s3#
我也遇到过类似的问题,但因为是一个单独的任务,我不希望守护进程总是运行,还有更新代码的问题,...所以我解决了直接从PHP运行命令的问题,比如:
这将启动一个作业,然后关闭,而不等待结果。但是要小心Laravel日志文件权限,如果您在Linux下运行,oidoss.用户可以根据上下文和配置进行更改。
希望能帮上忙。
ajsxfq5m4#
请移除调度程序中对“queue”命令的Artisan::call。并使用此方法进行调度- dispatchAfterResponse
例如:$this-〉响应后调度(新的欢迎电子邮件($user));