Laravel Sail 安装 puppeteer chromium

Laravel Sail install puppeteer chromium

我已经设置了一个 Laravel Sail 环境,我正在尝试使用 puppeteer 将网页保存为 pdf。

我目前正在使用这个包来 运行 通过 laravel 操纵木偶 - https://packagist.org/packages/spatie/browsershot

要求部分指定您需要通过 npm 下载 puppeteer。

Laravel Sail 有 npm 设置,所以我安装了 puppeteer 包,但是当我尝试将网页保存为屏幕截图时,出现以下错误

The command "PATH=$PATH:/usr/local/bin NODE_PATH=`npm root -g` node '/var/www/html/vendor/spatie/browsershot/src/../bin/browser.js' '{"url":"https:\/\/google.com","action":"screenshot","options":{"type":"png","path":"\/var\/www\/html\/storage\/app\/public\/screenshot.png","args":[],"viewport":{"width":800,"height":600}}}'" failed. Exit Code: 1(General error) Working directory: /var/www/html/public Output: ================ Error Output: ================ Error: Could not find expected browser (chrome) locally. Run `npm install` to download the correct Chromium revision (856583). at ChromeLauncher.launch (/var/www/html/node_modules/puppeteer/lib/cjs/puppeteer/node/Launcher.js:80:27) at async callChrome (/var/www/html/vendor/spatie/browsershot/bin/browser.js:69:23)

它基本上是说它找不到我的本地版本的铬,我不确定如何解决这个问题,如果不是 运行ning 通过 docker 我可以安装它在本地并指向它,但我认为这不是使用 docker.

时的最佳解决方案

您需要在 docker 容器中安装带有 chromium 的 puppeteer。 我目前为 Browsershot 和 Sail 设置了完全相同的设置。 您需要 publish the sail config 个文件,以便您可以编辑 docker 容器。

sail artisan sail:publish

然后您可以在 Laravel 项目的根目录下 docker/8.0docker/7.4 下找到 docker 文件,具体取决于您的 PHP 版本。

编辑docker文件并添加puppeteer with chromium的安装命令:

RUN apt-get update \
    && apt-get install -y gconf-service libasound2 libappindicator3-1 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget libgbm-dev libatk-bridge2.0-0 \
    && npm install --global --unsafe-perm puppeteer \
    && chmod -R o+rx /usr/lib/node_modules/puppeteer/.local-chromium

然后重建docker文件:

sail build --no-cache

因为 puppeteer 在 docker 中 运行 我们需要禁用沙箱。请记住,docker 在您的主机上生成 PDF 的速度会慢很多,因此最好也稍微提高默认超时。

use Spatie\Browsershot\Browsershot;


Browsershot::html($html)
    ->noSandbox()
    ->timeout(360)
    ->save('your.pdf');