php獲取輸入流

wangtaotao發表於2011-02-16

uc中的用到的程式碼(在api/uc.php)程式碼:

$post = xml_unserialize(file_get_contents(`php://input`));

php手冊(http://cn.php.net/manual/zh/wrappers.php.php)說明:

php://input allows you to read raw data
from the request body.
In case of POST requests, it preferrable to
$HTTP_RAW_POST_DATA as it does not depend on
special php.ini directives. Moreover, for those cases where
$HTTP_RAW_POST_DATA is not populated by
default, it is a potentially less memory intensive alternative
to activating always_populate_raw_post_data.
php://input is not available with
enctype=”multipart/form-data”.

Note:

A stream opened with php://input can only be read
once; the stream does not support seek operations. However, depending
on the SAPI implementation, it may be possible to open another
php://input stream and restart reading. This is
only possible if the request body data has been saved. Typically, this
is the case for POST requests, but not other request methods, such as
PUT or PROPFIND.

理解

1.符號的理解:與符號”http://“對比。可以理解php://表示這是一種協議。不同的是它是php自己定義與使用的協議。

輸入域名的時候,htt://後面輸入的是域的名字。那麼php://後面的”input”也可以表示一個檔案。是一個php已經定義好的檔案。比如有ouput。php自己知道去哪裡找這個檔案。

2.相關聯知識: 常量$HTTP_RAW_POST_DATA是獲取post提交的原始資料(contains the raw POST data)。php://input 的所完成的功能與它一樣:都是包含post過來的原始資料。

使用php://input比$HTTP_RAW_POST_DATA更好。因為:使用php://inpu不受到配置檔案的影響。常量$HTTP_RAW_POST_DATA受到php.ini配置的影響。在php.ini中有個選項,always_populate_raw_post_data = On。該配置決定是否生成常量$HTTP_RAW_POST_DATA(儲存post資料)。

php://input的方式與$HTTP_RAW_POST_DATA資料都同樣不適用於表單提交的”multipart/form-data”型別的資料。所以,兩種的區別就是在於是否受到配置檔案的影響。另外,記憶體消耗更少,這個怎麼理解?

3.怎麼得到其內容:使用file_get_contents(`php://input`)得到輸入流的內容。php://input的結果只讀。

 

4.使用規則:必須是post方式提交的資料。而且提交的不能是multipart/form-data型別的資料(當需要上傳檔案,就會在form標籤中新增屬性enctype=”multipart/form-data”)

想更好地理解它是怎麼使用的。做個試驗就明白:

html檔案輸入內容:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>無標題文件</title>
</head>

<body>

<form action=”input.php” method=”post”>

<input name=”username” type=”text” />

<input name=”password” type=”text” />
<input name=”name” type=”submit”value=”提交資料” />
</form>

</body>
</html>

input.php:

<?php

$input = file_get_contents(`php://input`);
var_dump($input);exit;
?>

提交後,得到結果:

string(97) “username=%E5%90%8D%E5%AD%97&password=%E5%AF%86%E7%A0%81&name=%E6%8F%90%E4%BA%A4%E6%95%B0%E6%8D%AE”

接下來改為get方式提交,結果為:

string(0) “”

說明沒有任何資料



相關文章