php:// 訪問各個輸入/輸出流


相關 php.ini 配置

  • allow_url_fopen :on 默認開啟 該選項為on便是激活了 URL 形式的 fopen 封裝協議使得可以訪問 URL 對象文件等。
  • allow_url_include:off 默認關閉,該選項為on便是允許 包含URL 對象文件等

 

php://stdin, php://stdout 和 php://stderr

php://stdin(只讀)、php://stdout 和 php://stderr (只寫) 允許直接訪問 PHP 進程相應的輸入或者輸出流, 推薦使用常量 STDIN、 STDOUT 和 STDERR 來代替手工打開這些封裝器。

  CLI 常量

應用一:

<?php
while($line = fopen('php://stdin','r')){
    echo fgets($line);
}
?>
// 結果
D:\phpStudy\WWW\test>php test.php
12345你好
12345你好

應用二:在dos命令行下直接返回STDIN文件指針(文件句柄)

<?php
    echo STDIN;
?>
// 結果
D:\phpStudy\WWW\test>php test.php
Resource id #1

應用三:

<?php
    echo fgets(STDIN);
?>
//STDIN可以拿到在dos下輸入的內容,fgets讀取這個STDIN文件句柄,即可打印出剛才輸入的內容
D:\phpStudy\WWW\test>php test.php
nnnn
nnnn

 

php://input

php://input 是個可以訪問請求的原始數據的只讀流。 POST 請求的情況下,最好使用 php://input 來代替 $HTTP_RAW_POST_DATA,因為它不依賴於特定的 php.ini 指令。 而且,這樣的情況下 $HTTP_RAW_POST_DATA 默認沒有填充, 比激活 always_populate_raw_post_data 潛在需要更少的內存。 enctype="multipart/form-data" 的時候 php://input 是無效的。

Note: 在 PHP 5.6 之前 php://input 打開的數據流只能讀取一次; 數據流不支持 seek 操作。 不過,依賴於 SAPI 的實現,請求體數據被保存的時候, 它可以打開另一個 php://input 數據流並重新讀取。 通常情況下,這種情況只是針對 POST 請求,而不是其他請求方式,比如 PUT 或者 PROPFIND。5.6.0 以上支持php://input 可反復使用。

 

php://output

php://output 是一個只寫的數據流, 允許你以 print 和 echo 一樣的方式 寫入到輸出緩沖區。

 

php://fd

php://fd 允許直接訪問指定的文件描述符。 例如 php://fd/3 引用了文件描述符 3。

 

php://memory 和 php://temp

php://memory 和 php://temp 是一個類似文件 包裝器的數據流,允許讀寫臨時數據。 兩者的唯一區別是 php://memory總是把數據儲存在內存中, 而 php://temp 會在內存量達到預定義的限制后(默認是 2MB)存入臨時文件中。 臨時文件位置的決定和 sys_get_temp_dir() 的方式一致。

php://temp 的內存限制可通過添加 /maxmemory:NN 來控制,NN 是以字節為單位、保留在內存的最大數據量,超過則使用臨時文件。

<?php
// Set the limit to 5 MB. 最大內存限制
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');

fputs($fp, "hello\n");

// Read what we have written.
rewind($fp);
echo stream_get_contents($fp);
?>

php://memory 和 php://temp 是一次性的,比如:stream 流關閉后,就無法再次得到以前的內容了

file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // 啥也沒有

 

php://filter

php://filter 是一種元封裝器, 設計用於數據流打開時的篩選過濾應用。 這對於一體式(all-in-one)的文件函數非常有用,類似 readfile() file() 和 file_get_contents(), 在數據流內容讀取之前沒有機會應用其他過濾器。

php://filter 目標使用以下的參數作為它路徑的一部分。 復合過濾鏈能夠在一個路徑上指定。詳細使用這些參數可以參考具體范例。

php://filter 參數

名稱 描述
resource=<要過濾的數據流> 這個參數是必須的。它指定了你要篩選過濾的數據流。這個參數必須位於 php://filter 的末尾,並且指向需要過濾篩選的數據流。
read=<讀鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔。
write=<寫鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(|)分隔。
<;兩個鏈的篩選列表> 任何沒有以 read= 或 write= 作前綴 的篩選器列表會視情況應用於讀或寫鏈。
// php://filter/resource=<待過濾的數據流>
readfile("php://filter/resource=http://www.example.com");

// php://filter/read=<讀鏈需要應用的過濾器列表>
/* 這會以大寫字母輸出 www.example.com 的全部內容 */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");

/* 這會和以上所做的一樣,但還會用 ROT13 加密。 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");

// php://filter/write=<寫鏈需要應用的過濾器列表>
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
 

封裝協議摘要(針對 php://filter,參考被篩選的封裝器)

屬性 支持
受限於 allow_url_fopen No
受限於 allow_url_include  php://input php://stdin php://memory 和 php://temp
允許讀取  php://stdin php://input php://fd php://memory 和 php://temp
允許寫入  php://stdout php://stderr php://output php://fd php://memory 和php://temp
允許追加  php://stdout php://stderr php://output php://fd php://memory 和php://temp(等於寫入)
允許同時讀寫  php://fd php://memory 和 php://temp
支持 stat()  php://memory 和 php://temp
支持 unlink() No
支持 rename() No
支持 mkdir() No
支持 rmdir() No
僅僅支持 stream_select() php://stdin php://stdout php://stderr php://fd 和 php://temp

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM