php中$_POST和php://input的区别

你考95分是因为你的实力只有95分。我考一百分是因为这个卷子只有100分。

$_POST

$_POST 是获取表单 POST 过来数据(body部分)的最常用方法,上传的文件信息使用 $_FILES 获取。

php://input

可以读取没有处理过的POST数据。
相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。
php://input不能用于enctype=multipart/form-data

由于 php://input 只是数据流,我们可以使用 file_get_contents() 函数去获取它的内容:

1
2
$post_data = file_get_contents('php://input');
print_r($post_data);

获取到的内容和 $HTTP_RAW_POST_DATA 是一样的。

原始数据

当浏览器从表单发送 POST 请求的时候,默认的 media type 是 “application/x-www-form-urlencoded”,意思就是字段名和值都编码了,每个 key-value 对使用 ‘&’ 字符分隔开,key 和 value 使用 ‘=’ 分开,并且 key 和 value 中的空格都会被替换成 + ,其他特殊字符都会被使用 urlencode 方式进行编码。
比如下面的 key-value 对:

1
2
3
name: Jonathan Doe
age: 23
formula: a + b == 13%!

会被编码下面的原始数据:
name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21
PHP 会解析这些原始的 POST 数据,并且格式化成数组,填充到 $_POST 中:

1
2
3
4
5
6
Array
(
[name] => Jonathan Doe
[age] => 23
[formula] => a + b == 13%!
)

其他

很多时候,接收到不是网页 POST 过来的数据,而是可能通过其他方式 POST 过来的 “text/xml” 格式的数据,这些内容无法解析成 $_POST 数组,这个时候我们就需要原始的 POST 数据进行处理。

重要

PHP 7 已经取消了 $HTTP_RAW_POST_DATA,请用 php://input 代替。