PHP调用shell_exec执行Blender脚本异常,SSH运行正常求解答
问题排查与解决方案
这种情况我碰到过好几次,大概率是权限、环境变量或者错误捕获的问题,咱们一步步来排查:
1. 权限不匹配是最常见的原因
PHP脚本是跑在web服务器的用户身份下的(比如www-data、apache这类),而你用SSH执行时是自己的用户账号(可能是root或者有更高权限的普通用户),两者的权限范围完全不一样:
- 先确认web用户能不能执行Blender:在SSH里跑
sudo -u www-data blender -v,如果报错说“command not found”或者权限不足,那就是Blender的执行权限没开给web用户。 - 再检查你的blend文件、临时目录和addon脚本的权限:执行
chown -R www-data:www-data /var/www/renderer/tmp/abcd/,确保web用户能读写这些文件和目录,目录权限至少设成755,文件设成644。
2. 环境变量差异导致Blender无法正常加载
SSH登录后会加载完整的环境变量(比如PATH、依赖库路径),但web服务器的进程环境变量非常精简,可能找不到Blender的依赖库或者相关组件,导致启动后直接退出:
- 先在SSH里执行
which blender拿到Blender的绝对路径(比如/usr/bin/blender),然后把PHP命令里的blender替换成这个绝对路径,避免web环境找不到命令。 - 可以尝试在执行命令前手动设置依赖库路径,比如:
$exe = "export LD_LIBRARY_PATH=/usr/lib/blender && /usr/bin/blender -b /var/www/renderer/tmp/abcd/abcd.blend -P /var/www/renderer/addon_execute.py -- -sx 300 -sy 600 -s 0.5 -sa 10"; $res = shell_exec($exe); - 还可以在PHP里打印环境变量对比:
echo shell_exec('env');,把这个输出和SSH里执行env的结果对比,看看缺了哪些关键变量。
3. 你没捕获到Blender的错误输出
shell_exec默认只捕获标准输出(stdout),但Blender的错误信息会输出到标准错误(stderr),所以你现在只能看到正常的启动提示,看不到真正的报错原因:
- 修改命令,把stderr重定向到stdout,这样就能拿到所有输出:
$exe = "/usr/bin/blender -b /var/www/renderer/tmp/abcd/abcd.blend -P /var/www/renderer/addon_execute.py -- -sx 300 -sy 600 -s 0.5 -sa 10 2>&1"; $res = shell_exec($exe); var_dump($res); // 打印所有内容,包括错误信息 - 还可以给Blender加日志参数,让它输出更详细的启动过程:添加
--log-level 5,这样能看到每一步的加载情况,更容易定位问题。
4. 资源限制被触发
web服务器通常会对进程设置严格的资源限制(比如内存、CPU时间),Blender渲染需要的资源可能超过了这个限制,导致进程被系统强制杀死:
- 检查PHP的配置:
memory_limit和max_execution_time(不过注意,子进程的执行时间可能不受PHP的max_execution_time限制,要看系统的ulimit)。 - 在SSH和web环境下分别执行
ulimit -a,对比两者的资源限制(比如内存上限、CPU时间上限),如果web环境的限制太低,需要调整服务器的配置(比如Apache的RLimitMEM,或者修改系统的ulimit规则)。
内容的提问来源于stack exchange,提问作者lior r
相关产品推荐
相关产品推荐

