分段错误(核心转储)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-autoloadphp 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的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:核心转储

分段故障核心转储错误

识别导致分段错误(核心转储)的错误

beautifulsoup 4:分段错误(核心转储)

获取“分段错误核心转储”

为啥我在 C 中收到警告“分段错误,核心转储”