php - 在 PHP 中读取非常大的文件

标签 php file large-files

当我尝试在 PHP 中读取一个非常中等大小的文件时,

fopen 失败。 一个 6 meg 的文件 让它窒息,尽管 100k 左右的小文件就可以了。我读到有时需要使用 -D_FILE_OFFSET_BITS=64 标志重新编译 PHP 才能读取超过 20 gig 的文件或一些荒谬的东西,但我不应该6兆文件没有问题吗?最终我们想要读取大约 100 兆的文件,如果能够打开它们然后使用 fgets 逐行读取它们会很好,因为我能够处理较小的文件。

PHP 中读取和操作超大文件的技巧/解决方案是什么?

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

$rawfile = "mediumfile.csv";

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

另一个更新:感谢大家的帮助,结果确实是一件非常愚蠢的事情——权限问题。当大文件没有时,我的小文件莫名其妙地具有读取权限。呸!

最佳答案

您确定是 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 - 在 PHP 中读取非常大的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/162176/

相关文章:

ios - 将自定义对象写入和读取文件 IOS

python - 通过文件夹/文件属性获取主机名

python - 从大型(密码)列表中聚合和删除重复项的有效方法

language-agnostic - 随机访问 gzip 流

php - 如何在后台运行具有参数的命令的命令

php - 不使用 Zend_Application 的 Zend Framework 项目

php - 如何在 Apache 2.2 上使用 PHP 5.4 从 PUT 请求中获取数据

c++ - 如何将链表对象写入文件

c# - XmlReader - 如何更新进度条

php - 如何允许 require_once() 到 wordpress 中的 php 文件