PHP yield 读取大文件

今天来优化下读取大文件,在 PHP 读取大文件的时候,经常会出现内存不足的情况,如果文件过大的话,没法一次读取完,今天采用 yield 来实现大文件的读取。

老式读取方式

1
2
3
4
5
6
7
8
9
10
function readLocalFile($fileName)
{
$handle = fopen($fileName, 'r');
$lins = [];
while (!feof($handle)) {
$lines[] = fgets($handle);
}
fclose($handle);
return $lines;
}

yield 读取方式

使用 yield 的特性,来读取大文件

1
2
3
4
5
6
7
8
function readYieldFile($fileName)
{
$handle = fopen($fileName, 'r');
while (!feof($handle)) {
yield fgets($handle);
}
fclose($handle);
}

辅助函数

为了便于测试,我们写一个读取内存的辅助函数

1
2
3
4
5
6
7
8
9
function formatBytes($bytes)
{
if ($bytes < 1024) {
return $bytes . "b";
} else if ($bytes < 1048576) {
return round($bytes / 1024, 2) . "kb";
}
return round($bytes / 1048576, 2) . 'mb';
}

测试

我这里准备了一个 7M 大小的文本文件来做测试。

1
2
3
4
5
6
7
8
# 第一种
readLocalFile('./all.txt');
echo formatBytes(memory_get_peak_usage()); // 结果为 7.59mb

# 第二种
$lines = readYieldFile('./all.txt');
foreach ($lines as $row) {}
echo formatBytes(memory_get_peak_usage()); // 结果为 137.79kb

©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息

Happy Coding

坚持原创技术分享,您的支持将鼓励我继续创作!
Flyertutor WeChat Pay

WeChat Pay

Flyertutor Alipay

Alipay