区别在于SAPI运行环境不同:CLI以当前用户运行、PATH完整;Apache由www-data启动、PATH精简且权限受限;php-fpm依赖fpm.conf中env[PATH]配置,且disable_functions按SAPI独立设置。
有区别,而且区别很实在——不是“理论上可能不同”,而是调用失败、路径找不到、环境变量缺失、权限报错全取决于你用的是哪个 SAPI。
为什么 CLI 调用 Python 总是成功,但 Apache 下就报 command not found?
因为 CLI 和 Web SAPI(如 apache2handler、php-fpm)运行在完全不同的用户上下文和环境变量中:
-
cli通常以当前登录用户身份运行,PATH 包含/usr/bin、/usr/local/bin,能直接找到python3 -
apache2handler进程一般由www-data(Debian/Ubuntu)或apache(CentOS)用户启动,其PATH极其精简,常不含 Python 安装路径 -
php-fpm则依赖fpm.conf中的env[PATH]配置,若未显式设置,也会 fallback 到系统默认窄路径
典型现象:exec('which python3') 在 CLI 返回路径,在网页里返回空;shell_exec('python3 --version') 直接超时或返回空字符串。
exec / shell_exec 调用 Python 时,SAPI 对工作目录和权限的影响
工作目录(getcwd())和文件权限在不同 SAPI 下差异巨大:
立即学习“PHP免费学习笔记(深入)”;