PHP实现读取一个1G的文件大小


Posted in PHP onAugust 24, 2013

需求如下: 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容。

1. 直接采用file函数来操作 or file_get_content() 肯定报内存溢出
注: 由于 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];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;3. 直接使用php的fseek来进行文件操作

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

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

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));

方法二 :
还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换行符(\n)的个数来判断是否已经读完最后$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方法三:
$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 > $chunk) ? $chunk : $max - $len;
    fseek($fp, ($len + $seekSize) * -1, SEEK_END);
    $readData = fread($fp, $seekSize) . $readData;    if (substr_count($readData, "\n") >= $num + 1) {
        preg_match("!(.*?\n){".($num)."}$!", $readData, $match);
        $data = $match[0];
        break;
    }
}
fclose($fp);
echo $data;
PHP 相关文章推荐
php+AJAX传送中文会导致乱码的问题的解决方法
Sep 08 PHP
PHP 遍历文件实现代码
May 04 PHP
php导入导出excel实例
Oct 25 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
CI框架简单邮件发送类实例
May 18 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
Nov 02 PHP
php微信公众平台示例代码分析(二)
Dec 06 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
php精度计算的问题解析
Jun 21 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
Feb 22 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 #PHP
PHP如何利用P3P实现跨域
Aug 24 #PHP
PHP引用符&amp;的用法详细解析
Aug 22 #PHP
新手菜鸟必读:session与cookie的区别
Aug 22 #PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 #PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 #PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 #PHP
You might like
一次编写,随处运行
2006/10/09 PHP
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
Dedecms常用函数解析
2008/02/01 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
jQuery入门知识简介
2010/03/04 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
了解在JavaScript中将值转换为字符串的5种方法
2019/06/06 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
Python中的tuple元组详细介绍
2015/02/02 Python
Python装饰器用法实例总结
2018/05/26 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
美国渔具店:FishUSA
2019/08/07 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
表扬信格式
2014/01/12 职场文书
教师师德反思材料
2014/02/15 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
一份文言文检讨书
2014/09/13 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang