Laravel 排队的电子邮件在发送一些后抛出异常

Laravel queued emails throws exception after some are sent

我有一个 Laravel 5.4 应用程序。

我的问题是我每周都有一份工作,需要对一些电子邮件进行排队。

像这样:

Mail::to($user)->queue(new \App\Mail\INBND10\i01($user));

一切看起来都很好,一些电子邮件已送达,但我收到 Trying to get 属性 of non-object 几封电子邮件后出现异常已发送。

Sentry 告诉我这是在邮件构建方法中,如下所示:

知道是什么原因导致了这种奇怪的行为吗?

编辑

StackTrace

ErrorException: Trying to get property of non-object
#40 vendor/laravel/framework/src/Illuminate/Mail/Mailable.php(462): handleError
#39 vendor/sentry/sentry/lib/Raven/Breadcrumbs/ErrorHandler.php(34): handleError
#38 vendor/laravel/framework/src/Illuminate/Mail/Mailable.php(462): setAddress
#37 vendor/laravel/framework/src/Illuminate/Mail/Mailable.php(346): from
#36 app/Mail/INBND10/i01.php(35): build
#35 app/Mail/INBND10/i01.php(0): call_user_func_array
#34 vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): Illuminate\Container\{closure}
#33 vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): callBoundMethod
#32 vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): call
#31 vendor/laravel/framework/src/Illuminate/Container/Container.php(539): call
#30 vendor/laravel/framework/src/Illuminate/Mail/Mailable.php(116): send
#29 vendor/laravel/framework/src/Illuminate/Mail/SendQueuedMailable.php(52): handle
#28 vendor/laravel/framework/src/Illuminate/Mail/SendQueuedMailable.php(0): call_user_func_array
#27 vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): Illuminate\Container\{closure}
#26 vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): callBoundMethod
#25 vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): call
#24 vendor/laravel/framework/src/Illuminate/Container/Container.php(539): call
#23 vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(94): Illuminate\Bus\{closure}
#22 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(114): Illuminate\Pipeline\{closure}
#21 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): then
#20 vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): dispatchNow
#19 vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(42): call
#18 vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(69): fire
#17 vendor/laravel/framework/src/Illuminate/Queue/Worker.php(317): process
#16 vendor/laravel/framework/src/Illuminate/Queue/Worker.php(267): runJob
#15 vendor/laravel/framework/src/Illuminate/Queue/Worker.php(113): daemon
#14 vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(101): runWorker
#13 vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(85): fire
#12 vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(0): call_user_func_array
#11 vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(29): Illuminate\Container\{closure}
#10 vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(87): callBoundMethod
#9 vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(31): call
#8 vendor/laravel/framework/src/Illuminate/Container/Container.php(539): call
#7 vendor/laravel/framework/src/Illuminate/Console/Command.php(182): execute
#6 vendor/symfony/console/Command/Command.php(251): run
#5 vendor/laravel/framework/src/Illuminate/Console/Command.php(167): run
#4 vendor/symfony/console/Application.php(946): doRunCommand
#3 vendor/symfony/console/Application.php(248): doRun
#2 vendor/symfony/console/Application.php(148): run
#1 vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(122): handle
#0 artisan(35): null

万一有人无意中发现了这个。

我们使用 Laravel Forge 来部署我们的应用程序,尽管我在每次部署时都使用 运行 php artisan queue:restart 命令,但有些工作人员从未重新启动,有些工作人员已启动超过 12 天。

因此,当其中一名工人被分配到 运行 工作时,他们崩溃了,因为他们没有更新的代码。

这就是为什么有些电子邮件在崩溃前发送的原因。

如何修复

为了解决这个问题,当我在 Forge 上创建队列工作者时,我必须设置一个超时值。所以这样一来,none 的工人将被冻结,他们将按预期重新启动。

https://laravel.com/docs/5.7/queues#job-expirations-and-timeouts