php-fpm不能运行exec,system,shell_exec,只有CLI

php-fpmnginx exec在使用时.phpfiles() shell_exec() system()可以在命令行下正常工作。

例如,当运作良好:

 #php myphp.php 

myphp.php包含:

 <?php exec('ping -c 3 google.com', $output); print_r($output); ?> 

但是,如果我把我的浏览器http://localhost/myphp.php ,它不再工作。

有任何想法吗? 我编辑

我做了一个文件,内容如下:

 #cat info.php <?php if(function_exists('exec')) { echo "exec is enabled"; } phpinfo(); ?> 

在我的浏览器中,打印

exec已启用,y php info ..

我做了一个文件,内容如下:

 #cat info.php <?php // Check for safe mode if( ini_get('safe_mode') ){ // Do it the safe mode way echo "Do it the safe mode way"; }else{ // Do it the regular way echo "Do it the regular way"; } ?> 

在我的浏览器中,打印

经常这样做

我不想知道我是否在监狱里吗?

在我的php ini

 #cat /etc/php-5.5.ini 

safe_mode没有显示,或ON或OFF。 根本不存在

我认为exec和那些功能在你的php.ini中被禁用。 你可以检查一下

 if(function_exists('exec')) { echo "exec is enabled"; } else { echo "exec is disabled"; } 

打开你的php.ini并导航到disable_functions部分

如果exec下面列出,删除它。

然后重新启动php-fpm

此外,如果安全模式启用此功能将不可用。 你需要禁用它。

编辑

使用完整路径进行ping。 你可以通过在shell中发出这个命令来找到它

编辑

 <?php exec('/sbin/ping -c3 google.com', $output); print_r($output); ?> 

在OpenBSD上,默认情况下,PHP-fpm被chrooted。 这可能是你看到它在cli而不是web上工作的原因。

你有两个解决方案。 禁用chroot(注释/etc/php-fpm.conf的行chroot = /var/www )或修复可能遇到的问题。

ping的静态编译版本驻留在/bin/ping (从chroot里面)。 你需要在chroot里拷贝/etc/hosts/etc/resolv.conf来解析主机的名字(就像你试图ping谷歌一样)。 您计划调用的所有其他系统命令也必须在chroot中(以及它们的共享库或静态编译)复制。

使用ldd(1)找出你需要的库。 根据你想要达成的目标,这可能是一件乏味的工作。

其他用户指出,exec,system和shell_exec可能被禁用。