谈一谈php://input和php://output

那天用 PHPExcel 类导出excel 文件的时候就遇到了这个 php://output ,看到这篇文章介绍的很详细,于是转载过来,自己总结学习下php://input和php://output。原文链接:https://blog.csdn.net/qq_27682041/article/details/73326435#comments

一、php://output

它是一个只写数据流, 允许你以 print 和echo一样的方式写入到输出缓冲区。 

二、php://input

对  php://input  介绍,PHP官方手册文档有一段话对它进行了很明确地概述。
“php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”. 
翻译过来,是这样: “php://input可以读取原始的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data”.

1、php://input不能获取以get方式传过的数据

首先,我们先来了解一下get方式和post方式请求时header头的区别

【1】get请求时:请求的参数存在header头中的PATH字段,而不是写在http请求的body部分。并且没有指定Content-Type和Content-Length

【2】post 请求时:当Content- Type取值为application/x-www-form-urlencoded时,也指明了Content-Length的值,php会将http请求body相应数据会填入到数 组$_POST,填入到$_POST数组中的数据是进行urldecode()解析的结果。

因为php://input,只要Content-Type不为 multipart/form-data(该条件限制稍后会介绍)。那么php://input数据与header报文头中的 body部分数据是一致的。所以没办法获取get传参时path中的数据。 

2、php://input与$_POST区别在于:php://input不能用于获取multipart/form-data类型 

通过响应可以看出只是  var_dump 了$_POST接收过来的数据,并没有echo 出 php://input  的内容。

$_POST数据:
  'user' => string 'PHP' (length=3)
  'password' => string '100' (length=3)。这跟http请求body中的数据相呼应,同时说明PHP把相应的数据填入$_POST全局变量。而php://input 输出为空,没有输出任何东西,尽管http请求数据包中body不为空。这表示,当Content-Type为multipart/form-data的时候,即便http请求body中存在数据,php://input也为空,PHP此时,不会把数据填入php://input流。所以,可以确定: php://input不能用于读取enctype=multipart/form-data数据。

3、php://input  VS  $HTTP_RAW_POST_DATA

$http_raw_post_data是PHP的一个预定义变量。

在PHP手册有介绍:这个特性已经被PHP5.6删去了。高度依赖这一特点是非常令人沮丧的。

它用于,PHP在无法识别的 Content-Type的情况下,将POST过来的数据原样地填入变量$http_raw_post_data。需要设置php.ini中的 always_populate_raw_post_data值为On,PHP才会总把POST数据填入变量$http_raw_post_data。

php://input 与$HTTP_RAW_POST_DATA读取的数据是一样的,都只读取Content-Type不为multipart/form-data的数据。

猜你喜欢

转载自blog.csdn.net/bianb123/article/details/81084940