【问题标题】:Error executing Puppeteer from PHP从 PHP 执行 Puppeteer 时出错
【发布时间】:2018-04-24 15:12:09
【问题描述】:

我有一个将网页转换为 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用户权限相关的东西?我已按照所有故障排除指南进行操作,但目前运气不佳。

【问题讨论】:

  • 那么这是 puppet 还是 node 的问题?好像是节点。
  • @Anthony 显然这是 puppeteer 的问题。如果我删除所有与 Puppeteer 相关的代码并执行一些控制台日志等操作,节点运行良好。
  • 这是在哪里运行的?我怀疑 Chrome 缺少包或依赖项(除非它在本地运行)
  • @griffith_joel Chromium 与节点中的“puppeteer”包一起安装。我还安装了文档中的所有依赖项。无论如何,我终于设法让它工作了。我要发布一个答案。

标签: php apache centos7 puppeteer


【解决方案1】:

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

使用 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/

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

【讨论】:

    【解决方案2】:

    我使用的是 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,我会寻找其他答案。

    编辑:

    现在 NPM 上有一个 puppeteer-core 包,它不捆绑 Chromium。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多