威尼斯正规官网主要是通过php输入流input, 代码如下
分类:热门资源

在php中php://input和$_POST有何分别呢,post是大家常用的获取表单提交的多寡的贰个例子,不过php://input测度超多有恋人和自个儿相通未有怎么用过,下边大家就三只来探视啊。

大家先来看多少个实例

    在动用xml-rpc的时候,server端获取client数据,主假诺通过php输入流input,并不是$_POST数组。所以,这里关键索求php输入流php://input

小编们先来看四个实例

例子:php://input

对一php://input介绍,PHP官方手册文书档案有一段话对它举行了很显眼地概述。 

例子:php://input

 代码如下

“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” 

代码如下复制代码

 <form action="post.php" method="post">
<input type="text" name="user">
<input type="password" name="password">
<input type="submit">
</form>

小编们应当怎么去通晓这段概述呢?!小编把它划分为三片段,逐步去领略。 
读取POST数据 
不可能用于multipart/form-data类型 
php://input VS $HTTP_RAW_POST_DATA 
读取POST数据 

form action=post.php method=post input type=text name=user input type=password name=password input type=submit /form

post.php

PHPer们自然很熟习$_POST这么些松手变量。$_POST与 php://input存在哪些关系与不相同呢?此外,客商端向服务端人机联作数据,最常用的主意除了POST之外,还应该有GET。既然php://input作 为PHP输入流,它能读取GET数据吧?这三个难题正是我们那节供给根究的基本点内容。 
经验告诉大家,从测验与观察中总计,会是叁个很凑效的方式。这里,小编写了多少个脚本来扶助大家测验。 

post.php

 代码如下

@file 192.168.0.6:/phpinput_server.php 打印出采取到的数据 
@file 192.168.0.8:/phpinput_post.php 模拟以POST方法提交表单数据 
@file 192.168.0.8:/phpinput_xmlrpc.php 模拟以POST方法产生xmlrpc诉求. 
@file 192.168.0.8:/phpinput_get.php 模拟以GET方法提交表单表数 
phpinput_server.php与phpinput_post.php 

代码如下复制代码

 <? echo file_get_contents("php://input");?>

<?php 
//@file phpinput_server.php 
$raw_post_data = file_get_contents('php://input', 'r'); 
echo "-------$_POST------------------n"; 
echo var_dump($_POST) . "n"; 
echo "-------php://input-------------n"; 
echo $raw_post_data . "n"; 
?> 

