碰到一个非常诡异的问题:
XP Pro+SP3系统。
昨天程序原本都没问题,重启过一次apache之后,发现PHP无法取得POST url encoded 数据了,但是GET和POST multipart/form-data都可以正常获取。
也就是说当<form method="post">的时候,var_dump($_POST)为 array(0){};
当<form method="post" enctype="multipart/form-data">的时候,$_POST里面才会有值。
确定浏览器发送了POST数据了,无论是谷歌火狐IE6,传统表单提交还是ajax。
也不是只部分页面出现这个问题,所有的php都不行,甚至连phpMyAdmin都无法登录了。今天尝试了重新安装php5.2.17,重新安装apache2.2.22.0,都无法解决。
没办法,只好使用 IIS5.1 + PHP5.2.17 isapi再测试,结果这回倒可以了,但我总不好改用IIS吧……回忆昨天重启apache后出现问题之前,好像是运行过一次php下的go-pear.bat,然后在第一个界面就直接点叉关闭了;也有可能修改了一些其他的php.ini配置;
但最后我都重新解压了原版的php,重装了apache,按说应该不太可能是他们的原因?还是操作系统出什么诡异的状况了?哪位大侠碰到过这种问题么?我真不想重装系统……
XP Pro+SP3系统。
昨天程序原本都没问题,重启过一次apache之后,发现PHP无法取得POST url encoded 数据了,但是GET和POST multipart/form-data都可以正常获取。
也就是说当<form method="post">的时候,var_dump($_POST)为 array(0){};
当<form method="post" enctype="multipart/form-data">的时候,$_POST里面才会有值。
确定浏览器发送了POST数据了,无论是谷歌火狐IE6,传统表单提交还是ajax。
也不是只部分页面出现这个问题,所有的php都不行,甚至连phpMyAdmin都无法登录了。今天尝试了重新安装php5.2.17,重新安装apache2.2.22.0,都无法解决。
没办法,只好使用 IIS5.1 + PHP5.2.17 isapi再测试,结果这回倒可以了,但我总不好改用IIS吧……回忆昨天重启apache后出现问题之前,好像是运行过一次php下的go-pear.bat,然后在第一个界面就直接点叉关闭了;也有可能修改了一些其他的php.ini配置;
但最后我都重新解压了原版的php,重装了apache,按说应该不太可能是他们的原因?还是操作系统出什么诡异的状况了?哪位大侠碰到过这种问题么?我真不想重装系统……
register_global 无论改为On/Off都不能解决(改后都重启过apache并用phpinfo()输出状态确保修改成功了)。
那么就不能正常提交了
所以要
先看看 enctype='application/x-www-form-urlencoded' 结果如何?
因为电脑是双XP系统,我重启至另一个系统中,用同样位置的apache+php测试,故障依旧。因此确定不是系统的问题。
再次怀疑是参数配置问题。
于是重新解压一次php,直接使用未修改内容的“php.ini-recommended”做配置文件,测试发现问题竟然解决了。
拿两个ini一一对比,将我原来的ini各处改动逐一替换并测试后,终于发现,问题出在这里:
将其改为下面这样问题便消失了:
我之前为了测试POST文件上传,改动了这里。
因为上传文件只会用到 multipart/form-data,所以问题开始没有表现出来,但是后来再用普通的 POST 时,问题就出现了。当前最新的PHP手册中有如下含义的表示:
手册原文参见 http://www.php.net/manual/zh/ini.core.php#ini.post-max-size可是我刚刚用 Windows XP Pro with SP3 + httpd-2.2.22-win32-x86-no_ssl (Apache) + php-5.2.17-Win32-VC6-X86 测试,却有如下发现:满心以为自己发现一个 PHP 的大 bug,可再仔细一看,手册原文那里还有一段话:
也就是说,在32位系统中,如果使用简写法,其表示值超过 2^32 / 2 - 1 = 2147483647 时,计算结果会出错,因为 PHP 只是简单的将其按照 32 位有符号整数进行了一下位运算……
也许这可以解释上面的部分现象,但不管怎样,上传超过2G的文件会导致限制失效,这个bug稍微严重了点,虽然一般没人会传那么大的文件。
而用IIS测试时,因为使用了默认的 php.ini-recommended 所以没出问题。