PHP调用Python脚本正常,引入Playwright模块后失效求解决
解决PHP调用带Playwright的Python脚本无输出问题
核心原因是PHP运行的系统用户(通常为www-data、apache或nginx)与你命令行登录用户的环境变量、权限、Playwright浏览器安装路径不一致,导致脚本无法正常执行但无错误反馈。以下是具体解决步骤:
1. 捕获错误输出,定位具体问题
默认shell_exec仅捕获标准输出(stdout),脚本执行的错误信息会输出到标准错误(stderr),先修改PHP命令,将stderr重定向到stdout,以便看到具体报错:
<?php $command = escapeshellcmd('python3 test.py 2>&1'); $output = shell_exec($command); echo $output; ?>
执行后就能看到脚本执行失败的具体原因,比如找不到浏览器、权限不足等。
2. 使用Python绝对路径
命令行的python3可能和PHP调用的不是同一个环境,先在命令行执行which python3获取绝对路径(比如/usr/bin/python3),替换到PHP代码中:
$command = escapeshellcmd('/usr/bin/python3 test.py 2>&1');
3. 为PHP运行用户安装Playwright浏览器
你在命令行安装的Playwright浏览器仅对当前登录用户可见,PHP运行用户无法访问。执行以下命令,为PHP用户(以www-data为例)安装浏览器:
sudo -u www-data /usr/bin/python3 -m playwright install chromium
如果不知道PHP运行用户,可在PHP脚本中添加echo exec('whoami');查看。
4. 调整Playwright启动参数
服务器环境通常没有图形化沙箱,需在Python脚本中添加--no-sandbox参数,必要时可指定浏览器绝对路径:
from playwright.sync_api import Playwright, sync_playwright, expect def run(playwright: Playwright) -> None: browser = playwright.chromium.launch( headless=True, args=["--no-sandbox"], # executable_path="/usr/bin/chromium-browser" # 可根据实际路径添加 ) context = browser.new_context() page = context.new_page() page.goto("https://inzamelhelden.nl/beheer/rapportageplus.php") context.close() # 建议先关闭context再关闭browser browser.close() with sync_playwright() as playwright: run(playwright)
5. 检查文件与目录权限
确保test.py所在目录及文件本身对PHP运行用户有读取、执行权限:
chown www-data:www-data /path/to/your/test.py chmod 755 /path/to/your/test.py
内容的提问来源于stack exchange,提问作者kucb
相关产品推荐
相关产品推荐

