php://input和php://output
2019獨角獸企業重金招聘Python工程師標準>>>
php://input 簡介
php://input 是個可以訪問請求的原始數據的只讀流。 POST 請求的情況下,最好使用 php://input 來代替 $HTTP_RAW_POST_DATA(原生的post數據),因為它不依賴于特定的 php.ini 指令,內存消耗更少。
官方解釋:
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()處理。
- POST提交
Content-Type為application/x-www-form-urlencoded或者為multipart/form-data的時候,PHP才會將http請求數據包中的body相應部分數據填入$_POST全局變量中(時用$_POST可以接收數據),其它情況PHP都忽略。
php://input除了在數據類型為multipart/form-data之外為空外,其它情況都可能不為空。
php://input無法讀取 enctype=multipart/form-data數據,當php://input遇到它時,永遠為空,即便http entity body有數據。
為什么叫部分填入呢? 為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時填入。
總結:
- 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不能識別的Content-Type類型的時候,會將http請求包中相應的數據填入變量$HTTP_RAW_POST_DATA
-
只有Coentent-Type不為multipart/form-data的時候,PHP不會將http請求數據包中的相應數據填入php://input,否則其它情況都會。填入的長度,由Coentent-Length指定。
php://input不能用于讀取enctype=multipart/form-data數據。
-
php://input數據總是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更湊效,且不需要特殊設置php.ini?
-
php://input讀取不到$_GET數據。是因為$_GET數據作為query_path寫在http請求頭部(header)的PATH字段,而不是寫在http請求的body部分。
php://output輸出流用法:
簡介
php://output是php語言中一個只寫的數據流,允許像 print() 和 echo() 一樣的方式寫入到輸出緩沖區;“php://output”支持CLI(command-line interface,命令行界面)模式和Http模式;
用法:
test.php文件:
<?php $output = fopen("php://output", "w"); fwrite($output, "愛E族"); fclose($output);輸出:
[root@aiezu.com ~]# php test.php 愛E族注意,以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里的運用)
轉載于:https://my.oschina.net/u/3683692/blog/3032795
總結
以上是生活随笔為你收集整理的php://input和php://output的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot JPA不调用sav
- 下一篇: centos php 错误日志,cent