Laravel 5.4中php artisan queue:work无法运行,邮件队列不生效求助
解决Laravel 5.4队列发送验证邮件无响应的问题
我完全理解你现在的困扰——jobs表已经有任务记录,但php artisan queue:work就是没输出,Gmail验证邮件也收不到,折腾半天找不到问题确实让人头大。咱们一步步排查,应该能快速定位问题:
1. 先确认队列驱动与配置是否正确
Laravel 5.4默认用的是sync同步驱动,这种模式下任务不会存入jobs表,会直接执行。既然你的jobs表有数据,说明你应该配置了database驱动,但还是要再核对:
- 检查
.env文件:确保QUEUE_DRIVER=database(注意Laravel 5.4用的是QUEUE_DRIVER,不是后续版本的QUEUE_CONNECTION) - 检查
config/queue.php中的database配置:确认数据库连接和你的主应用数据库一致,避免worker连错库读不到任务 - 如果之前执行过
php artisan config:cache,一定要运行php artisan config:clear刷新配置,否则worker会使用旧的缓存配置
2. 排查Job类的序列化与依赖问题
直接传递模型实例到Job有时会遇到序列化异常,尤其是模型带有复杂关联时。可以尝试改为传递用户ID,在handle方法中重新获取用户:
// 修改SendVerificationEmail类 namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Support\Facades\Mail; use App\User; class SendVerificationEmail implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $userId; public function __construct($userId) { $this->userId = $userId; } public function handle() { $user = User::findOrFail($this->userId); $data = ['email_token' => $user->email_token]; Mail::send('email.email', $data, function($message) use ($user) { $message->subject('This mail send by Queue Laravel 5.4'); $message->to($user->email); }); } }
然后在RegistrationController的register方法中修改dispatch代码:
dispatch(new SendVerificationEmail($user->id));
同时确认RegistrationController顶部已经引入Job类:
use App\Jobs\SendVerificationEmail;
3. 验证邮件配置本身是否正常
队列没反应也可能是邮件发送本身失败,先跳过队列测试同步发送是否可行:
- 在routes/web.php中添加测试路由:
Route::get('/test-mail', function() { Mail::send('email.email', [], function($message) { $message->subject('Test Direct Mail')->to('your-test-email@example.com'); }); return 'Test mail dispatched'; });
访问该路由,如果收不到邮件,说明是Gmail配置的问题:
- 确保
.env中的Gmail配置正确:MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=your-gmail@gmail.com MAIL_PASSWORD=your-app-specific-password // 开启2FA的账号必须用应用密码,不能用普通密码 MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=your-gmail@gmail.com MAIL_FROM_NAME="Your App Name" - 注意:Gmail现在禁止低安全性应用,开启2FA的账号必须在Google账号设置中创建应用密码来替代普通密码。
4. 查看队列worker的详细输出与失败任务
运行worker时加上--verbose参数,能看到详细的执行日志,方便排查错误:
php artisan queue:work --verbose --tries=1
如果任务执行失败,Laravel会把任务存入failed_jobs表(需要先创建该表):
php artisan queue:failed-table php artisan migrate
之后可以用以下命令查看失败任务:
php artisan queue:failed
同时检查storage/logs/laravel.log文件,里面会记录队列执行或邮件发送的异常信息,比如权限问题、类找不到等。
5. 确认worker的运行环境
如果你的.env设置了APP_ENV=local,运行worker时要指定环境,否则可能读取到默认的production配置:
php artisan queue:work --env=local
内容的提问来源于stack exchange,提问作者toto01
相关产品推荐
相关产品推荐

