首页 > 解决方案 > 使用 JOB 和 Supervisor 时生成的附加到电子邮件的 PDF 失败。

问题描述

大家好,

我的场景:我有一份工作,它发送一封电子邮件并附上一个 pdf。pdf 在作业句柄()中生成并附在电子邮件中。为了让用户体验更友好,我使用队列作业来发送电子邮件。因此,除了我生成 PDF:loadView 时,所有其他电子邮件都可以正常工作。此外,PDF 在 localhost (WAMP) 上工作得很好但是,它会引发上述异常并位于数据库的 failed_jobs 表中。

我的工作示例 Class::EmailTestPdf

class EmailTestPdf implements ShouldQueue
{ 
    protected $data;
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

public function __construct(array $data)
{
    $this->data = $data;
}

public function handle()
{
    $d=$this->data;
    $d['doc'] = PDF::loadView('email.test',compact('data','survey')); 
    Mail::send('email.testpdf', $d, function ($message) use ($d)
    {
        $message->from(abc@gmail.com, 'Tester');
        $message->subject('Subject Title');
        $message->to('me@gmail.com');
        $message->attachData($d['doc']->output(), 'test.pdf', ['mime' => 'application/pdf']);
    });
}
}

在我使用的控制器方法上:

 EmailTestPdf::dispatch($data)->delay(now()->addSeconds(5));

以上在本地主机上工作正常。但是,它在实时服务器上不起作用。此外,在 centOS 服务器上,我实现了如下管理程序:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/coreso5/ptesting/artisan queue:work database --sleep=3 --
tries=3
autostart=true
autorestart=true
user=root
numprocs=8
redirect_stderr=true
stdout_logfile=/home/coreso5/ptesting/storage/logs/worker.log

在运行发送 pdf 的测试后,它会抛出我在 failed_jobs 表中发现的错误

ErrorException:未定义的索引:/ptesting/vendor/dompdf/dompdf/src/Css/Stylesheet.php:175 中的 SCRIPT_FILENAME

…………………………………………………………………………

Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Undefined index...', '/ptesting/v...', 175, Array)

标签: phplaraveldompdf

解决方案


如果您的工作只是发送一封电子邮件,并且您不打算在其他地方使用它,您不需要创建专门的工作,laravel 可以将您的电子邮件排队。

排队邮件

Mail::to(abc@gmail.com)
  ->queue(new EmailTestPdf($data));

关于您的错误,创建pdf时似乎正在发生问题。你确定它在这份工作之外有效吗?当你这样做时会发生什么;

$d['doc']->output();

推荐阅读