原标题:3分钟短文 | 大神救我!18G的大文件,PHP咋按行读取?

引言

想逐行读取文件,完全避免把这个文件加载到内存中。如果文件太大(比如 18G),无法在内存中打开,还是要硬来的话,会抛出异常。

大小的编程语言都提供了文件的按行读写,PHP 怎会没有!

正确方法

是不能够使用 file_get_contents 函数,一股脑把所有文件内容扔到内存的。应该使用 fgets 函数逐行读取:

$handle = fopen("inputfile.txt", "r");

if ($handle) {

while (($line = fgets($handle)) !== false) {

// process the line read.

}

fclose($handle);

} else {

// error opening the file.

}

首先打开文件句柄,然后逐行使用 fgets 读取,处理完毕后使用 fclose 显式关闭。

当然,你也可以不必使用 false 判断,转而使用 feof 检测是否到文件末尾即可:

if ($file = fopen("file.txt", "r")) {

while(!feof($file)) {

$line = fgets($file);

# do same stuff with the $line

}

fclose($file);

}

所谓“条条大道通罗马”,实现功能的方法不止一种。我们更推荐的是下面的这种写法。使用 PHP 5.1 之后提供的 SplFileObject 对象处理文件。

那么就可以这样写:

$file = new SplFileObject("file.txt");

// Loop until we reach the end of the file.

while (!$file->eof()) {

// Echo one line from the file.

echo $file->fgets();

}

// Unset the file to call __destruct(), closing the file handle.

$file = null;

这个对象提供了为数众多的方法用于文件操作:

比起我们常用的一些文件操作函数:

fgetss() - 从文件指针中读取一行并过滤掉 HTML 标记

fread() - 读取文件(可安全用于二进制文件)

fgetc() - 从文件指针中读取字符

stream_get_line() - 从资源流里读取一行直到给定的定界符

fopen() - 打开文件或者 URL

popen() - 打开进程文件指针

fsockopen() - 打开一个网络连接或者一个Unix套接字连接

stream_set_timeout() - Set timeout period on a stream

SplFileObject 对象封装的更为灵活,如果嵌入到程序内使用,可以组装为十分强大的文件操作类。比一个个的操作函数,有更强的可扩展性。

写在最后

通过一个大文件的按行读取,我们引出了 SplFileObject 这个文件操作对象,希望大家仔细地学习一下,可以大大提升功力。

Happy coding :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

责任编辑:

php 按行读取 太慢,3分钟短文 | 大神救我!18G的大文件,PHP咋按行读取?相关推荐

  1. php file 按行读取,3分钟短文 | 大神救我!18G的大文件,PHP咋按行读取?

    原标题:3分钟短文 | 大神救我!18G的大文件,PHP咋按行读取? 引言 想逐行读取文件,完全避免把这个文件加载到内存中.如果文件太大(比如 18G),无法在内存中打开,还是要硬来的话,会抛出异常. ...

  2. matlab 代码开头,诸位大神请帮我讲解一下每个程序开头这些行的意思

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function varargout = Image_Main(varargin) % IMAGE_MAIN MATLAB code for Image_ ...

  3. python抽荣耀水晶_大神代抽荣耀水晶,只需要49元,网友亲自体验,结果5分钟完成...

    爱生活,爱游戏,大家好,我是阿呆! 在王者荣耀中有什么东西最吸引人呢?是英雄还是皮肤?让我想一下肯定是荣耀水晶了吧,这是在王者荣耀中至高无上的东西,基本上很多玩家都想要,但是按照平时的积分夺宝来计算, ...

  4. Python xlrd 读取Excel数字 数字丢失精度 小数位太长 求大神的解决方法(已解决)

    Python xlrd 读取Excel数字 跟Excel显示不一样 小数位太长 求大神的解决方法(已解决) 十分想念顺店杂可... Excel显示的数据 Python代码读取 # -*- coding ...

  5. python读取txt文件的行数_python读取txt文件符合条件的行数-女性时尚流行美容健康娱乐mv-ida网...

    女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页 > 高级搜索 python 关系网图 pyth ...

  6. 区区几行Python代码,一分钟搞定一天工作量

    作者 | 陈熹.刘早起 来源 | 早起Python 大家好,我是早起. 前几天有一个读者说最近要整理几千份文件,头都要整秃了,不知道能不能用Python解决,我们来看一下,你也可以思考一下. 由于涉及 ...

  7. pandas读取csv文件的前几行数据(nrows参数)、pandas读取csv文件的中间几行数据(skiprows=range(a,b))

    pandas读取csv文件的前几行数据(nrows参数).pandas读取csv文件的中间几行数据(skiprows=range(a,b)) 目录 pandas读取csv文件的前几行数据.pandas ...

  8. linux shell 读取文件指定单行 多行 连续行 倒数几行

    三种方法 1.tail -n +/-数字 文件名 2.head -n 数字 文件名 3.sed -n "开始行,结束行p" 文件名 下面分别介绍这几种方法 cd 到要文件所在目录. ...

  9. python读取excel部分值存入另一个excel-python3读取excel文件只提取某些行某些列的值方法...

    今天有一位同学给了我一个excel文件,要求读取某些行,某些列,然后我试着做了一个demo,这里分享出来,希望能帮到大家: 首先安装xlrd: pip3 install xlrd 然后上代码: imp ...

最新文章

  1. 《Redis设计与实现》之第七章:压缩列表
  2. CoordinatorLayout 使用及源码解析
  3. noj Nightmare
  4. 大数据WEB阶段(八)Tomcat服务器安装与详解、HTTP协议详解
  5. 利用js的闭包原理做对象封装及调用方法
  6. 详细设计说明书示例_专利说明书常用句型汇总
  7. RebatesMe:返利网站DDOS防护
  8. SpringBoot 2.1.5(8)---发者工具
  9. 对象的自身引用(Self-Reference) 动态绑定(Dynamic Binding)
  10. IMU-Allan方差分析
  11. jquery的autocomplete在firefox下不支持中文输入法的bug
  12. 狂神说Redis笔记三
  13. mysql 拷贝权限_mysql复制表的三种方法+grant三类权限说明
  14. 离线版MSDN下载地址
  15. 小说我成了机器人桑尼_我在月球当皇帝
  16. 移动通信学习笔记03_蜂窝原理
  17. TDB中多个model情况下使用fuseki查询
  18. c语言字符串输出大写字母个数,欧洲区预选赛视频直播 -官方网站
  19. Python3 打印26个英文字母
  20. ROS1云课→18一键配置

热门文章

  1. BZOJ 2442 [Usaco2011 Open]修剪草坪:单调队列优化dp
  2. java.io.FileNotFoundException: ...\ibs\library-1.0.17.jar (系统找不到指定的文件。)
  3. 遇到不可重现问题怎么办
  4. (转)web app 禁用手机浏览器缓存方法
  5. 马化腾:卓越领导者的五种习惯(作出表率尤为重要)
  6. CCF201403-5 任务调度(100分题解链接)
  7. Bailian2807 两倍【序列】
  8. 强悍的命令行 —— 路径相关
  9. 趣学 C 语言(十)—— 控制台交互(getch() vs. getchar())
  10. 西农 生成树配置_华为交换机配置STP功能示例