1. 直接采用file函数来操作

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

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

ini_set('memory_limit','-1');
$file = 'access.log';
$data = file($file);
$line = $data[count($data)-1];
echo $line;

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

2.直接调用linux的tail命令来显示最 后几行

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

file = 'access.log';
$file = escapeshellarg($file); // 对命令行参数进行安全转义
$line = `tail -n 1 $file`;
echo $line;

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

3. 直接使用php的fseek来进行文件操作

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

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

$fp = fopen($file, "r");
$line = 10;
$pos = -2;
$t = " ";
$data = "";
while ($line > 0) {while ($t != "\n") {fseek($fp, $pos, SEEK_END);$t = fgetc($fp);$pos --;}$t = " ";$data .= fgets($fp);$line --;
}
fclose ($fp);
echo $data

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

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

$fp = fopen($file, "r");
$num = 10;
$chunk = 4096;
$fs = sprintf("%u", filesize($file));
$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);
for ($len = 0; $len < $max; $len += $chunk) {     $seekSize = ($max - $len &gt; $chunk) ? $chunk : $max - $len;fseek($fp, ($len + $seekSize) * -1, SEEK_END);$readData = fread($fp, $seekSize) . $readData;if (substr_count($readData, "\n") &gt;= $num + 1) {preg_match("!(.*?\n){".($num)."}$!", $readData, $match);$data = $match[0];break;}
}
fclose($fp);
echo $data;

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

方法三

function tail($fp,$n,$base=5)
{assert($n>0);$pos = $n+1;$lines = array();while(count($lines)< =$n){try{fseek($fp,-$pos,SEEK_END);} catch (Exception $e){fseek(0);break;}$pos *= $base;while(!feof($fp)){array_unshift($lines,fgets($fp));}}return array_slice($lines,0,$n);
}
var_dump(tail(fopen("access.log","r+"),10));

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

本文地址:http://justcoding.iteye.com/blog/986293

php读取操作大文件相关推荐

  1. php如何导入大文件数据库,PHP读取CSV大文件导入数据库的示例

    文章详细介绍了csv文件在php中快速导入到mysql数据库中的例子,虽然从最简单的几百MB的到最后使用插件实现几个GB数据导入中间有一些嗑碰了,但结果还是好的. 对于数百万条数据量的CSV文件,文件 ...

  2. java读取excel大文件

    在读取excel大文件的时候就不能再使用poi包下面的Workbook类,会造成OOM等问题. 我们常见的excel分为xlsx格式和csv格式.分别实现一下. xlsx格式处理. 需要的pom依赖: ...

  3. php读写xml文件,另辟蹊径 搞定PHP读取XML大文件 数据导入

    由于工作原因,不得不与一个二逼团队合作, 我说直接导出SQL文件给我就好了,而他们坚持要导出XML文件. 或者他们有他们的原因吧,但我还是要叫他们二逼团队,懒得了解他们有什么苦衷. 我想MySQL应该 ...

  4. php读取csv指定行_PHP快速读取CSV大文件指定行

    1.如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行: 办法二:使用fgets一行一行遍历,得出总行数,这种办法比办 ...

  5. java bufferedrandomaccessfile_java 读写操作大文件 BufferedReader和RandomAccessFile

    一 老问这问题,两个都答出来算加分项? 二 具体代码如下,没什么好说的直接说对比. BufferedReader和RandomAccessFile的区别 RandomAccessFile 在数据越大, ...

  6. java读取一个应用程序_Java IO – 在写入其他应用程序时读取一个大文件

    我想使用java来读取weblogic日志文件,而weblogic正在将日志写入其中(缓冲),但我只想读取内容,当我开始阅读它时. 我怎样才能做到这一点 ? public class DemoRead ...

  7. php 读取excel大文件,php 如何读大excel

    phper需要处理excel的时候基本上都会考虑PhpSpreadsheet,但是用过这个库的人都知道,这个库所需要的内存很大,关键是随着文件的增大,所需要的内存不断增大.测试过,导入2M的文exce ...

  8. 下列哪项不是python中对文件的读取操作-Python—文件读写操作

    初识文件操作 使用open()函数打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了,根据打开文件的方式不同能够执行的操作也会有相应的差异. 打开文件的方式: r, w, a, ...

  9. Unity读取json大文件卡顿

    litjson调用ToObject和ToJson的时候,如果文件内容过大(MB级别),会阻塞主线程造成卡顿,可以使用多线程读取,然后Unity这边开协程等待,这样不会对主线程有影响. private ...

最新文章

  1. 从数据中心基础设施的视角来看 Facebook 机器学习的应用
  2. 在RHEL 5中Yum应用大全
  3. 每日一皮:一个难以复现的 bug ...
  4. 做到这23条,你就成熟了!
  5. ActionScript 3.0 Step By Step系列(四):来自面向对象开发之前的呐喊:“学会写可重用的代码”...
  6. Bootstrap 进度条
  7. 基于Android的数据传输wifi,毕业设计之 ---基于Android的文件实时传输系统
  8. 哄女票超简单程序代码(日常小惊喜)
  9. Java如何在一行内输入若干个整数
  10. 360插件化方案RePlugin学习笔记-外置插件
  11. 前端启动本地服务的四种方法,看完不会你锤我
  12. 150款国潮风城市插画
  13. 【多线程】long和double的非原子性协定
  14. 公司企业邮箱附件多大?免费企业邮箱附件有限制吗?
  15. python自动生成word报表之使用win32com插入自带可编辑的图表
  16. 订单中心项目分析与总结
  17. 一个 Spring Boot 面试题
  18. 计算机网络(湖南科技大学)
  19. 正则表达式(一)认识正则表达式
  20. 【接入指南 之 云云接入】快速接入HONOR Connect平台(上)

热门文章

  1. 不与最大数相同的数字之和(信息学奥赛一本通-T1113)
  2. 信息学奥赛C++语言: 跑步
  3. 7 PP配置-生产主数据-工作中心相关-定义工作中心标准值码
  4. windows mobile 服务自动停止_打印服务print Splooer自动停止怎么办?
  5. python io密集型应用案例-Python中单线程、多线程和多进程的效率对比实验实例
  6. PyTorch:Faster-RCNN
  7. Numpy 之 copies and Views
  8. TypeScript接口
  9. java中字符串(1)
  10. Mybatis(13)动态sql语句if/where/foreach