PHP-"php://(类型)"访问各个输入/输出流以及全局变量$HTTP_RAW_POST_DATA讲解
$_POST
$HTTP_RAW_POST_DATA
php://input
先来讲以上三者的区别:
$_POST:以关联数组方式组织提交的数据, 并对原数据进行编码处理(urldecode)和编码转换, 无论表单enctype为何值, $_POST都可以成功取到传值, 但是碰到不能识别解析的(比如POST过来的Content-Type为text/xml)就无法解析为$_POST数组, 转而交给$HTTP_RAW_POST_DATA(如何POST xml可以使用curl, fsockopen等设置POST的Content-Type, 接收xml文件可以用以下两种$HTTP_RAW_POST_DATA, 或者file_get_contents('php://input'))
$HTTP_RAW_POST_DATA:仅在PHP被POST过来不能识别的MIME类型(Content-Type)(比如text/xml或者soap 等等)的时候, 会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA, 并且对于enctype="multipart/form-data"表单数据不可用
php://input:可通过输入流以文件读取方式取得未经处理的POST原始数据, 并且对于enctype="multipart/form-data"表单数据不可用(除了表单类型单一外, 可以获取任何POST过来的数据), 读取不到$_GET数据, 是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段, 而不是写在http请求的body部分
总结:
1.Content-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下, PHP才会将http请求数据包中相应的数据填入全局变量$_POST
2.PHP不能识别的Content-Type类型的时候, 会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DAT
3.只有Coentent-Type不为multipart/form-data的时候, PHP不会将http请求数据包中的相应数据填入php://input, 否则其它情况都会
4.只有Content-Type为application/x-www-data-urlencoded时, php://input数据才跟$_POST数据相一致
5.php://input比$HTTP_RAW_POST_DATA更凑效, 且不需要特殊设置php.ini
6.PHP会将PATH字段的query_path部分填入全局变量$_GET, 通常情况下, GET方法提交的http请求, body为空
以上结论摘抄自:http://www.jb51.net/article/31317.htm
讲到php://input再来讲PHP的各种输入/输出流
PHP提供了一些杂项输入/输出(IO)流, 允许访问PHP的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器
php://stdin, php://stdout和php://stderr
以上三个允许直接访问PHP进程相应的输入或者输出流(进程模式的PHP), 数据流引用了复制的文件描述符, 所以如果你打开php://stdin并在之后关了它, 仅是关闭了复制品, 真正被引用的STDIN并不受影响
php://stdin是只读的, php://stdout和php://stderr是只写的
php://input
可以访问请求的原始数据的只读流(获取请求头的body部分), 打开的数据流只能读取一次, 数据流不支持seek操作
php://output
是一个只写的数据流, 允许你以print和echo一样的方式写入到输出缓冲区
php://fd
允许直接访问指定的文件描述符
php://memory和php://temp
php://memory和php://temp是一个类似文件包装器的数据流, 允许读写临时数据, 两者的唯一区别是php://memory总是把数据储存在内存中, 而php://temp会在内存量达到预定义的限制后(默认是2MB)存入临时文件中, 临时文件位置的决定和sys_get_temp_dir()的方式一致, php://temp的内存限制可通过添加/maxmemory:NN来控制, NN 是以字节为单位、保留在内存的最大数据量, 超过则使用临时文件