laravel - 邮件队列和 DOMPDF 作业在 homestead 上完美运行,但在我的生产服务器上运行不佳

标签 laravel laravel-5.1

最新 5.1 Laravel 5.1.27 最新dompdf 0.6.2

所以我有一封电子邮件,其中附加了生成的 PDF,该 PDF 已排队。

在 homestead 上进行了测试,使用 artisan:work 和 artisen:listen 手动进行测试,一切正常,我完美地收到了带有 PDF 附件的电子邮件。

仅在我的生产服务器中,具有相同的参数,至少对于我所看到的,不起作用!!

如果与 Mail::send 同步,一切都会正常工作

当更新到 Mail:queue 时,我的作业被卡住了,在生产中我有主管使用 artisan:listen --tries=10 并且它失败了,并移至 failed_jobs 表。

啊啊,如果没有 PDF 附件,mail::queue 就可以完美工作

所以我可以将其归结为 DOMPDF 抛出的异常,仅在生产中且仅在排队作业中!

exception 'ErrorException' with message 'Undefined index: SCRIPT_FILENAME' in /home/myapp_name/vendor/dompdf/dompdf/include/stylesheet.cls.php:147

所以 stylesheet.cls.php:147 上的这一行是

list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($_SERVER["SCRIPT_FILENAME"]);

所以一切都归结为 CLI(命令行界面),没有定义这个 $_SERVER["SCRIPT_FILENAME"]!!

沿着这条路走下去是有意义的,但为什么在 homestead 和 CLI 上处理作业时它都能完美地工作?

希望我说得有道理!! 队列代码

$data = [bla bla bla]; // this $data is for the blade render, and is different from the one used in the Closure, for the PDF, i know =)
    Mail::queue('emails.default', $data , function($message) use ($destinatarios, $user_spo_full_name, $spare_part_order, $spare_parts_order_list)
    {
        $message->to($destinatarios);
        $message->subject('Spare Part Order Confirmation - Your ref: ' . $spare_part_order->client_reference );

        $data =
            [
                'user_full_name' => $user_spo_full_name,
                'spare_part_order' => $spare_part_order,
                'spare_parts_order_list' => $spare_parts_order_list
            ];
        $pdf = PDF::loadView('spareparts.sparepartsorder.pdf.spare-part-order', compact('data'));
        $message->attachData($pdf->output(), 'SP_'.$spare_part_order->client_reference . '.pdf' );

    });

提前感谢您的帮助,祝大家新年快乐!!

最佳答案

明白了!!

在生产服务器上,有一个queue:listen进程与supervisor一起运行。

就是这样,当我们 ssh 进入服务器时,如果我们运行 php -i ,我们可以看到 $_SERVER 变量已加载,即使是空白。

当通过supervisor运行php命令时,没有$_SERVER变量。

因此,让 DOMPDF 在主管处理的队列中工作的解决方案是解决代码问题。如果你像我一样通过composer获得它,那么 fork 存储库并更改composer.json中的源代码将是一件痛苦的事情

然后,我们所要做的就是处理日志,直到满足所有环境变量为止

if (!issset($_SERVER["SCRIPT_FILENAME"])) $_SERVER["SCRIPT_FILENAME"] = "";

这将使它工作,就像通过 SSH 运行时一样,这就是它加载变量的方式,空!

希望这对任何人都有帮助!!

关于laravel - 邮件队列和 DOMPDF 作业在 homestead 上完美运行,但在我的生产服务器上运行不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34536344/

相关文章:

javascript - 在 livewire 中的 $set 魔术 Action 中传递 bool 值

php - 在使用 Laravel Backpacker 保存之前哈希密码

laravel-5 - Laravel 类 'Gate' 未找到

php - Laravel 5.1 - 使用 SQLite 的测试数据库在向下迁移时给出 'no such index' 错误()

php - 'where' 中的 Laravel 数字比较不起作用

php - Laravel 5,子域路由,带可选参数

php - Laravel 5 如何使用内存缓存

mysql - 在 Laravel 中插入或更新?

php - 如何仅查询之前(月和年)的日期? (拉拉维尔)

php - 确定 Laravel 5 中文件是否存在