fopen
当我尝试读取一个非常适中的文件时失败了PHP
. A 6 meg file
让它窒息,虽然周围的小文件100k
很好.我读过,有时需要重新编译PHP
与-D_FILE_OFFSET_BITS=64
以读取在20场演出什么可笑的文件标记,但我不应该有一个6兆的文件没有问题?最终我们想要读取大约100兆的文件,并且能够打开它们然后逐行读取它们将很好,因为我可以使用较小的文件.
您在非常大的文件上阅读和操作的技巧/解决方案是什么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似乎没有抛出错误,它只返回false.
$rawfile
相对于脚本运行位置的路径是否正确?也许尝试在这里为文件名设置一个绝对路径.
使用1.3GB文件和9.5GB文件进行了2次测试.
1.3 GB
运用 fopen()
此过程使用15555 ms进行计算.
它在系统调用中花费了169毫秒.
运用 file()
此过程使用6983 ms进行计算.
它在系统调用中花费了4469毫秒.
9.5 GB
运用 fopen()
此过程使用113559 ms进行计算.
它在系统调用中花费了2532毫秒.
运用 file()
此过程使用8221 ms进行计算.
它在系统调用中花费了7998毫秒.
似乎file()
更快.