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


Posted in PHP onOctober 27, 2016

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

场景:PHP读取超大文件,例如1G的日志文件,我这里使用的是400M的access.log文件

1、使用file直接读取

<?php
$starttime=microtime_float();
 
ini_set('memory_limit', '-1');
$file = 'testfile.txt';
 
$data = file($file);
$line = $data[count($data) - 1000];
$endtime=microtime_float();
 
echo count($data),"<br/>";
echo $endtime-$starttime;
 
function microtime_float(){
 list($usec, $sec) = explode(" ", microtime());
 return ((float)$usec + (float)$sec);
}
?>

运行结果:10127784 行   共使用了,7.8764359951s

我的电脑是3G内存,此方法不是推荐使用,因为需要把文件全部载入内存

2、使用linux命令  tail

<?php
 
$starttime=microtime_float();
 
$file = 'testfile.txt';
$file = escapeshellarg($file); // 对命令行参数进行安全转义
$line = `tail -n 100 $file`;
 
echo $line,"<br/>";
 
$endtime=microtime_float();
echo $endtime-$starttime;
 
function microtime_float(){
 list($usec, $sec) = explode(" ", microtime());
 return ((float)$usec + (float)$sec);
}
 
//end

运行结果:只使用了几毫秒、轻松搞定、这种方法不能在windows下使用

3、使用fseek函数

这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,因为PHP是C写的,所以实现的时候也类似C读取文件,通过指针的移动,所以效率是相当高效的。在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,

下面是常用的几种方法

方法一:使用fopen打开文件(从文件指针资源句柄)

<?php
$starttime=microtime_float();
 
$file = 'testfile.txt';
$fp = fopen($file, "r+");
 
$line = 100;
$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,"<br/>";
$endtime=microtime_float();
 
echo $endtime-$starttime;
 
function microtime_float(){
 list($usec, $sec) = explode(" ", microtime());
 return ((float)$usec + (float)$sec);
}
?>

运行结果:0.338493108749

方法二:一块一块的读取

<?php
$starttime=microtime_float();
 
$file = 'testfile.txt';
$fp = fopen($file, "r");
$num = 10;
$chunk = 4096;//4K的块
$fs = sprintf("%u", filesize($file));
$readData='';
$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : $fs;
 
for($len = 0; $len < $max; $len += $chunk){
 
 $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;
 fseek($fp, ($len + $seekSize) * -1, SEEK_END);
 $readData = fread($fp, $seekSize) . $readData;
 
if (substr_count($readData, "\n") >= $num + 1) {
 
 $ns=substr_count($readData, "\n")-$num+2;
 preg_match('/(.*?\n){'.$ns.'}/',$readData,$match);
 $data = $match[1];
 break;
}
}
fclose($fp);
echo $data,"<br/>";
 
 
$endtime=microtime_float();
 
echo $endtime-$starttime;
 
function microtime_float(){
 list($usec, $sec) = explode(" ", microtime());
 return ((float)$usec + (float)$sec);
}
?>

运行时间:0.00199198722839

使用fgets函数,一行一行读取

<?php
$file = fopen("testfile.txt","r");
 while(!feof($file))
 {
   echo fgets($file);
 }
 fclose($file);

spl库函数

<?php
try{
  foreach( new SplFileObject('testfile.txt') as $line)
  echo $line.'<br />';
}catch (Exception $e){
  echo $e->getMessage();
}

另外网上有很多按照块读取文件的,有兴趣的读者可以试试,我试了没成功,好像必须含有换行符“\n”才可以。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
php框架Phpbean说明
Jan 10 PHP
php HandlerSocket的使用
May 02 PHP
PHP的可变变量名的使用方法分享
Feb 05 PHP
探讨php define()函数及defined()函数使用详解
Jun 09 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
ThinkPHP框架里隐藏index.php
Apr 12 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
PHP实现微信提现功能(微信商城)
Nov 21 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 #PHP
PHP中的密码加密的解决方案总结
Oct 26 #PHP
php 解析xml 的四种方法详细介绍
Oct 26 #PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 #PHP
php 生成签名及验证签名详解
Oct 26 #PHP
PHP XML和数组互相转换详解
Oct 26 #PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 #PHP
You might like
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
2017/04/04 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
jQuery的三种$()
2009/12/30 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
Python中实现的RC4算法
2015/02/14 Python
python实现二维插值的三维显示
2018/12/17 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
python批量修改文件名的示例
2020/09/27 Python
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
材料成型专业个人求职信范文
2013/09/25 职场文书
饭店工作计划书
2014/01/10 职场文书
个人求职信范例
2014/01/29 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
大学生标准自荐书
2014/06/15 职场文书
机动车登记业务委托书
2014/10/08 职场文书
党员个人整改措施
2014/10/24 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
求职自我评价怎么写
2015/03/09 职场文书
新闻稿件写作范文
2015/07/18 职场文书
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python