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'
};
@ggorlen, к сожалению, ничего из этого не помогает.






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, чтобы подготовить каталоги.
@SebastiaanLuca Добро пожаловать. И документация, и сообщения об ошибках для Puppeteer могли бы быть намного лучше.
Отвечает ли это на ваш вопрос? Ошибка: не удалось запустить процесс puppeteer браузера