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开发中常用的8个小技巧
Aug 27 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
Aug 09 PHP
php Session存储到Redis的方法
Nov 04 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
php语言中使用json的技巧及json的实现代码详解
Oct 27 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
Dec 02 PHP
PHP后端银联支付及退款实例代码
Jun 23 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
May 23 PHP
PHP7中I/O模型内核剖析详解
Apr 14 PHP
php常用字符串查找函数strstr()与strpos()实例分析
Jun 21 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 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
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
Three.js基础部分学习
2017/01/08 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
ES6正则表达式扩展笔记
2017/07/25 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
Python中非常实用的一些功能和函数分享
2015/02/14 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
丑小鸭教学反思
2014/02/03 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
广播体操口号
2014/06/18 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
黄河绝恋观后感
2015/06/08 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python