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] => 门户 ) ...