Laravel Sail 安装 puppeteer 铬

问题描述

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

我目前正在使用这个包通过 laravel 运行 puppeteer - 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)

它基本上是说它找不到我的本地版本的 Chromium,我不知道如何解决这个问题,如果它不是通过 docker 运行的,我可以在本地安装它并指向它,但我不认为这是使用 docker 时的最佳解决方案。

解决方法

您需要在 docker 容器内安装带有 Chromium 的 puppeteer。 我目前对带有 Sail 的 Browsershot 进行了完全相同的设置。 您需要 publish the sail config 个文件来编辑 docker 容器。

sail artisan sail:publish

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

编辑docker文件,添加puppeteer withchromium的安装命令:

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

然后重建dockerfile:

sail build --no-cache

因为 puppeteer 在 docker 中运行,所以我们需要禁用沙箱。请记住,与在主机上相比,docker 生成 PDF 的速度要慢得多,因此将默认超时时间调高一点可能是明智之举。

use Spatie\Browsershot\Browsershot;


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