## 起因
在将服务器PHP版本升级至5.6之后,发现微信公众号不回复信息了,也没发现有报错信息。搞了好久,终于在 `register_shutdown_function` 中的 handler 里捕获到了如下错误信息:
```text
8192Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.Unknown0
```
大致是说
`$HTTP_RAW_POST_DATA` 这个变量已经在PHP 5.6 中弃用且会在未来的版本中移除。
## 解决方案
1. `php.ini` 中将 `always_populate_raw_post_data` 设为 `-1` ,临时解决办法,在PHP7中将被完全移除!
2. 使用`php://input` 代替 `$HTTP_RAW_POST_DATA`
但是你们以为这就是我所说的坑吗?不!!!
## 真正的坑
在我以为有可能是我所引用的 `easywechat` 这个包使用了 `$HTTP_RAW_POST_DATA` 所导致的时候,我才发现问题并没有不简单,我尝试全局搜索整个项目中的 `$HTTP_RAW_POST_DATA` 以验证这个可能性。
![WX20190327-125745@2x.png](http://storage.liesauer.net/2019/03/3787191191.png)
当我看到这个结果的时候真的惊了,项目中根本就没有使用 `$HTTP_RAW_POST_DATA` ,`PHP` 你报个鬼的错喔!
然后我到浏览器一顿操作,发现 99% 的文章都是教你怎么关闭这个错误的,对于我这种情况压根没提到,终于皇天不负有心人,终于让我找到一篇有提及的文章了。
[PHP 5.6: “Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version.”](https://www.bram.us/2014/10/26/php-5-6-automatically-populating-http_raw_post_data-is-deprecated-and-will-be-removed-in-a-future-version/ "PHP 5.6: “Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version.”")
其中文中提及到了触发该错误的两种情况:
1. 使用了 `$HTTP_RAW_POST_DATA`
2. 接收到的响应的 MIME 不是 `application/x-www-form-urlencoded` 并且开启了 `always_populate_raw_post_data`
由于我们的是公众号程序,所以响应自然是 XML 的 MIME ,所以满足了第二点,这个错误才一直出来,而 `always_populate_raw_post_data` 这个设置的可修改范围是 `PHP_INI_PERDIR`,这意味着该配置只能在 `php.ini` `httpd.conf` `.htaccess` 中修改,在代码中是无法动态修改的,而我的虚机又是 Windows + IIS 的,不支持修改 `php.ini`,也没有 Apache,所以无奈之下只能找个时间将虚机的系统改成 Linux + Apache ,再去关闭 `always_populate_raw_post_data`。