从PHP执行Puppeter时出错

从PHP执行Puppeter时出错,php,apache,centos7,puppeteer,Php,Apache,Centos7,Puppeteer,我有一个节点脚本,可以将网页转换为PDF文档。用户输入一些内容,PHP构建一个HTML页面,然后在节点脚本中使用该页面(运行Puppeter,使用稍微修改的版本)将其转换为PDF 但是,当我在PHP中输入运行节点脚本的命令时,该命令失败,出现以下错误: (node:14832) UnhandledPromiseRejectionWarning: Error: Failed to launch chrome! [0424/165455.239499:ERROR:icu_util.cc(133)]

我有一个节点脚本,可以将网页转换为PDF文档。用户输入一些内容,PHP构建一个HTML页面,然后在节点脚本中使用该页面(运行Puppeter,使用稍微修改的版本)将其转换为PDF

但是,当我在PHP中输入运行节点脚本的命令时,该命令失败,出现以下错误:

(node:14832) UnhandledPromiseRejectionWarning: Error: Failed to launch chrome!
[0424/165455.239499:ERROR:icu_util.cc(133)] Invalid file descriptor to ICU data received.
[0424/165455.239717:FATAL:content_main_delegate.cc(53)] Check failed: false.
#0 0x55f27f255b0c base::debug::StackTrace::StackTrace()
#1 0x55f27f26e780 logging::LogMessage::~LogMessage()
#2 0x55f27d5f7d23 content::ContentMainDelegate::TerminateForFatalInitializationError()
#3 0x55f27ef90deb content::ContentMainRunnerImpl::Initialize()
#4 0x55f27ef9ab72 service_manager::Main()
#5 0x55f27ef8ff14 content::ContentMain()
#6 0x55f28309f9b9 headless::(anonymous namespace)::RunContentMain()
#7 0x55f28309fa42 headless::HeadlessBrowserMain()
#8 0x55f27ef97f9d headless::HeadlessShellMain()
#9 0x55f27d5f61ac ChromeMain
#10 0x7efcaad45c05 __libc_start_main
#11 0x55f27d5f602a _start
PHP正在使用
apache
用户运行。但是,如果我对我的用户运行相同的脚本,它就可以完美地工作。当我在终端中使用
su-apache-c“node…”执行时,
再次抛出上述错误


是什么导致了错误?与apache用户权限相关的内容?我遵循了所有的疑难解答指南,但目前运气不佳。

我使用的是随Puppeter库一起提供的Chromium捆绑版(使用
npm install Puppeter
安装)

我没有使用该版本,而是尝试在系统范围内安装Chromium,并为节点脚本提供系统范围内安装Chromium的路径。它终于起作用了,这个版本没有那个奇怪的问题

要使用另一个可执行文件执行Puppeter:

const browser = await puppeteer.launch({
    args: ['--no-sandbox', '--disable-setuid-sandbox'],
    headless: true,
    executablePath: '/usr/bin/chromium-browser'
});
如果有其他解决方案而不是在系统上安装Chromium,我将寻找其他答案

编辑:


现在NPM上有一个不捆绑Chromium的
Puppeter core
包。

我使用的是捆绑版Chromium,它与Puppeter库一起提供(使用
NPM install Puppeter
安装)

我没有使用该版本,而是尝试在系统范围内安装Chromium,并为节点脚本提供系统范围内安装Chromium的路径。它终于起作用了,这个版本没有那个奇怪的问题

要使用另一个可执行文件执行Puppeter:

const browser = await puppeteer.launch({
    args: ['--no-sandbox', '--disable-setuid-sandbox'],
    headless: true,
    executablePath: '/usr/bin/chromium-browser'
});
如果有其他解决方案而不是在系统上安装Chromium,我将寻找其他答案

编辑:


现在NPM上有一个不捆绑Chromium的
Puppeter core
包。

问题似乎来自Puppeter使用的默认Chromium上的文件系统权限:

使用ACL(我的nginx组是
www-data
,与您的组一起更改为apache):

sudo setfacl-R-m g:www-data:rX node_modules/puppeter/.local chromium/

sudo setfacl-dR-m g:www-data:rX node_modules/puppeter/.local chromium/


设置权限后,错误消失。

问题似乎来自Puppeter使用的默认chromium上的文件系统权限:

使用ACL(我的nginx组是
www-data
,与您的组一起更改为apache):

sudo setfacl-R-m g:www-data:rX node_modules/puppeter/.local chromium/

sudo setfacl-dR-m g:www-data:rX node_modules/puppeter/.local chromium/


设置权限后,错误消失。

这是puppet或node的问题吗?看起来像是个问题,很明显这是木偶演员的问题。若我删除了所有与Puppeter相关的代码,并做了一些控制台日志之类的事情,那个么节点运行得很好。这个运行在哪里?我的怀疑是Chrome缺少一个包或依赖项(除非它在本地运行)@griffith_joel Chrome与节点中的“Puppeter”包一起安装。我还安装了文档中的所有依赖项。不管怎样,我终于设法让它工作了。我将发布一个答案。这是木偶还是节点的问题?看起来像是个问题,很明显这是木偶演员的问题。若我删除了所有与Puppeter相关的代码,并做了一些控制台日志之类的事情,那个么节点运行得很好。这个运行在哪里?我的怀疑是Chrome缺少一个包或依赖项(除非它在本地运行)@griffith_joel Chrome与节点中的“Puppeter”包一起安装。我还安装了文档中的所有依赖项。不管怎样,我终于设法让它工作了。我将发布一个答案。