背景:直接执行shell脚本成功,在PHP中使用exec、shell_exec函数执行却一直失败。使用exec执行时$returnCode=1,使用shell_exec执行时用$output接收,$output为null。
在PHP文件中执行shell脚本,可以简单参考下此文:
考虑过一些可能性,权限、执行环境、文件路径等多个方面,始终仍是一个问题:PHP文件中通过shell_exec执行shell脚本失败,但在命令行内直接去执行一样的脚本又能成功执行。
最后发现是php.ini对这些函数禁用了。
解决办法:检查 php.ini 文件中的 disable_functions 设置,确认是否禁用了 shell_exec。
find /usr -name "php.ini" # 返回 /usr/local/php/etc/php.ini
vim /usr/local/php/etc/php.ini
在php.ini文件内果然看到disable_functions设置中包括了我使用过的exec、shell_exec等函数,这里我以实现功能为目的,暂时不考虑安全性,我对这项设置进行了注释。注意,注释符号是“;”。
接下来是重启Web服务,我参考了下面这篇文章:
我使用的是Nginx和PHP-FPM,因此我使用下面这种方式重启。需要注意的是不仅要重启nginx,php-fpm也需要重启,否则脚本执行还是会失败。
sudo systemctl restart nginx
sudo systemctl restart php-fpm
再次尝试运行PHP,其中shell_exec终于成功执行脚本且$output不再为null。