PHP读取大文件的多种方法介绍

PHP 文件读取和分割大文件:完整教程 本文详细介绍了在 PHP 中读取和分割大文件的方法。通过逐行读取文件,我们可以有效地处理大文件,避免内存占用过多。通过分割大文件,我们可以逐个处理文件的每个部分,从而提高处理效率。希望这篇文章对你在 PHP 中处理大文件时有所帮助!如果你有任何疑问,请随时提问。 阅读详情

读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办法,希望例子能帮助到各位。

        在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能。但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。

需求:
有一个800M的日志文件,大约有500多万行, 用PHP返回最后几行的内容。

实现方法:

1. 直接采用file函数来操作
  由于 file函数是一次性将所有内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,则内存使用量不受限制。

下面是一段用file来取出这具文件最后一行的代码:

[php]  view plain  copy
  1. <?php  
  2.   ini_set('memory_limit', '-1');  
  3.   $file = 'access.log';  
  4.   $data = file($file);  
  5.   $line = $data[count($data) - 1];  
  6.   echo $line;  
  7. ?>  

  整个代码执行完成耗时 116.9613 (s)。
  我机器是2个G的内存,当按下F5运行时,系统直接变灰,差不多20分钟后才恢复过来,可见将这么大的文件全部直接读入内存,后果是多少严重,所以不在万 不得以,memory_limit这东西不能调得太高,否则只有打电话给机房,让reset机器了。

2.直接调用Linux的 tail 命令来显示最 后几行
  在Linux命令行下,可以直接使用 tail -n 10 access.log 很轻易的显示日志文件最后几行,可以直接用PHP来调用tail命令,执行PHP代码如下:

[php]  view plain  copy
  1. <?php  
  2.   $file = 'access.log';  
  3.   $file = escapeshellarg($file); // 对命令行参数进行安全转义  
  4.   $line = `tail -n 1 $file`;  
  5.   echo $line;  
  6. ?>  

 整个代码执行完成耗时 0.0034 (s)

3. 直接使用PHP的 fseek 来进行文件操作
  这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,而是直接通过指针来操作,所以效率是相当高效的。在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法:

方法一
  首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置, 再取这一行的位置,依次类推,直到找到了$num行。
实现代码如下

[php]  view plain  copy
  1. <?php  
  2. $fp = fopen($file, "r");  
  3. $line = 10;  
  4. $pos = -2;  
  5. $t = " ";  
  6. $data = "";  
  7. while ($line > 0)  
  8. {  
  9.  while ($t != "\n")  
  10.  {  
  11.  fseek($fp, $pos, SEEK_END);  
  12.  $t = fgetc($fp);  
  13.  $pos--;  
  14.  }  
  15.  $t = " ";  
  16.  $data .= fgets($fp);  
  17.  $line--;  
  18. }  
  19. fclose($fp);  
  20. echo $data  
  21. ?>  

整个代码执行完成耗时 0.0095 (s)

方法二
  还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换 行符(\n)的个数来判断是否已经读完最后$num行数据。
实现代码如下

[php]  view plain  copy
  1. <?php  
  2. $fp = fopen($file, "r");  
  3. $num = 10;  
  4. $chunk = 4096;  
  5. $fs = sprintf("%u", filesize($file));  
  6. $max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);  
  7. for ($len = 0; $len < $max; $len += $chunk)  
  8. {  
  9.  $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;  
  10.  fseek($fp, ($len + $seekSize) * -1, SEEK_END);  
  11.  $readData = fread($fp, $seekSize) . $readData;  
  12.  if (substr_count($readData, "\n") >= $num + 1)  
  13.  {  
  14.  preg_match("!(.*?\n){" . ($num) . "}$!", $readData, $match);  
  15.  $data = $match[0];  
  16.  break;  
  17.  }  
  18. }  
  19. fclose($fp);  
  20. echo $data;  
  21. ?>  

整个代码执行完成耗时 0.0009(s)。

