分段错误(核心已转储)Laravel SwiftMailer

时间:2018-07-16 16:04:11

标签: php laravel ubuntu swiftmailer

使用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 Server 14.04。

我不知道是什么导致此错误。是我的脚本导致了此问题,是Laravel还是Ubuntu Linux?

有什么办法解决这个问题?我应该先检查什么?

感谢您的帮助和答复。

1 个答案:

答案 0 :(得分:0)

野外射击,但最近我一直在调试与排队作业有关的相同错误消息:

根据Laravel 5.6文档(https://laravel.com/docs/5.6/queues#creating-jobs):

  

“二进制数据(例如原始图像内容)应通过   base64_encode函数,然后传递给已排队的作业。除此以外,   作业放置在上时,可能无法正确序列化为JSON   队列。”

在构造函数中添加base64_encode($input)并在handle()函数中添加base64_decode($this->input)时,我的问题就解决了(几乎!)。

PS:由于我使用两个分布式应用程序进行输入并在队列上工作,因此我还必须在两个应用程序上分别运行composer dump-autoloadphp artisan cache:clear,同时还要重新启动supervisor worker ,在更改代码后。