在PHP中读取非常大的文件

时间:2020-03-06 15:01:30  来源:igfitidea点击:

当我尝试在PHP中读取大小适中的文件时,fopen失败。一个6兆的文件会使它窒息,尽管大约100k的较小文件也可以。我读过,有时需要使用-D_FILE_OFFSET_BITS = 64`标志重新编译PHP,以便读取超过20个演出的文件或者荒谬的东西,但是对于6兆的文件我应该没有问题吗?最终,我们希望读入大约100兆的文件,并且能够打开它们,然后像​​fgets一样逐行读取它们,就像我可以处理较小的文件一样。

在PHP中读取和处理非常大的文件有什么技巧/解决方案?

更新:这是一个简单的代码块示例,该代码块在我的6兆文件上失败,PHP似乎没有引发错误,只是返回了false。也许我正在做一些非常愚蠢的事情?

$rawfile = "mediumfile.csv";

if($file = fopen($rawfile, "r")){  
  fclose($file);
} else {
  echo "fail!";
}

另一个更新:谢谢大家的帮助,事实证明这确实是一个愚蠢的权限问题。当较大的文件没有读取权限时,我的小文件莫名其妙地具有读取权限。 h!

解决方案

好吧,如果我们只想输出文件,则可以尝试使用readfile函数。

如果不是这种情况,也许我们应该考虑应用程序的设计,为什么要在Web请求上打开这么大的文件?

我使用fopen使用php脚本作为视频流服务器来打开视频文件进行流传输,并且文件大小超过50/60 MB时我没有问题。

我们尝试过file()吗?

http://is2.php.net/manual/zh/function.file.php

或者file_ get_contents()

http://is2.php.net/manual/en/function.file-get-contents.php

我们确定是fopen失败了,而不是脚本的超时设置了吗?默认值通常在30秒左右,如果文件读入的时间超过读入的时间,则可能会使文件中断。

要考虑的另一件事可能是脚本将文件读入数组的内存限制可能会超出此限制,因此请在错误日志中查看内存警告。

如果以上两个都不是问题,则可以考虑使用fgets逐行读取文件,并进行处理。

$handle = fopen("/tmp/uploadfile.txt", "r") or die("Couldn't get handle");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        // Process buffer here..
    }
    fclose($handle);
}

编辑

PHP doesn't seem to throw an error, it just returns false.

相对于脚本的运行位置,$ rawfile的路径是否正确?也许尝试在此处为文件名设置绝对路径。

如果问题是由达到内存限制引起的,则可以尝试将其设置为更高的值(这可能有效,取决于php的配置)。

这将内存限制设置为12 Mb

ini\_set("memory_limit","12M");