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