php标签后加 raw,PHP 5.6 弃用 $HTTP_RAW_POST_DATA 所带来的小坑

## 起因

在将服务器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`。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值