0

0

php中php://input的用法详细

php中文网

php中文网

发布时间:2016-05-25 16:43:38

|

7282人浏览过

|

来源于php中文网

原创

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_post数组,所以,这里主要探讨php输入流php://input.

下面的例子摘取的是wordpress中的一段代码,里面有用到http://input,有需要的可以进一步研究,代码如下:

if (!isset( $HTTP_RAW_POST_DATA ) ) {    
	    $HTTP_RAW_POST_DATA = file_get_contents('php://input');    
	} 
	// fix for mozBlog and other cases where xml isn't on the very first line    
	if ( isset($HTTP_RAW_POST_DATA) )    
	$HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);

对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免费学习笔记(深入)”;

“php://input可以读取没有处理过的POST数据,相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置,php://input不能用于enctype=multipart/form-data”.

读取POST数据PHPer们一定很熟悉$_POST这个内置变量,$_POST与php://input存在哪些关联与区别呢?另外,客户端向服务端交互数据,最常用的方法除了POST之外,还有GET,既然php://input作为PHP输入流,它能读取GET数据吗?这二个问题正是我们这节需要探讨的主要内容.

经验告诉我们,从测试与观察中总结,会是一个很凑效的方法,这里,我写了几个脚本来帮助我们测试.

@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

php实例代码如下:


我们可以通过使用工具ngrep抓取http请求包,因为我们需要探知的是php://input,所以我们这里只抓取http Request数据包,我们来执行测试脚本phpinput_post.php,代码如下:

@php /phpinput_post.phpHTTP/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请求包如下: 
	 
	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()处理.

我们再来看看脚本phpinput_xmlrpc.php的原文件内容,它模拟了一个POST方法提交的xml-rpc请求,代码如下:

同样地,让我们来执行这个测试脚本,代码如下:

Kuwebs企业网站管理系统3.1.5 UTF8
Kuwebs企业网站管理系统3.1.5 UTF8

酷纬企业网站管理系统Kuwebs是酷纬信息开发的为企业网站提供解决方案而开发的营销型网站系统。在线留言模块、常见问题模块、友情链接模块。前台采用DIV+CSS,遵循SEO标准。 1.支持中文、英文两种版本,后台可以在不同的环境下编辑中英文。 3.程序和界面分离,提供通用的PHP标准语法字段供前台调用,可以为不同的页面设置不同的风格。 5.支持google地图生成、自定义标题、自定义关键词、自定义描

下载
@php /phpinput_xmlrcp.phpHTTP/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------------------ 
	array(0) { 
	} 
	 
	-------php://input------------- 
	 
	 
	   jt_userinfo 
	

执行这个脚本的时候,我们通过ngrep抓取的http请求数据包如下

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......   jt_userinfo< 
	  /name>.....

同样,我样也可以很容易地发现:

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数据不一致了.

我们再来看看通过GET方法提交表单数据的情况,php://input能不能读取到GET方法的表单数据?在这里,我们稍加改动一下phpinput_server.php文件,将$_POST改成$_GET,代码如下:

同样,我们执行下一phpinput_get.php测试脚本,它模拟了一个通常情况下的GET方法提交表单数据,代码如下:

@php /phpinput_get.phpHTTP/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数据.

实践中关于php://input用法总结:

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

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

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

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

5、php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini

6、PHP会将PATH字段的query_path部分,填入全局变量$_GET,php://input读取不到$_GET数据,是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段,而不是写在http请求的body部分.        
               
               

本文地址:

转载随意,但请附上文章地址:-)

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 序列化
Python 序列化

本专题整合了python序列化、反序列化相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.02

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

91

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

27

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

11

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

5

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

5

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

62

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

55

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

27

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 10.1万人学习

CSS3 教程
CSS3 教程

共18课时 | 5.1万人学习

Git 教程
Git 教程

共21课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号