方法三

[php]  view plain  copy
  1. <?php  
  2. function tail($fp, $n, $base = 5)  
  3. {  
  4.  assert($n > 0);  
  5.  $pos = $n + 1;  
  6.  $lines = array();  
  7.  while (count($lines) <= $n)  
  8.  {  
  9.  try  
  10.  {  
  11.   fseek($fp, -$pos, SEEK_END);  
  12.  }  
  13.  catch (Exception $e)  
  14.  {  
  15.   fseek(0);  
  16.   break;  
  17.  }  
  18.  $pos *= $base;  
  19.  while (!feof($fp))  
  20.  {  
  21.   array_unshift($lines, fgets($fp));  
  22.  }  
  23.  }  
  24.  return array_slice($lines, 0, $n);  
  25. }  
  26. var_dump(tail(fopen("access.log", "r+"), 10));  
  27. ?>  

整个代码执行完成耗时 0.0003(s)

方法四,PHP的stream_get_line函数 ,读取快速,读取50万条数据大文件,大概需要20秒左右的时间!例子代码如下

[php]  view plain  copy
  1. $fp = fopen('./iis.log', 'r'); //文件   
  2. while (!feof($fp)) {   
  3.  //for($j=1;$j<=1000;$j++) {     //读取下面的1000行并存储到数组中   
  4.  $logarray[] = stream_get_line($fp, 65535, "\n");   
  5.     // break;  
  6.  // }   
  7.     
  8.  }  

以上就是php读取大文件的几种方法,希望对大家的学习有所帮助。

参考:

PHP读取大文件的多种方法介绍 http://www.jb51.net/article/81909.htm
PHP读取大文件末尾N行的高效方法推荐 http://www.jb51.net/article/85844.htm


php 读取大文件 主要是对csv文件的快速读取以及过滤替换,支持search文件传过来的.*(从一个字符串到另一个字符串)^(不包含)的查找~ 立即下载

相关推荐

LayaNative源码编译

修改好后的LayaNative2.0需要重新编译生成Android和iOS所需要的动态库文件。

末之 1358

PHP读取大文件

即默认读取一行数据,如果一行数据小于1024字节,则完整读取。如,读取1024字节,没有换行符,则保存数据继续读取。如果遇到变态的文件,很多行都只有1000长度,某一行有8000长度,如果在不清楚的情况下,就很难掌控,若要完整读取就需要指定读取的最大字节,8000才能将每一行完整读取。然后根据设置的线程数,计算每个线程要读取的数据大小,即从哪里开始读,读到哪里结束。解决逻辑就是,假设线程开始的读取位置在某一行的中间,我们一个字符向前移动,移动到上个换行符(也可能是最开始)即可获取到整行文本内容。

快乐的搬砖的博客 1138

保姆级教程:不用看古早代码,5分钟搞懂泛微ecology9附件存储与接口调用

本文详细解析了泛微ecology9附件存储与接口调用的核心原理,提供从基础概念到实战操作的完整指南。通过拆解文档化附件设计理念、解析RESTful接口参数,并给出Python代码示例,帮助开发者快速掌握附件上传与业务集成的关键技巧,提升二次开发效率。

weixin_28688385的博客 349

在PHP中,读取大文件

总结:在PHP中,处理大文件可以使用fopen、fread、file、fgets、SplFileObject等函数和类来读取文件内容。首先使用fopen函数打开文件,然后使用fread函数指定读取的字节数,逐行读取文件内容并进行处理。4. 对于大文件的处理,建议使用适当的优化技巧,如使用缓存、使用定时器等,以提高处理效率。使用fread()函数来逐字节读取大文件的内容,并使用一个缓冲区来存储读取到的内容。使用fgets()函数来逐行读取大文件的内容,并使用一个缓冲区来存储读取到的内容。

whf1215847706的专栏 941

DIY便携式PEMF磁脉冲治疗仪:百元成本自制生物物理疗法设备

