php-fpm不工作exec,system,shell_exec,只有CLI

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (547)

php-fpmnginxexec在使用时.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信息..

我制作了一个包含以下内容的文件:

#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。根本不存在

提问于
用户回答回答于

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

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

ping的静态编译版本驻留在/bin/ping(从chroot内部)。您需要复制/etc/hosts/etc/resolv.conf在chroot内部以解析主机名称(因为您正在尝试ping谷歌)。您计划调用的所有其他系统命令也必须复制到chroot内(与其共享库一起或静态编译)。

使用ldd(1)找出哪些库,您需要。根据你想要实现的目标,这可能是一项繁琐的工作。

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

用户回答回答于

我认为你的php.ini中禁用了exec和那些函数。你可以检查一下

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

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

如果exec列在那里,删除它。

然后重启php-fpm

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

编辑

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

编辑

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

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励