PHP / Apache / Node / Puppeteer — ошибка: не удалось запустить процесс браузера

Node.js v20.11.1
PHP 7.4.33
хром/Линукс-124.0.6367.91

Edit/TLDR: после дополнительных исследований, когда я запускаю через командную строку, chrome помещает файлы в мой домашний каталог в .config/google-chrome-for-testing/ . Я предполагаю, что Chrome, должно быть, пытается найти этот каталог при запуске Apache. Сейчас разбираюсь в этом.

У меня есть файлы index.js и puppeteerrc.cjs в одном каталоге. Я пытаюсь создать PDF-файл страницы по заданному URL-адресу. puppeteerrc.cjs указывает каталог кэша. Содержимое обоих файлов ниже.

Эта команда работает, если я запускаю ее из этого каталога

node index.js 'https://www.stackoverflow.com' output.pdf

Однако в PHP это не так:

 $cmd = "cd '/path/to/script' && node 'index.js' 'https://www.stackoverflow.com' /path/to/output.pdf 2>&1";
 exec($cmd, $out, $error_code);

Я не уверен, в чем разница между командной строкой и Apache. Я набежал chrome_crashpad_handler --help, но не знаю, что делать с этой информацией.

Когда я устанавливаю конфигурацию executablePath в index.js, я получаю тот же результат, он запускается из строки cmd, а не из Apache:

  const browser = await puppeteer.launch({
                executablePath:'/opt/npm/.cache/puppeteer/chrome/linux-124.0.6367.91/chrome-linux64/chrome'
          });

Я также попробовал все следующие конфигурации, и они выдают ту же ошибку:

args: ['--no-sandbox', "--disabled-setupid-sandbox"],
ignoreDefaultArgs: ['--disable-extensions'] ,
userDataDir: "/path/to/a/dir",
headless:true

Обратите внимание, что раньше, когда он не мог найти исполняемый файл Chrome, я получал другую ошибку, теперь, когда я прошел эту ошибку, она все еще не работает. Итак, я знаю, что теперь он может найти исполняемый файл. Кроме того, я запустил is_executable() для файла Chrome, и PHP, работающий под управлением Apache, вернул true.

Я заметил, что в моем домашнем каталоге есть каталог «.config/google-chrome-for-testing/Crash Reports». Теперь я предполагаю, что, возможно, он ищет один из этих каталогов, когда его запускает Apache.

Вывод при запуске команды узла из PHP

opt/npm/lib/node_modules/puppeteer/node_modules/@puppeteer/browsers/lib/cjs/launch.js:310
                reject(new Error([
                       ^

Error: Failed to launch the browser process!
chrome_crashpad_handler: --database is required
Try 'chrome_crashpad_handler --help' for more information.


TROUBLESHOOTING: https://pptr.dev/troubleshooting

    at Interface.onClose (/opt/npm/lib/node_modules/puppeteer/node_modules/@puppeteer/browsers/lib/cjs/launch.js:310:24)
    at Interface.emit (node:events:530:35)
    at Interface.close (node:internal/readline/interface:527:10)
    at Socket.onend (node:internal/readline/interface:253:10)
    at Socket.emit (node:events:530:35)
    at endReadableNT (node:internal/streams/readable:1696:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Node.js v20.11.1

index.js

/**
 * Create a PDF file from a URL.  First  command line
 * argument (besidedes JS file) is URL, second one 
 * is output file.
 * Usage:   node  index.js <URL> <OUTPUT_FILE_NAME>
 */




const node_path = "/opt/npm/lib/node_modules";
module.paths.unshift(node_path);



const puppeteer = require('puppeteer');

(async () => {

  // Create a browser instance
  const browser = await puppeteer.launch();

  // Create a new page
  const page = await browser.newPage();

  // Website URL to export as pdf
  const website_url = process.argv[2];

  // output path
  const output_path = process.argv[3];

  // Open URL in current page
  await page.goto(website_url, { waitUntil: 'networkidle0' }); 

  //use the print CSS
  await page.emulateMediaType('print');

  // Downlaod the PDF
  const pdf = await page.pdf({
    path: output_path,
    margin: { top: '.39in', right: '.39in', bottom: '.39in', left: '.39in' },
    printBackground: true,
    format: 'Letter',
  });

  // Close the browser instance
  await browser.close();
})();

.puppeteerrc.cjs

/**
 * @type {import("puppeteer").Configuration}
 */
module.exports = {
  // Changes the cache location for Puppeteer.
  cacheDirectory: '/opt/npm/.cache/puppeteer'
};

Отвечает ли это на ваш вопрос? Ошибка: не удалось запустить процесс puppeteer браузера

ggorlen 01.06.2024 02:31

@ggorlen, к сожалению, ничего из этого не помогает.

developer981 01.06.2024 03:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
219
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Chrome для записи требуется каталог .config, который ожидается в домашнем каталоге пользователя. В каталоге .config он поместит каталог google-chrome-for-testing/. Итак, я создал каталог конфигурации, например «/my/web/app/dir/.config». Изменил его на 775. Изменил группу каталогов на группу, которую может писать Apache.

Затем я изменил переменную среды HOME перед запуском команды узла.

 $cmd = "HOME='/my/web/app/dir/' && export HOME && cd '/path/to/script' && node 'index.js' 'https://www.stackoverflow.com' /path/to/output.pdf 2>&1";
 exec($cmd, $out, $error_code);

Спасибо! Это был недостающий элемент, чтобы наконец заставить все это работать. Я запускаю его в контейнере Docker, и после установки Chromium мне пришлось запустить mkdir -p /var/www/.config && chown -R www-data:www-data /var/www/.config && chmod 775 /var/www/.config, чтобы подготовить каталоги.

Sebastiaan Luca 29.06.2024 16:24

@SebastiaanLuca Добро пожаловать. И документация, и сообщения об ошибках для Puppeteer могли бы быть намного лучше.

developer981 29.06.2024 19:50

Другие вопросы по теме