今天在写微信公众号接受消息的接口的时候,接口总是接受不到微信服务器传递过来的信息数据,测试可一下,会报如下的错误:
Undefined index: HTTP_RAW_POST_DATA
接口代码如下:
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
.....
后来查了一下原来想要使用$GLOBALS[“HTTP_RAW_POST_DATA”]必须要在php.ini中开启 always_populate_raw_post_data这个选项,于是我就去php.ini中去查找这个选项,这个压根就没有这个配置项目(注:我的服务器环境是php7.0),于是我便在php.ini文件的最后添加上了这个选项,然后重启服务器,发现启动php-fpm的时候没有问题,很顺利,但是程序执行还是报错。
注意:后来查了一下,发现HTTP_RAW_POST_DATA已经在php5.6及更高版本中已经取消了这个全局变量,而是使用性能会更好的php://input来取代它
Warning This feature has been DEPRECATED as of PHP 5.6.0. Relying on this feature is highly discouraged.
于是继续查资料,发现在开发中有人采用get_file_contents(“php://input”)的方式进行获取微信服务器传递过来的数据,我就尝试了一下,发现可以了。
虽然问题解决了,但是关于在php脚本中获取post传递过来的数据的方式的问题却把我搞晕了。。。。。
于是继续查资料,发现是这样的:
(1):HTTP中的POST方式传递的数据类型是多种多样的,比如说text/xml,soap等等
(2):PHP默认情况下只能识别application/x-www.form-urlencoded数据类型(标准数据类型),对于这种数据类型的数据,直接通过$_POST系统函数就可以获取的到。但是对于不满足上述数据类型的数据,使用$_POST是获取不到的。
(3):PHP获取非application/x-www.form-urlencoded数据类型的数据的时候,需要通过php提供的$GLOBALS[‘HTTP_RAW_POST_DATA’]或者file_get_contents(“php://input”)的方式进行获取(这两种获取数据的方式只能获取非标准数据类型的数据,并不能获取标准数据类型的数据)
(4):file_get_contents(“php://input”)与$GLOBALS[‘HTTP_RAW_POST_DATA’]获取到的数据其实是一样的,两者之间的区别在与$GLOBALS[‘HTTP_RAW_POST_DATA’]依赖php.ini中额外的设置,并且系统资源占用高,推荐使用php://input的方式进行数据的获取
注意:application/x-www-form-urlencoded这种数据类型,应该是最常见的 POST 提交数据的方式。 浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 中的 Ajax Content-Type 默认值都是 application/x-www-form-urlencoded。这也就解释了为什么对于js传递的json数据,php可以通过$_POST直接获取了