PHP输入流php://input实例讲解


Posted in PHP onDecember 22, 2015

对于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)、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为空。

总结起来就是,在用$_POST获取不到由APP或者一些接口的回调数据时,就用php://input试试

1、 接受xml数据

//发送xml数据
$xml = '<xml>xmldata</xml>';//要发送的xml 
$url = 'http://localhost/test/getXML.php';//接收XML地址 
$header = 'Content-type: text/xml';//定义content-type为xml 
$ch = curl_init(); //初始化curl 
curl_setopt($ch, CURLOPT_URL, $url);//设置链接 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息 
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头 
curl_setopt($ch, CURLOPT_POST, 1);//设置为POST方式 
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//POST数据 
$response = curl_exec($ch);//接收返回信息 
if(curl_errno($ch)){//出错则显示错误信息 
print curl_error($ch); 
} 
curl_close($ch); //关闭curl链接 
echo $response;//显示返回信息 


// php用file_get_contents("php://input")或者$HTTP_RAW_POST_DATA可以接收xml数据
$xmldata = file_get_contents("php://input"); 
$data = (array)simplexml_load_string($xmldata);

2、手机上传图片到服务器的小程序
发送

//@file phpinput_post.php 
$data=file_get_contents('btn.png'); 
$http_entity_body = $data; 
$http_entity_type = 'application/x-www-form-urlencoded'; 
$http_entity_length = strlen($http_entity_body); 
$host = '127.0.0.1'; 
$port = 80; 
$path = '/image.php'; 
$fp = fsockopen($host, $port, $error_no, $error_desc, 30); 
if ($fp){ 
fputs($fp, "POST {$path} HTTP/1.1\r\n"); 
fputs($fp, "Host: {$host}\r\n"); 
fputs($fp, "Content-Type: {$http_entity_type}\r\n"); 
fputs($fp, "Content-Length: {$http_entity_length}\r\n"); 
fputs($fp, "Connection: close\r\n\r\n"); 
fputs($fp, $http_entity_body . "\r\n\r\n"); 

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

接收

/**
 *Recieve image data
 **/
error_reporting(E_ALL);

function get_contents() {
 $xmlstr= file_get_contents("php://input");
 $filename=file_put_contentsxmltime().'.png';
 if(($filename,$str)){
 echo 'success';
 }else{
 echo 'failed';
 } 
  }
get_contents();

3:获取HTTP请求原文

/**
 * 获取HTTP请求原文
 * @return string
 */
function get_http_raw(){
 $raw = '';
 // (1) 请求行 
 $raw .= $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . ' ' . $_SERVER['SERVER_PROTOCOL'] . "\r\n";
 // (2) 请求Headers 
 foreach ($_SERVER as $key => $value) {
 if (substr($key , 0 , 5) === 'HTTP_') {
  $key = substr($key , 5);
  $key = str_replace('_' , '-' , $key);
  $raw .= $key . ': ' . $value . "\r\n";
 }
 }
 // (3) 空行 
 $raw .= "\r\n";
 // (4) 请求Body 
 $raw .= file_get_contents('php://input');
 return $raw;
}

以上就是针对PHP输入流举的三个小栗子,目的在于帮助大家更准确的理解PHP输入流,希望大家有所收获。

PHP 相关文章推荐
PHP开发文件系统实例讲解
Oct 09 PHP
PHP中ADODB类详解
Mar 25 PHP
php 生成随机验证码图片代码
Feb 08 PHP
PHP操作MySQL事务实例
Nov 05 PHP
php更新mysql后获取改变行数的方法
Dec 25 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
Mar 21 PHP
TP5框架实现签到功能的方法分析
Apr 05 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 PHP
服务器迁移php版本不同可能诱发的问题
Dec 22 #PHP
php上传图片并压缩的实现方法
Dec 22 #PHP
PHP实现图片上传并压缩
Dec 22 #PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
Dec 21 #PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
Dec 21 #PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 #PHP
反射调用private方法实践(php、java)
Dec 21 #PHP
You might like
php 无限级缓存的类的扩展
2009/03/16 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
php实现生成验证码实例分享
2016/04/10 PHP
thinkphp分页实现效果
2016/10/13 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
在UpdatePanel内jquery easyui效果失效的解决方法
2010/04/11 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
python继承和抽象类的实现方法
2015/01/14 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
数据库面试要点基本概念
2013/10/31 面试题
大二法英学生职业生涯规划范文
2014/02/27 职场文书
中央空调节能方案
2014/06/15 职场文书
助残日活动总结
2014/08/27 职场文书
小学校本教研总结
2015/08/13 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
详解PHP设计模式之依赖注入模式
2021/05/25 PHP