如何通过PHP+Bash运行Google Lighthouse并解决Chrome连接报错
方案可行性结论
PHP结合Bash调用Google Lighthouse是完全可落地的方案,你遇到的ECONNREFUSED连接Chrome失败问题,核心原因是Web服务运行环境和你手动SSH登录的Shell环境存在权限、路径、运行上下文的差异,不是方案本身不可行。
报错根因
你通过Putty手动执行脚本时,使用的是登录态的高权限用户,拥有完整的环境变量配置、Chrome沙箱运行权限、正确的工作目录,Chrome可以正常启动;而通过PHP的shell_exec调用时,执行命令的是Web服务的低权限运行用户(通常为www-data/nginx/apache),既没有登录Shell的环境变量初始化,也没有足够权限启动Chrome默认沙箱,还存在相对路径找不到文件的问题,最终导致Chrome启动失败、调试端口未监听,Lighthouse自然会报连接拒绝错误。
分步修复方案
- 第一步:修正Lighthouse启动参数,适配低权限运行环境
编辑rex.sh,给Chrome添加低权限环境必需的启动参数,解决沙箱权限不足、共享内存不足的问题,脚本里所有路径都要写绝对路径,不要用./开头的相对路径——Web执行Shell时的工作目录不是你存放脚本的目录,相对路径会直接找不到文件。修改后的参考脚本如下:#!/bin/bash SITE=$1 VALUE=$(echo "$SITE" | awk -F'//' '{print $2}') # 注意替换为你自己的lighthouse、Chrome的绝对路径,可通过SSH执行`which lighthouse`、`which google-chrome`获取 /usr/local/bin/lighthouse "$SITE" \ --chrome-path=/usr/bin/google-chrome \ --chrome-flags="--no-sandbox --headless --disable-gpu --disable-dev-shm-usage" \ --output html \ --output-path "/your/site/absolute/path/path/$VALUE.html" - 第二步:修复PHP脚本的命令重定向逻辑、补全权限
你当前PHP里的重定向顺序写反了,会导致错误信息无法写入日志,把命令拼接部分修改为:
然后给脚本和目录配置Web用户的读写执行权限:<?php if(isset($_GET['subject2'])) { $text = $_GET['subject2']; $text = escapeshellarg($text); // 写脚本绝对路径,先传参数,再重定向输出:标准输出追加到日志,标准错误绑定到标准输出 $command = '/absolute/path/to/rex.sh ' . $text . ' >> /absolute/path/to/path/mylog 2>&1'; $output = shell_exec($command); echo "<pre>$output</pre>"; } ?>chmod +x /absolute/path/to/rex.sh # 下面的www-data替换为你服务器实际的Web运行用户,输出目录、日志文件都要给该用户权限 chown -R www-data:www-data /absolute/path/to/path/ - 第三步:加基础校验和安全防护
- 在bash脚本开头加URL格式校验,只允许http/https开头的合法URL传入,降低注入风险
- 调用Lighthouse的接口必须加访问鉴权,不要直接暴露在公网,避免被恶意调用打满服务器CPU资源
验证方法
改完之后先手动切换到Web用户测试脚本能不能正常跑,比如执行sudo -u www-data /absolute/path/to/rex.sh https://example.com,如果这条命令能正常生成报告,再通过Web访问调用就不会有问题了。
内容的提问来源于stack exchange,提问作者rezshar
相关产品推荐
相关产品推荐

