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 相关文章推荐
在PHP3中实现SESSION的功能(二)
Oct 09 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
Aug 02 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
thinkphp中的url跳转用法分析
Jul 12 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
Sep 19 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
PHP SESSION机制的理解与实例
Mar 22 PHP
PHP数组array类常见操作示例
May 15 PHP
Laravel相关的一些故障解决
Aug 19 PHP
如何判断微信付款码和支付宝付款码
Apr 01 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
MYSQL环境变量设置方法
2007/01/15 PHP
php include和require的区别深入解析
2013/06/17 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
浅谈php7的重大新特性
2015/10/23 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
jquery动态添加删除(tr/td)
2015/02/09 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
2018/06/14 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
js实现点击上传图片并设为模糊背景
2020/08/02 Javascript
Python 元组操作总结
2019/09/18 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
python如何把字符串类型list转换成list
2020/02/18 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
爱国演讲稿500字
2014/05/04 职场文书
宿舍标语大全
2014/06/19 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
旅游投诉信范文
2015/07/02 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
索尼ICF-36收音机评测
2022/04/30 无线电