You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用Puppeteer Node脚本生成PDF时启动Chrome失败报错

解决PHP exec调用Puppeteer脚本时Chrome启动失败的问题

我之前踩过一模一样的坑,这个icu_util.cc的无效文件描述符错误,大多是因为Puppeteer在PHP exec的非交互式环境里启动Chrome时,权限不足或者缺少必要的启动配置导致的。下面是几个亲测有效的解决办法:

1. 启用Chrome无沙箱模式

PHP的运行用户(比如www-data)通常没有权限启动带沙箱的Chrome,所以在你的Node脚本里,启动浏览器时一定要加上--no-sandbox和--disable-setuid-sandbox参数:

const puppeteer = require('puppeteer');

async function generatePDF() {
  try {
    const browser = await puppeteer.launch({
      args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
    const page = await browser.newPage();
    // 加载你的HTML内容或者页面地址
    await page.setContent('<h1>测试PDF内容</h1>');
    await page.pdf({ path: 'output.pdf', format: 'A4' });
    
    await browser.close();
  } catch (err) {
    console.error('生成PDF失败:', err);
    process.exit(1);
  }
}

generatePDF();

⚠️ 注意:如果你的脚本需要处理不可信的外部HTML内容,禁用沙箱会有安全风险,但如果是PHP生成的可控HTML,这个问题不大。

2. 手动指定Chrome可执行路径

有时候Puppeteer自带的Chrome可能路径不对,或者系统安装的Chrome更稳定,可以手动指定executablePath:

const browser = await puppeteer.launch({
  executablePath: '/usr/bin/google-chrome', // 替换成你服务器上Chrome的实际路径
  args: ['--no-sandbox', '--disable-setuid-sandbox']
});

你可以在服务器上执行which google-chrome或者which chromium-browser来获取正确的路径。

3. 检查PHP运行用户的权限

确保PHP的运行用户(比如www-data)拥有以下权限:

  • 执行Node脚本的权限:chmod +x your-pdf-script.js
  • 访问Chrome可执行文件的权限:确保/usr/bin/google-chrome这类路径对www-data可读可执行
  • 读写临时目录的权限:Chrome需要在/tmp目录生成临时文件,所以要保证/tmp的权限允许www-data访问(通常默认是允许的,但如果改过权限需要检查)

4. 处理Promise的Rejection

错误里提到了UnhandledPromiseRejectionWarning,说明你的Node脚本没有捕获Promise的异常,导致错误信息不完整。一定要给所有异步操作加上try/catch或者.catch(),这样能打印出更详细的错误日志,方便排查问题。

5. 安装Chrome依赖库

如果你的服务器是最小化安装的,可能缺少Chrome运行必需的系统依赖。以Ubuntu为例,执行以下命令安装依赖:

sudo apt-get install -y libx11-xcb1 libxcomposite1 libxcursor1 libxdamage1 libxi6 libxtst6 libnss3 libcups2 libxss1 libxrandr2 libgconf-2-4 libasound2 libatk1.0-0 libgtk-3-0

如果是CentOS/RHEL系统,对应的命令是:

sudo yum install -y libX11 libXcomposite libXcursor libXdamage libXext libXi libXtst libXrandr libXScrnSaver libXfixes cups-libs nss alsa-lib atk gtk3

内容的提问来源于stack exchange,提问作者Iván Pérez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:30:01