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
相关产品推荐
相关产品推荐

