如何在没有内存限制的情况下读取php中的大文件

use*_*056 3 php file memory-limit

我正在尝试逐行读取文件。问题是文件太大(超过 500000 行),我达到了内存限制。我想知道如何在没有内存限制的情况下读取文件。

我正在考虑多线程解决方案(例如将文件分成较小的组(每组 100000 行)并在多线程中读取它),但我不知道如何详细执行。请帮助我(对不起,英语不好)。

这是我的代码

$fn = fopen("myfile.txt", "r");

while(!feof($fn)) {
    $result = fgets($fn);
    echo $result;
}

fclose($fn);
Run Code Online (Sandbox Code Playgroud)

Mat*_*hai 8

您可以使用生成器来处理内存使用情况。这只是用户在文档页面上编写的示例:

function getLines($file)
{
    $f = fopen($file, 'r');

    try {
        while ($line = fgets($f)) {
            yield $line;
        }
    } finally {
        fclose($f);
    }
}

foreach (getLines("file.txt") as $n => $line) {
    // insert the line into db or do whatever you want with it.
}
Run Code Online (Sandbox Code Playgroud)

生成器允许您编写使用 foreach 迭代一组数据的代码,而无需在内存中构建数组,这可能会导致您超出内存限制,或者需要大量的处理时间来生成。取而代之的是,您可以编写一个生成器函数,它与普通函数相同,不同之处在于生成器可以生成所需的次数而不是返回一次,以提供要迭代的值。

  • 很棒的答案。没有意识到产量现在在 PHP 中是一回事。从 5.5 甚至......好奇我直到现在才看到它被使用。我真的应该阅读更新说明... (2认同)