PHP php://memory、php://temp流用法解析

一、php://memory流介绍:

  php://memory流类似如一个文件,支持读写操作;使用fopen()、fclose()函数打开流,使用fseek()、rewind()函数移动流指针, 使用ftell()、feof() 函数获取流指针当前的位置。
  与普通文件不同的是,php://memory流的数据是写在内存中,速度比普通文件快很多。不过由于直接占用内存,不建议将大数据写入此流。php://memory流适合用于存放需要多次重复、频繁使用,数据量不大的临时内容。
内存填充测试:
<?php
echo sprintf("填充前内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
$mem = fopen('php://memory', 'r+');
for($i=0; $i<10000; $i++) {
    fwrite($mem, str_repeat('aiezu.com', 1000));
}
echo sprintf("填充后内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
fclose($mem);
echo sprintf("内存释放后占用: %.2fMB\n", memory_get_usage()/1024/1024);
测试结果:
[root@aiezu.com ~]# php test.php
填充前内存占用: 0.21MB
填充后内存占用: 86.05MB
内存释放后占用: 0.21MB
  

二、php://temp流介绍:

  php://temp流与php://memory流用法和功能基本相同,只是默认当写入的数据达到2MB时,数据将由写入在内存变为写入到临时文件。写入的临时文件名为sys_get_temp_dir()函数获取的目录下以"php"开头的随机文件名;可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据才写入到临时文件;php://temp流比较适合用于存放数据量比较大,且需要重复读取的数据。
  下面是通过linux curl上传csv的简单的例子,用于演示php://temp的用法;由于此例未重复使用这些csv数据,只做演示用,实际应用中此例完全可以去掉使用php://temp流。
网站端test.php代码:
<?php
//设置编码,不然中文会乱码
setlocale(LC_ALL, array('zh_CN.UTF-8', 'zh_CN.gbk','zh_CN.gb2312','zh_CN.gb18030'));
if ( strtolower($_SERVER['CONTENT_TYPE']) == "application/csv" ) {
    $input = fopen("php://input", 'r');
    $temp = fopen("php://temp/maxmemory:0", 'r+');
    while( $buffer = fread($input, 1024) ) {
        fwrite($temp, $buffer);
    }
    fclose($input);
    rewind($temp); //指针移动到文件头

    fgetcsv($temp); //跳过标题行
    while($data = fgetcsv($temp)) {
        print_r($data);
        //将数据写入数据库或者其他复杂计算操作
        //...
    }
}
客户端site.csv数据:
站点,url,行业
天猫,tmall.com,电子商务
腾讯,qq.com,社交网络
新浪,sina.com.cn,门户
...
linux curl上传csv数据命令:
[root@aiezu.com ~]# curl -H "Content-Type: application/csv" --data-binary @site.csv http://aiezu.com/test.php 
Array
(
    [0] => 天猫
    [1] => tmall.com
    [2] => 电子商务
)
Array
(
    [0] => 腾讯
    [1] => qq.com
    [2] => 社交网络
)
Array
(
    [0] => 新浪
    [1] => sina.com.cn
    [2] => 门户
)
...
 

三、附录:

0 个评论

要回复文章请先登录注册