从PHP

时间:2018-04-24 15:12:10

标签: php apache centos7 puppeteer

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

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

(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用户权限相关的东西?我跟着所有麻烦的导游,但我现在没有运气。

2 个答案:

答案 0 :(得分:6)

问题似乎来自puppeteer使用的默认铬的文件系统权限:

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

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

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

设置权限后,错误就消失了。

答案 1 :(得分:3)

我使用的是Chromium的捆绑版本,它与Puppeteer库一起提供(使用npm install puppeteer安装)。

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

使用另一个可执行文件执行Puppeteer:

const browser = await puppeteer.launch({
    args: ['--no-sandbox', '--disable-setuid-sandbox'],
    headless: true,
    executablePath: '/usr/bin/chromium-browser'
});

如果有其他解决方案而不是在系统上安装Chromium,我会寻找其他答案。