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 命令更有效率。相反,如果要回显只做了少许修改的大量文本,则使用 filefile_get_contents 或 readfile 可能更合适。使用 PHP 进行缓存或者创建权宜的代理服务器时可能就属于这种情况。 

 

总结: 

关键是分段读取和文件指针定位.

posted on 2012-05-11 15:49  DavidYanXW  阅读(2794)  评论(0)    收藏  举报