php://input和php://output

php://input 簡介

php://input 是個能夠訪問請求的原始數據的只讀流。 POST 請求的狀況下,最好使用 php://input 來代替 $HTTP_RAW_POST_DATA(原生的post數據),由於它不依賴於特定的 php.ini 指令,內存消耗更少。php

官方解釋:

php://input能夠讀取沒有處理過的POST數據。相較於$HTTP_RAW_POST_DATA而言,它給內存帶來的壓力較小,而且不須要特殊的php.ini設置。php://input不能用於enctype=multipart/form-data數組

$http_raw_post_data 是什麼?

$http_raw_post_data是PHP內置的一個全局變量。它用於,PHP在沒法識別的Content-Type的狀況下,將POST過來的數據原樣地填入變量$http_raw_post_data。它一樣沒法讀取Content-Type爲multipart/form-data的POST數據。須要設置php.ini中的always_populate_raw_post_data值爲On,PHP纔會總把POST數據填入變量$http_raw_post_data。瀏覽器

PHP在沒法識別的Content-Type的狀況下,纔將POST過來的數據原樣地填入變量$http_raw_post_data。網絡

使用方法

$data = file_get_contents("php://input");

get&post提交表單

  • GET提交

請求頭中不會指定Content-Type和Content-Length,它表示http請求body中的數據是使用http的post方法提交的表單數據,而且進行了urlencode()處理。app

  • POST提交

Content-Type爲application/x-www-form-urlencoded或者爲multipart/form-data的時候,PHP纔會將http請求數據包中的body相應部分數據填入$_POST全局變量中(時用$_POST能夠接收數據),其它狀況PHP都忽略。post

php://input除了在數據類型爲multipart/form-data以外爲空外,其它狀況均可能不爲空。編碼

php://input沒法讀取 enctype=multipart/form-data數據,當php://input遇到它時,永遠爲空,即使http entity body有數據。url

爲何叫部分填入呢? 爲multipart/form-data的時候,表單的數據不會填入到到 $_POST中,而是填入到了 $_FILES中。命令行

php://input 與 $HTTP_RAW_POST_DATA 比較:

php://input 與$HTTP_RAW_POST_DATA讀取的數據是同樣的,都只讀取Content-Type不爲multipart/form-data的數據。

讀取的數據是同樣的,可是填入數據的條件不同,post提交時,php://input就會填入,而$HTTP_RAW_POST_DATA只有再不能識別Content-Type時填入。code

總結:

  • Coentent-Type僅在取值爲application/x-www-data-urlencoded和multipart/form-data兩種狀況下,PHP纔會將http請求數據包中相應的數據填入全局變量$_POST。

當Coentent-Type爲application/x-www-data-urlencoded時 填入到$_POST數組中的數據是進行urldecode()解析的結果

只有Content-Type爲application/x-www-data-urlencoded時,php://input數據纔跟$_POST數據相"一致"(打上引號,表示它們格式不一致,內容一致)

php://input不能用於讀取enctype=multipart/form-data數據。

GET請求將,PHP會將PATH字段的query_path部分,填入全局變量$_GET。一般狀況下,GET方法提交的http請求,body爲空。

php://output輸出流用法:

簡介

php://output是php語言中一個只寫的數據流,容許像 print() 和 echo() 同樣的方式寫入到輸出緩衝區;「php://output」支持CLI(command-line interface,命令行界面)模式和Http模式;

用法:

  1. CLI模式經過php://output向終端輸出內容:

test.php文件:

<?php
$output = fopen("php://output", "w");
fwrite($output, "愛E族");
fclose($output);

輸出:

[root@aiezu.com ~]# php test.php
愛E族
  1. Http模式經過php://output導出csv文件:

注意,以UTF8編碼導出CSV文件,若是文件頭未添加BOM頭,使用Excel打開會出現亂碼。

test.php頁面代碼:

<?php
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="test.csv"');
$output = fopen('php://output','w') or die("Can't open php://output");
//UTF8 csv文件頭前需添加BOM,否則會是亂碼
fwrite($output, chr(0xEF).chr(0xBB).chr(0xBF));
// 輸出標題行
fputcsv($output, array('站點名', '域名', '行業'));
//數據內容
$rows = array(
     array('天貓', 'http://tmall.com', '電子商務')
    ,array('愛E族', 'http://aiezu.com', '互聯網技術')
    ,array('騰訊', 'http://qq.com', '社交網絡')
);
foreach($rows as $row) {
    fputcsv($output, $row);
}
fclose($output) or die("Can't close php://output");

常見的應用:讀取數據輸出到瀏覽器(PHPExcel裏的運用)

相關文章
相關標籤/搜索