脉冲电磁场(PEMF)疗法是一种基于生物物理原理的非侵入性技术,它通过特定频率的电磁脉冲作用于细胞层面,影响细胞膜电位和离子通道活动,从而可能调节细胞代谢与功能。其技术价值在于提供了一种物理干预手段,在健康科技和生物黑客领域被探索用于放松、恢复等场景。实现PEMF的核心是通过信号发生与功率放大驱动电磁线圈产生可控磁场。本文以蓝牙音频模块和智能手机App为切入点,详细解析了如何利用低成本电子元件(如DFRobot XY-WRBT模块和漆包线线圈)构建一个可自定义频率的便携式PEMF设备,涵盖了从电路设计、线圈

weixin_31476015的博客 346

OpenIddict实战:5步搞定.NET Core应用的OIDC单点登录集成

本文详细介绍了如何使用OpenIddict在.NET Core应用中快速实现OIDC单点登录集成。通过五个关键步骤,包括环境准备、数据库集成、客户端注册、令牌配置和多应用SSO集成,帮助开发者高效构建安全的企业级单点登录解决方案。

lambda的博客 726

PHP读取大文件的几种方法介绍

  读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办法,希望例子能帮助到各位。     在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们...

weixin_33882443的博客 240

GEE聚类分析:基于sentinel-2 影像进行 K-Means 聚类分析

这篇博客介绍了如何使用 Google Earth Engine (GEE) 进行 K-Means 聚类分析,以识别感兴趣区域(ROI)内的不同地表覆盖类型。文章详细说明了从定义用户参数、准备参考区域、加载和预处理 Sentinel-2 图像,到训练 K-Means 聚类器并对图像进行聚类的完整流程。代码示例展示了如何设置参数、采样像素数据、训练聚类器,并将结果可视化。最后,还提供了将聚类结果导出到 Google Drive 的选项。通过该教程,用户可以掌握在 GEE 平台上进行地理数据聚类分析的基本方法。

此星光明博客 262

PHP高效读大文件处理数据

PHP高效读大文件处理数据

代元培 424

基于 SoC 的卷积神经网络车牌识别系统设计(1)引言

通过 CPU 软核 IP 在纯 FPGA 平台上构建一个 AI SoC 卷积神经网络车牌识别系统,其中,缩放、填充层、卷积层、ReLU、池化层、全连接层 IP 都是 Verilog 设计的,同时集成了各种高性能的 IP。这是最具挑战性的 AI SoC 芯片设计项目,集成了 Python 卷积神经网络代码、Verilog 卷积神经网络硬件设计、ARM SoC 设计、ARM 与 FPGA 的交叉编译流程等等。这不仅是科研学习、集创竞赛、秋招求职的一个极具优势的精彩项目,也是目前最火热的芯片行业之中的一个...

新芯设计的博客 3778

工业相机——靶面尺寸、像元尺寸、分辨率 、传感器尺寸

由Sensor对角线长度表示,单位英寸,这里的1英寸=16mm。——靶面尺寸为宽12.7mm*高9.6mm,对角线16mm。——靶面尺寸为宽8.8mm*高6.6mm,对角线11mm。——靶面尺寸为宽7.2mm*高5.4mm,对角线9mm。——靶面尺寸为宽6.4mm*高4.8mm,对角线8mm。——靶面尺寸为宽4.8mm*高3.6mm,对角线6mm。——靶面尺寸为宽3.2mm*高2.4mm,对角线4mm。——靶面尺寸为宽14*高10.5mm,对角线17mm。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 9605

PHP快速读取CSV大文件

CSV大文件的读取已经在前面讲述过了,但是如何快速完整的操作大文件仍然还存在一些问题。 1、如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行; 办法二:使用fgets一行一行遍历,得出总行数,这种办法比办法一好一些,但大文件仍有超时的可能; 办法三:借助SplFileObject类,直接将指

云烟阁 8206

ICM20948 DMP代码详解(54)

