PHP 7.4.33
chrome/linux-124.0.6367.91
Изменить/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.
Вывод при запуске команды узла из PHPopt/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
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
*/
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'
};
Подробнее здесь: https://stackoverflow.com/questions/785 ... er-process
Мобильная версия