PHP调用highcharts-export-server无法生成SVG文件问题排查
问题排查方案
1. 理解返回值retval=1的意义
retval=1代表命令执行异常退出,大概率是PHP的exec执行环境与你直接在命令行操作的环境不一致,比如环境变量缺失、依赖无法加载或执行上下文受限。
2. 指定完整Node解释器路径
PHP的exec环境可能没有全局Node环境变量,直接调用cli.js可能找不到Node解释器,修改命令为指定完整Node路径:
$cmd = '/var/www/mysite/node/bin/node /var/www/mysite/node/node_modules/lib/node_modules/highcharts-export-server/bin/cli.js --infile /tmp/node_files/nso_2024-07-10__12.50.00_77003733f89002aca7337718298f07df.json --outfile /tmp/node_files/nso_2024-07-10__12.50.00_77003733f89002aca7337718298f07df.svg'; exec($cmd, $out, $retval);
(你可以在命令行执行which node获取实际的Node可执行文件路径)
3. 捕获标准错误输出
exec默认只捕获标准输出,命令执行的错误信息会流向标准错误,将错误重定向到输出以便查看:
$cmd = '/var/www/mysite/node/node_modules/lib/node_modules/highcharts-export-server/bin/cli.js --infile /tmp/node_files/nso_2024-07-10__12.50.00_77003733f89002aca7337718298f07df.json --outfile /tmp/node_files/nso_2024-07-10__12.50.00_77003733f89002aca7337718298f07df.svg 2>&1'; exec($cmd, $out, $retval); var_dump($out); // 打印完整输出,包含错误信息
4. 确认目标目录权限
除了node文件夹,需确保/tmp/node_files目录对www-data用户有读写权限:
chown -R www-data:www-data /tmp/node_files chmod -R 755 /tmp/node_files
5. 模拟www-data用户执行命令
直接切换到www-data用户执行命令,复现PHP的执行上下文,排查是否是用户权限或环境问题:
sudo -u www-data bash -c "/var/www/mysite/node/node_modules/lib/node_modules/highcharts-export-server/bin/cli.js --infile /tmp/node_files/nso_2024-07-10__12.50.00_77003733f89002aca7337718298f07df.json --outfile /tmp/node_files/nso_2024-07-10__12.50.00_77003733f89002aca7337718298f07df.svg"
如果此命令失败,会直接显示错误原因;如果成功,说明PHP存在安全限制。
6. 检查PHP安全配置
- 查看
php.ini中的disable_functions项,确保exec未被禁用 - 检查
open_basedir设置,确认Node路径和/tmp/node_files在允许的目录范围内 - 若服务器开启SELinux,执行
getsebool httpd_execmem,若结果为off,执行setsebool -P httpd_execmem on,随后重启Nginx和PHP-FPM
内容的提问来源于stack exchange,提问作者raphael75
相关产品推荐
相关产品推荐

