php-fpm
, nginx
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可能被禁用。