php内存优化之yield大文件读取
2019-09-03 17:11:29 / 4265 / 编程代码php-yield 生成器 是 php5.5.5 之后的产物,它有以下的特点:
* 可以优化php的性能
* 节省大量的内存
* 适合大量数据计算
因为以前写过一个读取大文件行号的函数,我就试着想用yield重构下
/**
* 获取指定行内容
* @param $file 文件路径
* @param $line 行数
* @param $length 指定行返回内容长度
*/
function GetLine($file, $line, $length = 1024)
{
$returnTxt = null;
// 初始化返回
$i = 1;
// 行数
$handle = @fopen($file, "r");
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle, $length);
if ($line == $i) {
$returnTxt = $buffer;
}
$i++;
}
fclose($handle);
}
return $returnTxt;
}
echo GetLine($file, 5000);
这种是以前的做法,改成yield之后如下:
function GetLine2($file, $line, $length = 1024)
{
$returnTxt = null;
$i = 1;
$handle = fopen($file, "r");
if ($handle) {
while (feof($handle)===false) {
$buffer = fgets($handle, $length);
if ($line == $i) {
yield $buffer;
}
$i++;
}
fclose($handle);
}
}
foreach (GetLine2($file,5000) as $key => $value) {
echo $value.PHP_EOL;
}
分别测试了下单独运行下这两个函数的执行时间:
执行时间看不出什么,差不多。
我们在来测试下使用的内存:
可以看到非常省内存,这只是一个函数而已,如果都能将php中类似的功能全都换成生成器来优化下,节省的内存还是非常可观的。
repostone
非技术的路过。