原标题: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 file 按行读取,3分钟短文 | 大神救我!18G的大文件,PHP咋按行读取?相关推荐

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

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

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

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

  3. C++ 笔记(21)— 处理文件(文件打开、关闭、读取、写入)

    C++ 提供了 std::fstream ,旨在以独立于平台的方式访问文件. std::fstream 从 std::ofstream 那里继承了写入文件的功能,并从 std::ifstream 那里 ...

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

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

  5. posix threads php,3分钟短文 | PHP多线程没用过,你可能错过了计算机最好的时代!...

    原标题:3分钟短文 | PHP多线程没用过,你可能错过了计算机最好的时代! 引言 别的语言都在一窝蜂地搞编译,搞虚拟机,搞多线程,提高效率.我们整天敲 PHP 代码,除了 Nginx 调用 php-f ...

  6. Java –如何读取文件的最后几行

    在Java中,我们可以使用Apache Commons IO ReversedLinesFileReader读取File的最后几行. pom.xml <dependency><gro ...

  7. java读取txt文件并统计重复行

    环境:ide+maven3+mysql5.7+mybatis3+spring4+springmvc 控制层: @CrossOrigin @RestController @RequestMapping( ...

  8. python读取文件的第三行_python读取文件第n行

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! pos = pos - 1 try: f.seek(pos, 2) #从文件末尾 ...

  9. java注解接收上传文件,前台:Input type=file 后台获取文件内容用的是spring注解,当地环境上传图片是好的,发布到服务器上图片读取不到,求大神指点...

    当前位置:我的异常网» Java Web开发 » 前台:Input type="file" 后台获取文件内 前台:Input type="file" 后台获取文 ...

最新文章

  1. 用Python抓取某东购买记录并统计MM的bra大小
  2. 大学python用什么教材-Python大学教程(普通高等教育十三五规划教材)
  3. 开启LeetCode之路
  4. 给Eclipse提速的7个技巧
  5. wxWidgets:wxCriticalSectionLocker类用法
  6. dsp产生正弦波 c语言,TMS320C5502多波形发生器源程序 可产生正弦波,锯齿波等
  7. 【LeetCode】回文数
  8. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)
  9. Debian系linux系统常用配置软件源
  10. MogDB如何配置IPv6?
  11. 把dataset作为一个xml文件传给客户端
  12. idea无法正常使用SVN的解决方法
  13. Django admin美化插件suit
  14. php启动另一个php进程,用php守护另一个php进程的例子
  15. html获取xml的数据,xml格式获取值
  16. 怎么把框架栏变颜色 html,如何修改easyui框架颜色,求指点_html/css_WEB-ITnose
  17. 冒死解密,微信逆向:破解聊天记录文件!
  18. oracle 关联查询两个表,两张表关联查询,该怎么处理
  19. SQL ——窗口函数简介
  20. STM32F103C8的keil环境配置和STlink烧录

热门文章

  1. 中兴通讯学院:知识服务助力企业转型
  2. 华为mate30支持html,华为mate30参数配置
  3. 房屋征收管理系统、房地产、挂图会战、项目预警、房屋测绘管理、测绘确权、协议管理、测绘报表管理、数据采集、征收信息、房屋移交、安置分配、自定义报表、测绘管理、拆迁安置管理系统、补偿结算、房屋评估、搬迁、
  4. 6款上班族手机必备软件,一款网易快要放弃,一款苹果已经下架
  5. 分享感恩节联系客户话术
  6. 【Mac】报错:已损坏,无法打开。 您应该将它移到废纸篓。
  7. 设置 macOS 暗夜模式的方法
  8. VS Code配置Go语言开发环境
  9. PlantUML使用,案例辅助
  10. 编程计算两个数的最大公约数