zoukankan      html  css  js  c++  java
  • 详解PHP输入流php://input

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

    对一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” 

    我们应该怎么去理解这段概述呢?!我把它划分为三部分,逐步去理解。 
    读取POST数据 
    不能用于multipart/form-data类型 
    php://input VS $HTTP_RAW_POST_DATA 
    读取POST数据 

    PHPer们一定很熟悉$_POST这个内置变量。$_POST与 php://input存在哪些关联与区别呢?另外,客户端向服务端交互数据,最常用的方法除了POST之外,还有GET。既然php://input作 为PHP输入流,它能读取GET数据吗?这二个问题正是我们这节需要探讨的主要内容。 
    经验告诉我们,从测试与观察中总结,会是一个很凑效的方法。这里,我写了几个脚本来帮助我们测试。

    程序01:打印出接收到的数据

    1 <?php 
    2 $raw_post_data = file_get_contents('php://input', 'r'); 
    3 echo "-------$_POST------------------
    "; 
    4 echo var_dump($_POST) . "
    "; 
    5 echo "-------php://input-------------
    "; 
    6 echo $raw_post_data . "
    "; 
    7 ?> 

    程序02:模拟以POST方法提交表单数据

     1 <?php 
     2 $http_entity_body = 'n=' . urldecode('perfgeeks') . '&p=' . urldecode('7788'); 
     3 $http_entity_type = 'application/x-www-form-urlencoded'; 
     4 $http_entity_length = strlen($http_entity_body); 
     5 $host = '192.168.0.6'; 
     6 $port = 80; 
     7 $path = '/phpinput_server.php'; 
     8 $fp = fsockopen($host, $port, $error_no, $error_desc, 30); 
     9 if ($fp) { 
    10 fputs($fp, "POST {$path} HTTP/1.1
    "); 
    11 fputs($fp, "Host: {$host}
    "); 
    12 fputs($fp, "Content-Type: {$http_entity_type}
    "); 
    13 fputs($fp, "Content-Length: {$http_entity_length}
    "); 
    14 fputs($fp, "Connection: close
    
    "); 
    15 fputs($fp, $http_entity_body . "
    
    "); 
    16 
    17 while (!feof($fp)) { 
    18 $d .= fgets($fp, 4096); 
    19 } 
    20 fclose($fp); 
    21 echo $d; 
    22 } 
    23 ?> 

    我们可以通过使用工具ngrep抓取http请求包(因为我们需要探知的是php://input,所以我们这里只抓取http Request数据包)

  • 相关阅读:
    蛙蛙推荐:蛙蛙教你配置linux+mysql+.net环境
    今日阅读20081231学习remoting
    翻译:改进.NET应用程序的性能和可伸缩性(一)概述及ADO.NET 性能
    翻译:改进.NET应用程序的性能和可伸缩性(二)为性能和可伸缩性做架构和设计上的Review
    蛙蛙推荐:作一个支持过载自适应和动态扩容的负载均衡服务
    翻译:改进.NET应用程序的性能和可伸缩性(三)Remoting性能
    清空日志后备份数据库
    CLR宿主相关
    每日阅读20081216
    iis 无法安装提示错误,无法复制一个或多个文件,错误码0x4b8 dodo
  • 原文地址:https://www.cnblogs.com/Steven-shi/p/5051933.html
Copyright © 2011-2022 走看看