PHP读取大文件
场景: 有一个500g的log文件, 文件内容大概类似: 时间+日志+换行; 读取整个文件内容.
分析:
500g的文件不能都载入内存, 可以每次加载一定数量的日志内容到内存来分析,
分析完成后, 写到永久存储中(文件/数据库等), 清空内存(循环操作时, 变量重新赋值不会重新分配内存);
循环上面的操作就可以分析完整个文件了.
一。
步骤:
1. fopen打开文件, 模式: r
2. fseek定位文件指针
3. fread读取一定长度(比如1024/2048)的日志, 分析这段日志内容并记录到永久存储中;
计算该断日志中符合格式的内容长度, 准备文件指针下次访问的位置;
清空内存;
注: 用fgets更方便一些,fread可以多读取一些内容, 一次存储.
4. 循环2~3, 直到文件结尾.
二。
可以用linux的split命令把大文件按行分割开(split命令可以在linux里split --help或者man split查看),
得到php可以单独处理的小文件, 这样剩下的问题就是php怎么处理这些小文件了, 这个对php来说不成问题。
参考文章:
1. PHP 读取大文件
http://www.cnblogs.com/gaocheng/archive/2010/11/12/1875317.html
读取少量内容可行, 到一定数量同样存在内存溢出的问题;
解决:
1) 增加行数上线, 避免内存溢出;
2) 50行日志,保存到数据库中, 清空内存.
2. PHP读取大文件详解
http://hi.baidu.com/qiaoyuetian/blog/item/66c367cc12f7840e01e9280f.html
很好的文章.
3. 用PHP读取文件的正确方法
https://www.ibm.com/developerworks/cn/opensource/os-php-readfiles/
最佳实践 -- 日常开发中推荐使用的.
文章结尾的这段话不太明白:
如果要处理大量数据,fscanf
将能证明自己的价值并比使用 file
附带 split
和 sprintf
命令更有效率。相反,如果要回显只做了少许修改的大量文本,则使用 file
、file_get_contents
或 readfile
可能更合适。使用 PHP 进行缓存或者创建权宜的代理服务器时可能就属于这种情况。
总结:
关键是分段读取和文件指针定位.