0

使用Laravel-Sail,这基本上是一种docker-compose.yml在本地生成 Web 服务器、MariaDB 等的便捷方法,但在使用Browsershots时会造成麻烦,这是一个提供Puppeteer的 Laravel 包。

在我开始之前

首先:Puppeteer 本身正在工作,因为我扩展了 docker 文件并重建了图像。

问题是什么?

我的 pdf 生成方法的这一部分将永远运行,并因超时而失败。

$view      = view('pdf.user', compact('user'));
$body_html = $view->render();

return response()->streamDownload(function () use (
    $body_html
) {
    echo Browsershot::html($body_html)->format('A4')
        ->margins(0, 0, 0, 0)->showBackground()
        ->addChromiumArguments([
            'font-render-hinting' => 'none',
        ])->noSandbox()->waitUntilNetworkIdle()->pdf();
});

事实证明,刀片模板中的这条线导致了问题:

<img src="{{asset('images/logo.png')}}" class="h-24 w-24">

在容器中使用修补程序,我发现assets()助手返回

asset('images/logo.png')
> http://myapp.test/images/logo.png

这很好。

如果我使用来自另一个 URL(未 dockerized)的随机图像,例如https://www.google.de/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png,视图正在被加载并渲染得很好。

所以我的问题是:这可能是什么问题,我该如何解决?

4

1 回答 1

2

我对此还没有答案,但我认为在尝试使用 wkhtmltopdf 生成 PDF 文件时,我在 Laravel Sail 中遇到了一个非常相似的问题。

从库存帆配置中,它确实返回了一个 PDF,除了;不幸的是,任何外部链接的图像都是空的,因为无法使用sai 容器中的站点本地名称(tts.test)解析。

如果我将指向 127.0.0.1 的 tts.test 引用添加到容器的 /etc/hosts 文件中,那么这些资产现在在技术上是可解析的,但进程会挂起,直到超时。

非常奇怪的是,从一个ps -ef | grep wkhtmltopdf命令中,我可以看到挂起的命令,包括它正在处理的临时 HTML 文件的位置,如果我以交互方式运行相同的命令,sail shell它会完美地生成 PDF 输出!!如果我发现它为什么挂起,我会在这里发布更新。

于 2021-07-11T21:54:09.127 回答