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

PHP调用Puppeteer脚本:CLI正常但浏览器执行无截图问题排查

问题描述

我有如下PHP代码test1.php:

<?php
    $command = "node node1.mjs";
     //Execute the Node.js script
    $output = shell_exec($command);

    // Display the output
    echo "<pre>$output</pre>";
?>

以及Node.js脚本node1.mjs:

import puppeteer from 'puppeteer';
(async () => {

  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Set viewport width and height
  await page.setViewport({ width: 1280, height: 720 });

  const website_url = 'https://www.bannerbear.com/blog/how-to-convert-html-into-pdf-with-node-js-and-puppeteer/';
  await page.goto(website_url, { waitUntil: 'networkidle0' });

  // Capture screenshot
  await page.screenshot({
    path: '/tmp/screenshot_1.jpg',
  });
 console.log('Screenshot Taken');
  await browser.close();
})();

通过命令行执行php test1.php时,可成功在/tmp目录生成截图并输出“Screenshot Taken”;但通过浏览器访问该PHP文件时,仅输出“Screenshot Taken”,却未生成目标截图,且无任何报错日志,请问可能的问题原因是什么?

可能的问题原因
  • 权限与目录隔离限制:通过浏览器访问时,PHP由Web服务进程(如www-data、apache用户)运行,部分系统会为这类服务进程启用私有临时目录(比如systemd的PrivateTmp配置),此时脚本里指定的/tmp实际指向服务专属的临时目录,而非系统公共的/tmp,导致你在系统/tmp里找不到文件,但脚本的日志仍会正常输出。此外,若服务进程对目标目录无写入权限,也会导致截图无法生成。
  • 无头Chrome依赖缺失:Puppeteer依赖的无头Chrome需要特定系统库支持(如libnss3、libatk-bridge2.0-0、libxss1等)。命令行环境可能已安装这些依赖,但Web服务进程的运行环境可能缺少,导致Chrome启动失败无法截图。由于shell_exec仅捕获标准输出,启动失败的错误信息不会被返回,只有脚本里的console.log内容会被输出。
  • 错误输出未被捕获:当前PHP代码仅获取Node.js脚本的标准输出,而Puppeteer执行过程中的错误会输出到标准错误流(stderr),因此即使截图失败,你也看不到具体报错。可以修改命令为$command = "node node1.mjs 2>&1";,将标准错误重定向到标准输出,从而捕获到错误信息排查问题。

内容的提问来源于stack exchange,提问作者neelam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:57:49