? echo file_get_contents(php://input);?

例子,post

<?php 
//@file phpinput_post.php 
$http_entity_body = 'n=' . urldecode('perfgeeks') . '&p=' . urldecode('7788'); 
$http_entity_type = 'application/x-www-form-urlencoded'; 
$http_entity_length = strlen($http_entity_body); 
$host = '192.168.0.6'; 
$port = 80; 
$path = '/phpinput_server.php'; 
$fp = fsockopen($host, $port, $error_no, $error_desc, 30); 
if ($fp) { 
fputs($fp, "POST {$path} HTTP/1.1rn"); 
fputs($fp, "Host: {$host}rn"); 
fputs($fp, "Content-Type: {$http_entity_type}rn"); 
fputs($fp, "Content-Length: {$http_entity_length}rn"); 
fputs($fp, "Connection: closernrn"); 
fputs($fp, $http_entity_body . "rnrn"); 

例子,post

html

while (!feof($fp)) { 
$d .= fgets($fp, 4096); 

fclose($fp); 
echo $d; 

?> 
大家能够通过行使工具ngrep抓取http乞求包(因为大家需求探知的是php://input,所以我们这里只抓取http Request数据包)。大家来履行测量检验脚本phpinput_post.php 

html

 代码如下

威尼斯正规官网,@php /phpinput_post.php 
HTTP/1.1 200 OK 
Date: Thu, 08 Apr 2010 03:23:36 GMT 
Server: Apache/2.2.3 (CentOS) 
X-Powered-By: PHP/5.1.6 
Content-Length: 160 
Connection: close 
Content-Type: text/html; charset=UTF-8 
-------$_POST------------------ 
array(2) { 
["n"]=> string(9) "perfgeeks" 
["p"]=> string(4) "7788" 

-------php://input------------- 
n=perfgeeks&p=7788 
由此ngrep抓到的http伏乞包如下: 

代码如下复制代码

<form action="welcome.php" method="post">
Enter your name: <input type="text" name="name" />
Enter your age: <input type="text" name="age" />
<input type="submit" />
</form>

T 192.168.0.8:57846 -> 192.168.0.6:80 [AP] 
POST /phpinput_server.php HTTP/1.1.. 
Host: 192.168.0.6..Content-Type: application/x-www-form-urlencoded..Co 
ntent-Length: 18..Connection: close....n=perfgeeks&p=7788.... 
周到考查,大家简单察觉 
1,$_POST数据,php://input 数据与httpd entity body数据是“一致”的 
2,http央求中的Content-Type是application/x-www-form-urlencoded ,它意味着http供给body中的数据是接收http的post方法提交的表单数据,並且开展了urlencode(State of Qatar处理。 
(注:注意加粗部分剧情,下文不再提拔卡塔尔(قطر‎. 

form action=welcome.php method=postEnter your name: input type=text name=name /Enter your age: input type=text name=age /input type=submit //form

welcome.php

我们再来看看剧本phpinput_xmlrpc.php的最早的著作件内容,它模拟了一个POST方法提交的xml-rpc诉求。 

welcome.php

 代码如下

<?php 
//@file phpinput_xmlrpc.php 
$http_entity_body = "nn jt_userinfon"; 
$http_entity_type = 'text/html'; 
$http_entity_length = strlen($http_entity_body); 
$host = '192.168.0.6'; 
$port = 80; 
$path = '/phpinput_server.php'; 
$fp = fsockopen($host, $port, $error_no, $error_desc, 30); 
if ($fp) { 
fputs($fp, "POST {$path} HTTP/1.1rn"); 
fputs($fp, "Host: {$host}rn"); 
fputs($fp, "Content-Type: {$http_entity_type}rn"); 
fputs($fp, "Content-Length: {$http_entity_length}rn"); 
fputs($fp, "Connection: closernrn"); 
fputs($fp, $http_entity_body . "rnrn"); 
while (!feof($fp)) { 
$d .= fgets($fp, 4096); 

代码如下复制代码 Welcome ?php echo $_POST[name]; ?.br /You are ?php echo $_POST[age]; ? years old!

Welcome <?php echo $_POST["name"]; ?>.<br />
You are <?php echo $_POST["age"]; ?> years old!

fclose($fp); 
echo $d; 

?> 
同样地,让大家来实行那一个测验脚本 

经过 HTTP POST 发送的变量不会来得在 UKoleosL 中。

由此 HTTP POST 发送的变量不会展现在 U途锐L 中。

@php /phpinput_xmlrcp.php 
HTTP/1.1 200 OK 
Date: Thu, 08 Apr 2010 03:47:18 GMT 
Server: Apache/2.2.3 (CentOS) 
X-Powered-By: PHP/5.1.6 
Content-Length: 154 
Connection: close 
Content-Type: text/html; charset=UTF-8 

当我们用$_POST选择不到页面传过来新闻时,大家得以用php://input去领受值,那么他们有哪些分别

当我们用$_POST接纳不到页面传过来新闻时,大家得以用php://input去领受值,那么他们有何分别

-------$_POST------------------ 
array(0) { 

首先当$_POST 与 php://input能够取到值时$HTTP_RAW_POST_DATA 为空;$http_raw_post_data是PHP内置的二个全局变量。它用来,PHP在不可能辨其他Content-Type的图景下,将POST过来的数量形容地填写变量$http_raw_post_data。它同样不能够读取Content-Type为multipart/form-data的POST数据。需求设置php.ini中的always_populate_raw_post_data值为On,PHP才会总把POST数据填充变量$http_raw_post_data。

首先当$_POST 与 php://input能够取到值时$HTTP_RAW_POST_DATA 为空;
$http_raw_post_data是PHP内置的二个全局变量。它用于,PHP在不能甄别的Content-Type的情景下,将POST过来的数码形容地填写变量$http_raw_post_data。它一律不或者读取Content-Type为multipart/form-data的POST数据。供给安装php.ini中的always_populate_raw_post_data值为On,PHP才会总把POST数据填充变量$http_raw_post_data。

-------php://input------------- 
<?xml version="1.0"> 
<methodcall> 
<name>jt_userinfo</name> 
</methodcall> 
实行那些本子的时候,大家通过ngrep抓取的http伏乞数据包如下 

然后$_POST以涉及数组情势协会提交的数据,并对此张开编码管理,如urldecode,以致编码转变;而php://input 通过输入流以文件读取格局获取未经管理的POST原始数据;

然后$_POST以涉及数组形式社团提交的多寡,并对此张开编码管理,如urldecode,以致编码转变;
而php://input 通过输入流以文件读取情势获得未经管理的POST原始数据;

T 192.168.0.8:45570 -> 192.168.0.6:80 [AP] 
POST /phpinput_server.php HTTP/1.1.. 
Host: 192.168.0.6..Content-Type: text/html..Content-Length: 75..Connec 
tion: close....<?xml version="1.0">.<methodcall>. <name>jt_userinfo< 
/name>.</methodcall>.... 
无差别于,笔者样也得以非常轻松地觉察: 
1,http央浼中的Content-Type是text/xml。它代表http诉求中的body数据是xml数据格式。 
2,服务端$_POST打字与印刷出来的是多个空数组,即与http entity body差异了。那跟上个例子不一致等了,这里的Content-Type是text/xml,并非application/x-www-form-urlencoded 
3,而php://input数据或然跟http entity body数据一致。也正是php://input数据和$_POST数据不相近了。 

php://input 允许读取 POST 的原来数据。和 $HTTP_RAW_POST_DATA 比起来,它给内部存款和储蓄器带给的压力相当的小,况且不须求别的异样的 php.ini 设置。php://input 不可能用于 enctype=multipart/form-data;

php://input 允许读取 POST 的庐山真面目目数据。和 $HTTP_RAW_POST_DATA 比起来,它给内部存款和储蓄器带给的压力十分的小,而且没有须求别的例外的 php.ini 设置。php://input 不能用于 enctype=”multipart/form-data”;

大家再来看看通过GET方法提交表单数据的意况,php://input能或无法读取到GET方法的表单数据?在此边,大家稍加改造一下phpinput_server.php文件,将$_POST改成$_GET。 

php://input读取不到$_GET数据。是因为$_GET数据作为query_path写在http央求底部(headerState of Qatar的PATH字段,实际不是写在http须要的body部分。

php://input读取不到$_GET数据。是因为$_GET数据作为query_path写在http央求底部(header卡塔尔国的PATH字段,实际不是写在http央浼的body部分。

复制代码代码如下:

<?php 
//@file phpinput_server.php 
$raw_post_data = file_get_contents('php://input', 'r'); 
echo "-------$_GET------------------n"; 
echo var_dump($_GET) . "n"; 
echo "-------php://input-------------n"; 
echo $raw_post_data . "n"; 
?> 
<?php 
//@file phpinput_get.php 
$query_path = 'n=' . urldecode('perfgeeks') . '&p=' . urldecode('7788'); 
$host = '192.168.0.6'; 
$port = 80; 
$path = '/phpinput_server.php'; 
$d = ''; 
$fp = fsockopen($host, $port, $error_no, $error_desc, 30); 
if ($fp) { 
fputs($fp, "GET {$path}?{$query_path} HTTP/1.1rn"); 
fputs($fp, "Host: {$host}rn"); 
fputs($fp, "Connection: closernrn"); 

while (!feof($fp)) { 
$d .= fgets($fp, 4096); 

fclose($fp); 
echo $d; 

?> 

一模二样,我们推行下一phpinput_get.php测量检验脚本,它模拟了三个日常性状态下的GET方法提交表单数据。 

@php /phpinput_get.php 
HTTP/1.1 200 OK 
Date: Thu, 08 Apr 2010 07:38:15 GMT 
Server: Apache/2.2.3 (CentOS) 
X-Powered-By: PHP/5.1.6 
Content-Length: 141 
Connection: close 
Content-Type: text/html; charset=UTF-8 

-------$_GET------------------ 
array(2) { 
["n"]=> 
string(9) "perfgeeks" 
["p"]=> 
string(4) "7788" 

-------php://input------------- 
在这里个时候,使用ngrep工具,捕获的附和的http哀告数据包如下 

T 192.168.0.8:36775 -> 192.168.0.6:80 [AP] 
GET /phpinput_server.php?n=perfgeeks&p=7788 HTTP/1.1.. 
Host: 192.168.0.6..Connection: close.... 
正如POST方法提交的http央浼,通常GET方法提交的伸手中,entity body为空。同一时间,不会钦赐Content-Type和Content-Length。然则,如若强硬数据http entity body,并指明正确地Content-Type和Content-Length,那么php://input还只是读取获得http entity body数据,但不是$_GET数据。 

所依赖,上边多少个探测,大家得以作出以下总括: 
1,Content- Type取值为application/x-www-form-urlencoded时,php会将http供给body相应数据会填入到数 组$_POST,填入到$_POST数组中的数据是扩充urldecode(卡塔尔国深入剖判的结果。(其实,除了该Content-Type,还应该有multipart/form-data表示数据是表单数据,稍后大家介绍) 
2,php://input数据,只要Content-Type不为 multipart/form-data(该典型约束稍后会介绍卡塔尔国。那么php://input数据与http entity body部分数据是相符的。该片段相平等的多寡的长度由Content-Length钦点。 
3,仅当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据才是”一致”(打上引号,表示它们格式不均等,内容相仿)的。此外意况,它们都不相通。 
4,php://input读取不到$_GET数据。是因为$_GET数据作为query_path写在http央浼尾部(headerState of Qatar的PATH字段,实际不是写在http央浼的body部分。 

那也扶持大家通晓了,为什么xml_rpc服务端读取数据都以透过file_get_contents(‘php://input', ‘r'卡塔尔(قطر‎。并非从$_POST中读取,正是因为xml_rpc数据标准是xml,它的Content-Type是text/xml。 
php://input碰到了multipart/form-data 

上传文件的时候,表单的写法是这么的 

复制代码代码如下:

<form enctype="multipart/form-data" action="phpinput_server.php" method="POST" > 
<input type="text" name="n" /> 
<input type="file" name="f" /> 
<input type="submit" value="upload now" /> 
</form> 

那正是说,enctype=multipart/form-data这里的含义,便是将该次http央求尾部(headState of Qatar中的Content-Type设置为multipart/form-data。请查阅EscortFC1867对 它的描述。multipart/form-data也象征以POST方法提交表单数据,它还伴随了文本上传,所以会跟application/x- www-form-urlencoded数据格式不均等。它会以一更种更客观的,越来越高速的数码格式传递给服务端。大家付出该表单数据,何况打印出响应结 果,如下: 

-------$_POST------------------ 
array(1) { ["n"]=> string(9) "perfgeeks" } 
-------php://input------------- 
並且,大家经过ngrep抓取的呼应的http需要数据包如下: 

######## 
T 192.168.0.8:3981 -> 192.168.0.6:80 [AP] 
POST /phpinput_server.php HTTP/1.1..Host: 192.168.0.6..Connection: kee 
p-alive..User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) A 
ppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.3 Safari/533.2..Re 
ferer: : 306..Ca 
che-Control: max-age=0..Origin: : mult 
ipart/form-data; boundary=----WebKitFormBoundarybLQwkp4opIEZn1fA..Acce 
pt: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q 
=0.8,image/png,*/*;q=0.5..Accept-Encoding: gzip,deflate,sdch..Accept-L 
anguage: zh-CN,zh;q=0.8..Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3..Cook 
ie: SESS3b0e658f87cf58240de13ab43a399df6=lju6o5bg8u04lv1ojugm2ccic6... 

## 
T 192.168.0.8:3981 -> 192.168.0.6:80 [AP] 
------WebKitFormBoundarybLQwkp4opIEZn1fA..Content-Disposition: form-da 
ta; name="n"....perfgeeks..------WebKitFormBoundarybLQwkp4opIEZn1fA..C 
ontent-Disposition: form-data; name="f"; filename="test.txt"..Content- 
Type: text/plain....i am file..multipart/form-data..------WebKitFormBo 
undarybLQwkp4opIEZn1fA--.. 
## 
从响应输出来比对,$_POST数据跟央浼提交数据切合,即$_POST = array(‘n' => ‘perfgeeks'卡塔尔。那也跟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数据。 

小编们再相比较此次通过ngrep抓取的http央求数据包,大家会发觉,最大分歧的一 点是Content-Type前面跟了boundary定义了数量的分界符,bounday是随机生成的。别的一个大区别样的,就是http entity body中的数据协会布局不相同等了。 

上一节,大家概述了,当Content-Type为application/x- www-form-urlencoded时,php://input和$_POST数据是“一致”的,为其它Content-Type的时候,php: //input和$_POST数据数据是不雷同的。因为独有在Content-Type为application/x-www-form- urlencoded也许为multipart/form-data的时候,PHP才会将http伏乞数据包中的body相应部分数据填入$_POST全 局变量中,此外景况PHP都忽视。而php://input除了在数据类型为multipart/form-data之外为空外,别的情况都恐怕不为空。 通过这一节,我们进一层透亮了php://input与$_POST的差别与关系。所以,再次确认,php://input不能读取 enctype=multipart/form-data数据,当php://input境遇它时,恒久为空,就算http entity body有数量。 
php://input VS $http_raw_post_data 

言听计用大家对php://input已经有分明深度地打听了。那 么$http_raw_post_data是什么样呢?$http_raw_post_data是PHP内置的一个全局变量。它用来,PHP在无法甄其他Content-Type的场合下,将POST过来的数额形容地填写变量$http_raw_post_data。它同样无法读取Content- Type为multipart/form-data的POST数据。须要设置php.ini中的 always_populate_raw_post_data值为On,PHP才会总把POST数据填充变量$http_raw_post_data。 

把脚本phpinput_server.php改换一下,能够印证上述剧情 

复制代码代码如下:

<?php 
$raw_post_data = file_get_contents('php://input', 'r'); 
$rtn = ($raw_post_data == $HTTP_RAW_POST_DATA) ? 1 : 0; 
echo $rtn; 
?> 

履行测量试验脚本 

@php phpinput_post.php 
@php phpinput_get.php 
@php phpinput_xmlrpc.php 

得出的结果输出都以一律的,即都为1,表示php://input和$HTTP_RAW_POST_DATA是平等的。至于对内存的下压力,大家那边就不做稳重地质衡量试了。风乐趣的,能够由此xhprof举行测量检验和重点。 

以此,大家这节能够总计如下: 
1, php://input 能够读取http entity body中内定长度的值,由Content-Length钦赐长度,不管是POST格局可能GET方法提交过来的多寡。不过,常常GET方法提交数据 时,http request entity body部分都为空。 
2,php://input 与$HTTP_RAW_POST_DATA读取的数目是均等的,都只读取Content-Type不为multipart/form-data的数量。 
学习笔记 

1,Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data二种境况下,PHP才会将http央浼数据包中相应的数量填充全局变量$_POST 
2,PHP不能分辨的Content-Type类型的时候,会将http央求包中相应的数额填充变量$HTTP_RAW_POST_DATA 
3, 独有Coentent-Type不为multipart/form-data的时候,PHP不会将http乞请数据包中的照看数额填充php://input,不然别的情状都会。填入的尺寸,由Coentent-Length内定。 
4,独有Content-Type为application/x-www-data-urlencoded时,php://input数据才跟$_POST数据相平等。 
5,php://input数据连接跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且没有须求极度装置php.ini 
6,PHP会将PATH字段的query_path部分,填入全局变量$_GET。平常状态下,GET方法提交的http诉求,body为空。

本文由威尼斯在线注册平台发布于热门资源,转载请注明出处:威尼斯正规官网主要是通过php输入流input, 代码如下

上一篇:php获到一个月的最大天数,和这个星期的开始时间和结束时间 下一篇:没有了
猜你喜欢
热门排行
精彩图文