php://input、php://output用法解析

1、php://output輸出流用法:

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

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

test.php文件:json

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

輸出:數組

[root@aiezu.com ~]# php test.php
愛E族

二、Http模式經過php://output導出csv文件:網絡

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

test.php頁面代碼:dom

<?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");

2、php://input輸入流用法:

php://input是php語言中一個只讀的數據流;經過"php://input",能夠讀取從Http客戶端以POST方式提交、請求頭「Content-Type」值非"multipart/form-data​"的全部數據;"php://input"通常用來讀取POST上來,除已被處理之外的剩餘數據。  curl

一、PHP使用"php://input"接收XML數據:post

ttp test.php頁面代碼:測試

<?php
/**
* xml文檔轉爲數組元素
* @param obj $xmlobject XML文檔對象
* @return array
*/
function xmlToArray($xmlobject) {
   $data = array();
   foreach ((array)$xmlobject as $key => $value) {
       $data[$key] = !is_string($value) ? xmlToArray($value) : $value;
   }
   return $data;
}

if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/xml' && $content = file_get_contents("php://input") ) {
   $xml = simplexml_load_string($content);//轉換post數據爲simplexml對象
   print_r(xmlToArray($xml));
}

待提交xml.xml文件內容:

<?xml version='1.0' encoding='UTF-8'?>
<root>
 <site>
   <name>愛E族</name>
   <domain>aiezu.com</domain>
 </site>
 <site>
   <name>天貓</name>
   <domain>tmall.com</domain>
 </site>
</root>

經過linux curl命令提交xml.xml:

[root@aiezu.com ~]# curl -H "Content-Type: application/xml" --data-binary @xml.xml http://aiezu.com/test.php
Array
(
   [site] => Array
       (
           [0] => Array
               (
                   [name] => 愛E族
                   [domain] => aiezu.com
               )
           [1] => Array
               (
                   [name] => 天貓
                   [domain] => tmall.com
               )
       )
)

二、PHP使用"php://input"接收JSON數據:

  PHP使用"php://input"接收JSON數據,與接收XML數據十分相似,這裏再也不作介紹,要查看實例請參考:Linux curl命令get/post提交數據、json和文件全攻略 頁面的第「六」節。

三、PHP使用"php://input"接收文件內容:

下面經過代碼演示PHP使用"php://input"接收一個png文件,這裏只是用於演示,實際運用中仍是建議使用Http請求頭"Content-Type"值爲"multipart/form-data"的表單方式POST。

接收頁面"test.php"代碼:

<?php
if ( preg_match("#^image/(png|jpe?g|gif)$#i", $_SERVER['CONTENT_TYPE'], $match) && $binary = file_get_contents("php://input") ) {
   $file = sprintf("/tmp/pic.%s", strtolower($match[1]));
   file_put_contents($file, $binary);
   echo sprintf("文件大小: %s\n", filesize($file));
   echo sprintf("修改時間: %s\n", date("Y-m-d H:i:s", filemtime($file)));
}

提交測試:

[root@aiezu.com ~]# curl -H "Content-Type: image/png" --data-binary @logo.png http://aiezu.com/test.php
文件大小: 3706
修改時間: 2016-12-05 13:29:08

總結

"php://input"通常用來讀取POST上來

相關文章
相關標籤/搜索