PHP exec在CLI与NGINX环境中执行结果存在差异
为什么NGINX环境下exec执行
git --version返回空数组,但CLI模式正常? 这个问题我之前排查过好几次,核心原因其实是环境变量的差异——虽然都是以nginx用户运行,但CLI和NGINX启动的PHP进程,它们的环境变量完全不是一回事!
具体差异在哪里?
- CLI模式:当你通过
su nginx或者直接以nginx用户登录执行命令时,系统会加载该用户的shell配置文件(比如~/.bashrc、~/.profile),这些文件里通常会配置完整的PATH环境变量,包含了git可执行文件所在的目录(比如/usr/bin)。所以exec("git --version")能顺利找到git命令,返回正常结果。 - NGINX网页环境:NGINX是作为系统服务启动的,它启动的PHP-FPM进程不会加载用户的shell配置,只会继承系统级的极简环境变量。默认的
PATH通常只有/bin、/sbin这类基础目录,如果git不在这些目录里,PHP的exec就找不到git命令,执行失败后自然返回空数组。
怎么验证这个猜想?
你可以在test.php里加一行代码,打印当前的PATH:
<?php exec("echo \$PATH", $path); var_dump($path); exec("git --version",$res1); var_dump($res1); exec("whoami",$res2); var_dump($res2); ?>
分别在CLI和Chrome里运行,对比输出的PATH内容——你会发现NGINX环境下的PATH短很多,完全没有git所在的目录。
解决办法有这几种:
最直接的方法:用git的绝对路径
先在CLI下执行which git,得到git的绝对路径(比如/usr/bin/git),然后把代码里的命令改成:exec("/usr/bin/git --version", $res1);这样不管
PATH是什么,都能直接定位到git命令。给PHP-FPM配置完整的PATH
找到PHP-FPM的配置文件(比如/etc/php-fpm.d/www.conf),添加一行:env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/git把git所在的目录加到
PATH里,然后重启PHP-FPM和NGINX。在PHP代码里临时修改PATH
在执行git命令前,先把git所在目录加到当前进程的PATH中:// 假设git在/usr/bin目录下 putenv("PATH=" . getenv("PATH") . ":/usr/bin"); exec("git --version", $res1);
内容的提问来源于stack exchange,提问作者user4877203
相关产品推荐
相关产品推荐

