Laravel 5.1中Mail::later()未按预期延迟发送问题咨询
问题原因
你遇到的邮件没按预期延迟发送、反而立即发出的问题,核心根源就是当前用的队列驱动是sync!
Laravel的sync驱动是同步执行模式,这个模式下所有队列任务都会在当前请求的流程里直接运行,完全不会把任务放进队列存储、等待延迟触发。Mail::later()的设计逻辑本是把邮件任务丢进队列,让队列系统在指定时间后再执行,但sync驱动直接跳过了「队列存储+延迟调度」这一核心环节,所以邮件自然就立刻发出去了。
解决步骤
要让Mail::later()的延迟功能生效,你需要切换到支持延迟任务的队列驱动,比如database、redis或者beanstalkd,这里以最容易上手的database驱动为例:
- 创建队列数据表
先运行Artisan命令生成队列所需的数据表迁移文件,再执行迁移创建表:php artisan queue:table php artisan migrate - 修改队列驱动配置
打开项目根目录的.env文件,把队列驱动改成database:
(注意:Laravel 5.1用的是QUEUE_DRIVER=databaseQUEUE_DRIVER,后续版本才改成QUEUE_CONNECTION,别搞混了) - 启动队列监听进程
最后必须启动队列监听,系统才会定时检查队列里的延迟任务并执行:
开发环境用php artisan queue:listenqueue:listen就够了,它会自动重新加载代码;生产环境建议用queue:work --daemon,再配合Supervisor工具保证队列进程一直运行,避免意外退出。
内容的提问来源于stack exchange,提问作者Blues Clues
相关产品推荐
相关产品推荐