ICM20948 DMP代码详解(54)

phmatthaus的专栏 424

PHP如何快速读取大文件

在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能。但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。 需求需求 有一个800M的日志文件,大约有500多万行, 用PHP返回最后几...

lxw1844912514的博客 737

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

对于大文件处理使用PHP和JAVA的常用方法

2. **内存映射文件**:使用`java.nio`包中的`MappedByteBuffer`类来实现内存映射文件,可以高效地进行文件I/O操作,并减少内存消耗。4. **异步I/O**:使用`AsynchronousFileChannel`类进行异步文件读取,可以在等待文件读取完成时进行其他操作,从而提高程序的响应速度和并发性能。7. **优化数据结构**:选择合适的数据结构可以提高程序的效率。6. **多线程处理**:可以将文件分割成多个部分,每个线程处理一个部分,然后将结果合并,以此来提高处理速度。

webnoties的专栏 638

php 读取功能分割大文件实例详解

在php中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数。 但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。 需求如下: 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容。 实现方法: 1. 直接采用file函数来操作 注:由于 f...

github_zwl的博客 788

php写入大文件内容_用PHP读取超大文件的实例代码

数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一下这些帐号信息。虽然这些数据信息都已经被“整理”过的,不过自己拿来学习也挺有用的,毕竟有这么大的数据量。数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机。用MSS...

weixin_27199085的博客 202

php读取文件行读,如何在php中按行读取文件

您可以使用fgets()函数逐行读取文件:$handle = fopen("inputfile.txt", "r"); if ($handle) { while (($line = fgets($handle)) !== false) { // process the line read. } fclose($handle); } else { // error opening the file....

weixin_31244053的博客 3000

php文件操作

php读取文件的方法1.读取文件到数组$file=file('filename') 此函数可以把文件内容 当做数组读入 $lines=count($file) 用于读取行数可以通过以下循环来输出文件内容,for($i=0;$i&lt;$count;$i++){echo "htmlspecialchars($file[$i])"}2.读取文件到字符串$f...

weixin_33816946的博客 74

php(smarty)读写文件小结

关键词: smarty, php, txt, 读写文件 没有采用数据库,但是仍然想对用户的搜索行为记录一下,作为初学者,仔细研究了下: 首先,提交用户搜索请求的地方在 index.php: <form action="search.php" method="get"> <input type="text" name="k" value="搜...

weixin_30371875的博客 101

PHP SimpleXLSX终极指南:快速解析Excel文件的完整教程

想要在PHP中轻松处理Excel文件吗?😊 **PHP SimpleXLSX库** 是一个强大而简单的解决方案,专门用于解析和提取Excel XLSx文件中的数据。作为MS Excel 2007工作簿的PHP阅读器,它无需任何额外扩展,仅使用内部解压缩和标准SimpleXML解析器即可完成工作。 ## 什么是SimpleXLSX?🤔 **SimpleXLSX** 是一个轻量级的PHP库,专

gitblog_00870的博客 1006

用 PHP 读取文件的正确方法

了解使用 fopen、fclose、feof、fgets、fgetss 和 fscanf 的正确时机 Roger McCoy (rogermccoy@gmail.com), IT Specialist, 自由撰稿人 简介: 了解如何使用 PHP 的各种文件函数。查看诸如 fopen、fclose 和 feof 之类的基本文件函数;了解诸如 fgets、fgetss 和 fscanf 之类

georgelife7的专栏 378

PHP下载文件的方式

PHP下载文件的方式 1. 得到文件路径 从$_GET['file']得到文件路径 $path_parts = pathinfo($_GET['file']); $file_name = $path_parts['basename']; $file_path = '/mysecretpath/' . $file_name; 务必使用上...

weixin_34146986的博客 92
上一篇: 如何查看linux服务器负载
下一篇: CentOS 7 配置 Nginx + php + mysql 搭建 lnmp 环境过程全纪录
Professorphp
博客等级 码龄10年 4粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值