$_POST

$HTTP_RAW_POST_DATA

php://input

先来讲以上三者的区别:

  $_POST:以关联数组方式组织提交的数据, 并对原数据进行编码处理(urldecode)和编码转换, 无论表单enctype为何值, $_POST都可以成功取到传值, 但是碰到不能识别解析的(比如POST过来的Content-Type为text/xml)就无法解析为$_POST数组, 转而交给$HTTP_RAW_POST_DATA(如何POST xml可以使用curl, fsockopen等设置POST的Content-Type, 接收xml文件可以用以下两种$HTTP_RAW_POST_DATA, 或者file_get_contents('php://input'))

  $HTTP_RAW_POST_DATA:仅在PHP被POST过来不能识别的MIME类型(Content-Type)(比如text/xml或者soap 等等)的时候, 会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA, 并且对于enctype="multipart/form-data"表单数据不可用

  php://input:可通过输入流以文件读取方式取得未经处理的POST原始数据, 并且对于enctype="multipart/form-data"表单数据不可用(除了表单类型单一外, 可以获取任何POST过来的数据), 读取不到$_GET数据, 是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段, 而不是写在http请求的body部分

  总结:

    1.Content-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下, PHP才会将http请求数据包中相应的数据填入全局变量$_POST

    2.PHP不能识别的Content-Type类型的时候, 会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DAT

    3.只有Coentent-Type不为multipart/form-data的时候, PHP不会将http请求数据包中的相应数据填入php://input, 否则其它情况都会

    4.只有Content-Type为application/x-www-data-urlencoded时, php://input数据才跟$_POST数据相一致

    5.php://input比$HTTP_RAW_POST_DATA更凑效, 且不需要特殊设置php.ini

    6.PHP会将PATH字段的query_path部分填入全局变量$_GET, 通常情况下, GET方法提交的http请求, body为空

    以上结论摘抄自:http://www.jb51.net/article/31317.htm

讲到php://input再来讲PHP的各种输入/输出流

PHP提供了一些杂项输入/输出(IO)流, 允许访问PHP的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器

php://stdin, php://stdout和php://stderr

  以上三个允许直接访问PHP进程相应的输入或者输出流(进程模式的PHP), 数据流引用了复制的文件描述符, 所以如果你打开php://stdin并在之后关了它, 仅是关闭了复制品, 真正被引用的STDIN并不受影响

  php://stdin是只读的, php://stdout和php://stderr是只写的

php://input

  可以访问请求的原始数据的只读流(获取请求头的body部分), 打开的数据流只能读取一次, 数据流不支持seek操作

php://output

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

php://fd

  允许直接访问指定的文件描述符

php://memory和php://temp

   php://memory和php://temp是一个类似文件包装器的数据流, 允许读写临时数据, 两者的唯一区别是php://memory总是把数据储存在内存中, 而php://temp会在内存量达到预定义的限制后(默认是2MB)存入临时文件中, 临时文件位置的决定和sys_get_temp_dir()的方式一致, php://temp的内存限制可通过添加/maxmemory:NN来控制, NN 是以字节为单位、保留在内存的最大数据量, 超过则使用临时文件

PHP-"php://(类型)"访问各个输入/输出流以及全局变量$HTTP_RAW_POST_DATA讲解的更多相关文章

  1. php:// — 访问各个输入/输出流(I/O streams)

    PHP: php:// - Manual http://www.php.net/manual/zh/wrappers.php.php php:// php:// — 访问各个输入/输出流(I/O st ...

  2. php:// 访问各个输入/输出流

    相关 php.ini 配置 allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等. allow_url_inc ...

  3. 序列流、对象操作流、打印流、标准输入输出流、随机访问流、数据输入输出流、Properties(二十二)

    1.序列流 * 1.什么是序列流 * 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.* 2.使用方式 * 整合两个 ...

  4. 第27章 java I/O输入输出流

    java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...

  5. 【转】输入/输出流 - 全面掌握IO

    File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件本身 ...

  6. Java 输入输出流 转载

    转载自:http://blog.csdn.net/hguisu/article/details/7418161 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所 ...

  7. Java I/O输入输出流详解

    一.文件的编码               开发时一定要注意项目默认的编码!!!!!!!!               文件操作的时候一定要记得关闭!!!!!!!!        ASCII:美国标准 ...

  8. Java-IO 输入输出流详解

    一.文件的编码               开发时一定要注意项目默认的编码!!!!!!!!               文件操作的时候一定要记得关闭!!!!!!!!        ASCII:美国标准 ...

  9. java输入输出流总结 转载

    一.基本概念 1.1 什么是IO?     IO(Input/Output)是计算机输入/输出的接口.Java中I/O操作主要是指使用Java进行输入,输出操作.     Java所有的I/O机制都是 ...

随机推荐

  1. LNMP包环境下使用TP5框架通过ODBC连接MSSQL方案

    本文主要介绍了如何在linux下使用php语言的thinkphp5框架通过pdo_odbc的方式连接MSSQL的方案步骤: 1.下载微软官方发布的ODBC驱动包 Red Hat 5/6:https:/ ...

  2. Ubuntu 16.04安装Wine版的微信(deepin-wechat)

    说明: 1.使用的Wine版本是深度出品(Deepin),已经精简了很多没用的配置,使启动能非常快,占用资源小. 2.关于没有.wine文件夹的解决方法:在命令行上运行winecfg: 3.有可能在今 ...

  3. Trigger a TTL circuit from ECL levels

    ECL circuits typically have relatively small logic spans of approximately 800 mV. Because of the sma ...

  4. Coreseek:区段查询及增量索引取代实时索引

    1.区段查询 索引系统须要通过主查询来获取所有的文档信息,一种简单的实现是将整个表的数据读入内存,可是这可能导致整个表被锁定并使得其它操作被阻止(比如:在MyISAM格式上的INSERT操作),同一时 ...

  5. UBUNTU 14.04 INSTALL nsenter

    cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.25/util-linux-2.25.tar.gz | tar - ...

  6. 7)Linux程序设计入门--网络编程

    )Linux程序设计入门--网络编程 Linux系统的一个主要特点是他的网络功能非常强大.随着网络的日益普及,基于网络的 应用也将越来越多. 在这个网络时代,掌握了Linux的网络编程技术,将令每一个 ...

  7. 与多线程结合使用的消息处理类Handler、Message

    1. 消息处理类——Handler 消息处理类(Handler)允许发送和处理Message或Runnable对象到其所在线程的MessageQueue中.Handerl有以下两个主要作用: 将Mes ...

  8. linux系统的磁盘挂载

    1.查看数据盘在没有分区和格式化数据盘之前,使用 “df –h”命令,是无法看到数据盘的,可以使用“fdisk -l”命令查看.如下图:2. 对数据盘进行分区执行“fdisk /dev/xvdb”命令 ...

  9. iOS:shareSDK第三方登录

    shareSDK第三方登录跟分享差不多,比较简单,前面已有介绍.这里简单写一下第三方登录吧. 1.首先:我用到了QQ.微信.新浪这三个平台的登录,需要到它们各自的开发者平台注册开发者账号,这是我的QQ ...

  10. SQL用例集锦

    SQL 语句分类 DDL - 数据定义语句 (CREATE,ALTER,DROP,DECLARE) DML - 数据操纵语句 (SELECT,DELETE,UPDATE,INSERT) DCL - 数 ...