流在php中读取文件

时间:2012-05-03 06:04:18

标签: php memory

我有一个大的csv文件(大约30M),我想用我的php程序读取并将其转换为另一种格式并将其保存为不同的小文件。当我使用传统的fopen,fwrite方法时,我收到的错误是Fatal error: Allowed memory size of 134217728 bytes exhausted。我知道我可以在php.ini中设置内存限制,但有没有办法可以将文件作为流读取,这样它就不会产生很多内存开销?可能类似于java中的StreamReader类?

1 个答案:

答案 0 :(得分:6)

你可以用fgets()一次一行地读取文件,只要你每次都重新分配你的变量(而不是将数据存储在一个数组或其他内容中,它们将保留在内存中)。

单向,文件大小为65 MB:

// load the whole thing
$file = file_get_contents('hugefile.txt');
echo memory_get_peak_usage() / 1024 / 1024, ' MB';
// prints '66.153938293457 MB'

第二种方式:

// load only one line at a time
$fh = fopen('hugefile.txt', 'r');
while ($line = fgets($fh)) {}
echo memory_get_peak_usage() / 1024 / 1024, ' MB';
// prints '0.62477111816406 MB'

此外,如果您想要以不同的格式重新排列数据,您可以使用fgetcsv()将每行解析为CSV。