laravel - 在 Laravel Vapor Docker 运行时中运行 Puppeteer 和 Browsershot 的问题

标签 laravel puppeteer alpine-linux laravel-vapor browsershot

我尝试在 Laravel Vapor Docker Runtime 中运行 Puppeteer 和 Spatie/Browsershot 但出现以下错误

type: 'error',
message: 'socket hang up',
error: Error: socket hang up at connResetException (internal/errors.js:639:14) 
at Socket.socketOnEnd (_http_client.js:499:23) 
at Socket.emit (events.js:412:35) 
at endReadableNT (internal/streams/readable.js:1334:12) 
at processTicksAndRejections (internal/process/task_queues.js:82:21) 
{ code: 'ECONNRESET' }

这是我的 Dockerfile

FROM laravelphp/vapor:php80

# Installs latest Chromium (93) package.
RUN apk add --no-cache \
      chromium \
      nss \
      freetype \
      harfbuzz \
      ca-certificates \
      ttf-freefont \
      nodejs \
      npm

# Tell Puppeteer to skip installing Chrome. We'll be using the installed package.
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
    PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser

# Puppeteer v10.2.0 works with Chromium 93.
RUN npm i -g puppeteer@10.2.0

COPY . /var/task

这是我的 Browsershot 代码

Browsershot::url('https://www.test-url.com')
            ->setNodeBinary(env('NODE_BINARY') ?? '/usr/bin/node')
            ->setNpmBinary(env('NPM_BINARY') ?? '/usr/bin/npm')
            ->addChromiumArguments(['no-sandbox', 'disable-setuid-sandbox', 'disable-dev-shm-usage'])
            ->dismissDialogs()
            ->setExtraHttpHeaders(['cookie' => request()->header('cookie')])
            ->format('A4')
            ->margins('32', '32', '32', '32', 'px')
            ->waitUntilNetworkIdle()
            ->pdf();

如有任何帮助,我们将不胜感激!

最佳答案

我今天将基于层的 lambda 转换为基于 docker 的版本并遇到了同样的问题。

因为我之前使用过 chrome-aws-lambda,所以我研究了他们使用的启动参数。我不知道是哪一个成功了,但这是我添加到 browsershot 的列表:

// See https://github.com/alixaxel/chrome-aws-lambda/blob/master/source/index.ts#L94
$browsershot->addChromiumArguments([
    'allow-running-insecure-content', // https://source.chromium.org/search?q=lang:cpp+symbol:kAllowRunningInsecureContent&ss=chromium
    'autoplay-policy' => 'user-gesture-required', // https://source.chromium.org/search?q=lang:cpp+symbol:kAutoplayPolicy&ss=chromium
    'disable-component-update', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisableComponentUpdate&ss=chromium
    'disable-domain-reliability', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisableDomainReliability&ss=chromium
    'disable-features' => 'AudioServiceOutOfProcess,IsolateOrigins,site-per-process', // https://source.chromium.org/search?q=file:content_features.cc&ss=chromium
    'disable-print-preview', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisablePrintPreview&ss=chromium
    'disable-setuid-sandbox', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisableSetuidSandbox&ss=chromium
    'disable-site-isolation-trials', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisableSiteIsolation&ss=chromium
    'disable-speech-api', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisableSpeechAPI&ss=chromium
    'disable-web-security', // https://source.chromium.org/search?q=lang:cpp+symbol:kDisableWebSecurity&ss=chromium
    'disk-cache-size' => 33554432, // https://source.chromium.org/search?q=lang:cpp+symbol:kDiskCacheSize&ss=chromium
    'enable-features' => 'SharedArrayBuffer', // https://source.chromium.org/search?q=file:content_features.cc&ss=chromium
    'hide-scrollbars', // https://source.chromium.org/search?q=lang:cpp+symbol:kHideScrollbars&ss=chromium
    'ignore-gpu-blocklist', // https://source.chromium.org/search?q=lang:cpp+symbol:kIgnoreGpuBlocklist&ss=chromium
    'in-process-gpu', // https://source.chromium.org/search?q=lang:cpp+symbol:kInProcessGPU&ss=chromium
    'mute-audio', // https://source.chromium.org/search?q=lang:cpp+symbol:kMuteAudio&ss=chromium
    'no-default-browser-check', // https://source.chromium.org/search?q=lang:cpp+symbol:kNoDefaultBrowserCheck&ss=chromium
    'no-pings', // https://source.chromium.org/search?q=lang:cpp+symbol:kNoPings&ss=chromium
    'no-sandbox', // https://source.chromium.org/search?q=lang:cpp+symbol:kNoSandbox&ss=chromium
    'no-zygote', // https://source.chromium.org/search?q=lang:cpp+symbol:kNoZygote&ss=chromium
    'use-gl' => 'swiftshader', // https://source.chromium.org/search?q=lang:cpp+symbol:kUseGl&ss=chromium
    'window-size' => '1920,1080', // https://source.chromium.org/search?q=lang:cpp+symbol:kWindowSize&ss=chromium
    'single-process', // https://source.chromium.org/search?q=lang:cpp+symbol:kSingleProcess&ss=chromium
]);

关于laravel - 在 Laravel Vapor Docker 运行时中运行 Puppeteer 和 Browsershot 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69628759/

相关文章:

php - ReflectionException 类 UserController 不存在 Laravel5.4

laravel - ReflectionException-中间件类不存在Laravel 5.2

javascript - Puppeteer - 如何获取当前页面(应用程序/pdf)作为缓冲区或文件?

javascript - waitFor() 找不到页面上显示的元素

docker - 如何在 Docker 容器内启用 wiringpi GPIO 控制

python - Selenium 在 alpine 3.6 容器上运行

Laravel 迁移和播种错误

mysql - Laravel 搜索结果分组

url - page.click 不是函数

c++ - valgrind 不会显示堆栈跟踪