php://input是什么,php://input、php://output用法解析。

php://input 是个可以访问请求的原始数据的只读流。当请求方式是post,并且Content-Type不等于”multipart/form-data”时,可以使用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。

php://output

php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。

一、php://output输出流用法:
php://output是php语言中一个只写的数据流,向“php://input”写入的数据将像 print() 和 echo() 一样的方式 写入到输出缓冲区;“php://input”支持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族

2、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");

网页打开效果如下:

二、php://input输入流用法:
php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data​"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。

1、PHP使用"php://input"接收XML数据:
http 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
                )
        )
)

2、PHP使用"php://input"接收JSON数据:
PHP使用"php://input"接收JSON数据,与接收XML数据十分类似,这里不再做介绍,要查看实例请参考:Linux curl命令get/post提交数据、json和文件全攻略 页面的第“六”节。

3、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

 

文章版权归原作者所有或来自互联网,未经允许请勿转载。如有侵权请联系我删除,谢谢!
THE END
分享
二维码
打赏
< <上一篇
下一篇>>
文章目录
关闭
目 录