分段错误(核心转储)Laravel SwiftMailer
Posted
技术标签:
【中文标题】分段错误(核心转储)Laravel SwiftMailer【英文标题】:Segmentation fault (core dumped) Laravel SwiftMailer 【发布时间】:2018-07-16 16:04:10 【问题描述】:我在使用 SwiftMailer Laravel 5.2 时遇到问题。我有一个用于发送电子邮件的控制器,我将其设置为每分钟运行一次。当我使用 php artisan schedule:run 执行下面的脚本时,它会不断返回错误消息“分段错误(核心转储)”。
我的脚本:
public static function sendMailCoc()
$mail_log = MailLog::where('status', '!=', 'SENT')->where('type', '3')->orderBy('id', 'asc')->get();
foreach($mail_log as $mail)
if($mail->to!='')
$coc = json_decode($mail->parameter, true);
try
Mail::queue($mail->file_view,
['to' => $mail->to_name,
'coc' => $coc,
'notif_id' => $mail->notification_id
],
function ($message) use ($mail)
$message->to($mail->to)
->subject($mail->subject);
);
$mail->status = 'SENT';
$mail->error_message = '';
$mail->save();
catch(Swift_TransportException $e)
$mail->status = 'ERROR';
$mail->error_message = $e->getMessage();
$mail->save();
continue;
catch (Exception $e)
$mail->status = 'ERROR';
$mail->error_message = $e->getMessage();
$mail->save();
continue;
有时,如果我测试只发送一封电子邮件,它会起作用并且不会返回错误消息。但是当我尝试发送大量带有循环的电子邮件时,它总是会收到一条错误消息“分段错误(核心转储)”。我正在使用 Ubuntu 服务器 14.04。
我不知道是什么导致了这个错误。是我的脚本导致了这个问题,是 Laravel 还是 Ubuntu Linux?
有什么办法可以解决这个问题吗?我应该先检查什么?
感谢您的帮助和回答。
【问题讨论】:
遇到同样的问题,谁能帮忙 【参考方案1】:狂野,但我最近一直在调试与排队作业相关的相同错误消息:
根据 Laravel 5.6 文档 (https://laravel.com/docs/5.6/queues#creating-jobs):
"二进制数据,例如原始图像内容,应通过 base64_encode 函数在传递给排队的作业之前。除此以外, 作业被放置在 排队。”
只要我在构造函数中添加base64_encode($input)
和在handle() 函数中添加base64_decode($this->input)
,我的问题就解决了(几乎!)。
PS:由于我使用两个分布式应用程序进行输入和处理队列,因此我还必须在两个应用程序上运行 composer dump-autoload
和 php artisan cache:clear
,同时在更改代码后重新启动 supervisor
工作程序.
【讨论】:
感谢您的回答。我的电子邮件不包含任何二进制数据,例如图像或其他东西。但我仍然按照您的指示在发送前先对电子邮件进行编码。不幸的是,它仍然无法正常工作。 经过一番研究,我终于找到了SwiftMailer停止工作并显示错误分段错误的原因。这是因为电子邮件地址收件人无效或不存在,并且 SwiftMailer 错误异常没有捕获错误或超时。您知道如何正确处理 SwiftMailer 异常吗?我已经尝试了所有错误异常,但仍然无法正常工作。【参考方案2】:Mailable
可以在您的班级中添加implements ShouldQueue
。
然后您将参数传递给__construct
并将其保存在您的类中。
像这样:
public function __construct(Sale $sale)
$this->sale = $sale->withoutRelations();
...
但是如果您忘记了withoutRelations()
功能,系统将Serialize
您的对象链接在您UnSerialize
您的数据返回后将丢失。这会导致消息
Segmentation fault (core dumped)
简单的测试表明如果禁用队列进行测试,队列有问题。
为此,转到phpunit.xml
文件并更改
<env name="QUEUE_DRIVER" value="sync"/>
到
<env name="QUEUE_DRIVER" value="null"/>
【讨论】:
以上是关于分段错误(核心转储)Laravel SwiftMailer的主要内容,如果未能解决你的问题,请参考以下文章