免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 12112 | 回复: 4
打印 上一主题 下一主题

php在有限的内存中读取大文件的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-02 14:16 |只看该作者 |倒序浏览
本帖最后由 ewayfly 于 2013-07-02 14:19 编辑

遇到了一个要读取超过80M文件的需求,很悲剧的,不管是file_get_content还是file什么的,都会将读取的文件一次性加载到内存中
-
正常情况下,可以使用fseek来读取,好处就是不会一次性读取,以下代码只适合边取边处理的情况,不适合一次性读取一次性处理。
可以用以下办法生成测试文件

  1. $file_handle = fopen("./csdn.txt", "rb+");
  2. for ($index1 = 1; $index1 <= 2000000; $index1++) {
  3. fwrite($file_handle, 'http://jb15.net'.$index1."\r");
  4. }
  5. fclose($file_handle);
复制代码
读取处理代码如下:
  1. $i = 0;
  2. $now = '';
  3. while ($i >= 0) {
  4. if ($i>10) {
  5. break;
  6. } //by www.jbxue.com
  7. fseek($file_handle, 0, SEEK_CUR);
  8. $now = fgetc($file_handle);//可以自己写个判断false表示文件到头
  9. if ($now == "\r") {
  10. echo '找到断点';
  11. }
  12. echo $now;
  13. $i++;
  14. }
  15. fclose($file_handle);
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-07-02 22:37 |只看该作者
本帖最后由 xinglu1983 于 2013-07-03 09:07 编辑

在编程当中PHP文件操作经学会用到的,对于大文件的操作本来是不适合用这种web脚 本来进行操作的。

论坛徽章:
0
3 [报告]
发表于 2013-07-03 09:55 |只看该作者
stream 方式读取

论坛徽章:
0
4 [报告]
发表于 2013-07-30 16:35 |只看该作者
恩,stream是目前相对不错的方式 。

论坛徽章:
0
5 [报告]
发表于 2013-08-01 10:24 |只看该作者
学习了!好文!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP