程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 輸入流 php://input使用說明(1/2)

PHP 輸入流 php://input使用說明(1/2)

編輯:關於PHP編程

在使用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數據嗎?這二個問題正是我們這節需要探討的主要內容。
經驗告訴我們,從測試與觀察中總結,會是一個很湊效的方法。這裡,我寫了幾個腳本來幫助我們測試。

@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
//@file phpinput_server.php
$raw_post_data = file_get_contents('php://input', 'r');
echo "-------$_POST------------------n";
echo var_dump($_POST) . "n";
echo "-------php://input-------------n";
echo $raw_post_data . "n";
?>
 
<?php
//@file phpinput_post.php
$http_entity_body = 'n=' . urldecode('perfgeeks') . '&amp;p=' . urldecode('7788');
$http_entity_type = 'application/x-www-form-urlencoded';
$http_entity_length = strlen($http_entity_body);
$host = '192.168.0.6';
$port = 80;
$path = '/phpinput_server.php';
$fp = fsockopen($host, $port, $error_no, $error_desc, 30);
if ($fp) {
  fputs($fp, "POST {$path} HTTP/1.1rn");
  fputs($fp, "Host: {$host}rn");
  fputs($fp, "Content-Type: {$http_entity_type}rn");
  fputs($fp, "Content-Length: {$http_entity_length}rn");
  fputs($fp, "Connection: closernrn");
  fputs($fp, $http_entity_body . "rnrn");
 
  while (!feof($fp)) {
    $d .= fgets($fp, 4096);
  }
  fclose($fp);
  echo $d;
}
?>


我們可以通過使用工具ngrep抓取http請求包(因為我們需要探知的是php://input,所以我們這裡只抓取http Request數據包)。我們來執行測試腳本phpinput_post.php

 代碼如下 復制代碼 @php /phpinput_post.php
HTTP/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()處理。
(注:注意加粗部分內容,下文不再提示).

1 2

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved