`
webcode
  • 浏览: 5946468 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

PHP对大文件的处理思路

 
阅读更多

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

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

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

下面是一段用file来取出这具文件最后一行的代码。代码执行大概2分钟左右。

view sourceprint?
01 $fp = fopen($file, "r");

02 $num = 10;

03 $chunk = 4096;

04 $fs = sprintf("%u", filesize($file));

05 $max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);

06 for ($len = 0; $len < $max; $len += $chunk) {

07 $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len;

08 fseek($fp, ($len + $seekSize) * -1, SEEK_END);

09 $readData = fread($fp, $seekSize) . $readData;

10

11 if (substr_count($readData, "\n") >= $num + 1) {

12 preg_match("!(.*?\n){".($num)."}$!", $readData, $match);

13 $data = $match[0];

14 break;

15 }

16 }

17 fclose($fp);

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

2.直接调用linux的tail命令来显示最后几行
在linux命令行下,可以直接使用tail -n 10 access.log很轻易的显示日志文件最后几行,可以直接用php来调用tail命令,执行php代码如下.整个代码执行完成耗时 0.0034 (s)

view sourceprint?
1 file = 'access.log';

2 $file = escapeshellarg($file); // 对命令行参数进行安全转义

3 $line = `tail -n 1 $file`;

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

方法一:

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

view sourceprint?
01 function tail($fp,$n,$base=5)

02 {

03 assert($n>0);

04 $pos = $n+1;

05 $lines = array();

06 while(count($lines)< =$n){

07 try{

08 fseek($fp,-$pos,SEEK_END);

09 } catch (Exception $e){

10 fseek(0);

11 break;

12 }

13 $pos *= $base;

14 while(!feof($fp)){

15 array_unshift($lines,fgets($fp));

16 }

17 }

18 return array_slice($lines,0,$n);

19 }

20 var_dump(tail(fopen("access.log","r+"),10));
方法二:

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

view sourceprint?
01 $fp = fopen($file, "r");

02 $line = 10;

03 $pos = -2;

04 $t = " ";

05 $data = "";

06 while ($line > 0) {

07 while ($t != "\n") {

08 fseek($fp, $pos, SEEK_END);

09 $t = fgetc($fp);

10 $pos --;

11 }

12 $t = " ";

13 $data .= fgets($fp);

14 $line --;

15 }

16 fclose ($fp);

17 echo $data
方法三:

view sourceprint?
1 ini_set('memory_limit','-1');

2 $file = 'access.log';

3 $data = file($file);

4 $line = $data[count($data)-1];

5 echo $line;

分享到:
评论

相关推荐

    php下使用SimpleXML 处理XML 文件

    1 SimpleXML 简介 要处理XML 文件,有两种传统的处理思路:SAX 和DOM。SAX 基于事件触发机制, 对XML 文件进行一次扫描,完成要进行的处理;DOM 则将整个XML 文件构造为一棵DOM 树,通过对DOM 树的遍历完成处理。这...

    php文件上传、下载和删除示例

    php文件上传、下载和删除示例大体思路如下,具体内容如下 一.文件上传 1.把上传文件的区域做出来 div1 2.把显示文件的区域做出来 div2 3.提交表单,上传文件 4.服务器接收文件数据 用$_FILE[name]接收 5...

    PHP7从入门到精通.zip

    全书共23章,分别介绍了PHP 7的基本概念、PHP服务器环境配置、PHP的基本语法、PHP的语言结构、字符串和正则表达式、数组、时间和日期、面向对象编程、错误处理和异常处理、PHP与Web页面交互、文件与目录操作、图形...

    PHP+MySQL动态网站开发.rar

    全书共21章,分别介绍了PHP 7的基本概念、PHP服务器环境配置、PHP的基本语法、PHP的语言结构、字符串和正则表达式、数组、时间和日期、面向对象、错误处理和异常处理、PHP与Web页面交互、文件与目录操作、图形图像...

    PHP动态网站开发

    主要内容包括:配置php开发环境、php语言基础、数组与函数、字符串与正则表达式、构建php互动网页、php文件编程、php图像处理、mysql数据库管理、php数据库编程、会员管理系统设计。本书结构合理、论述准确、内容...

    MyQEE开源PHP多项目及模块化开发框架 v3.0 RC1.rar

    MyQEE PHP Framework 是基于PHP5开发的完美...文件缓存保存数据错误,文件处理类完善 完善了MySQL类库对编码的转换处理 完善了MongoDB的查询功能,完善了debug的显示 优化了Bootstrap中对debug的处理 优化了内部调用

    php项目-基于PHP实现的WEB图片共享系统(源代码+论文).rar

    2. 图片上传与存储:采用先进的图片处理技术,支持多文件上传和大文件处理,确保图片的清晰度和质量。 3. 图片预览与下载:提供原图预览和多种尺寸下载选项,满足用户的多样化需求。 4. 图片搜索与分类:通过关键词...

    浅谈php调用python文件

    以前小组开展项目实训,我们小组选择的是大数据分析,其中有一个用python进行文本分析之后对用户输入的数据进行分析,然后输出对应的岗位及其他。要求是前端将文本要求传到后台php,php调用python程序处理,再将数据...

    Connect_PHP_SDK_for_OAuth2_V1.2_new

    代码结构采用api对应的目录,每个api对应相同文件名的PHP文件。代码中涉及到POST操作的部分,分为前后台,通过&lt;?php if(isset($_POST)&&!empty($_POST)){ //这部分是POST处理的部分 //重点看这部分 //参数处理...

    一个用php3编写的简单计数器

    总体思路: 把以往的访问人数记录在一个文本文件中,当网页被访问的时候,从打开该文件 并从中读出以往的访问人数,加 1,得到最新的访问人数,并把该数目格式化成 标准的格式,再调用图像处理函数,把该数字...

    php实现mysql备份恢复分卷处理的方法

    分卷处理就是把握们要处理的数据分成一个个小文件进行处理了,这里我来给大家介绍一个php mysql备份恢复分卷处理类,实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入. 分卷导入类及思路详解 ...

    yii2.0整合阿里云oss删除单个文件的方法

    主要思路,在controller里边通过获得要删除的文件fileid,把fileid传递给model的deletefile方法进行处理,并返回处理结果。 在deletefile方法里边,先根据id找到对应的文件信息,然后删除数据里边的记录和阿里云oss...

    星外提权工具

    如果已经是最新版本的一流(2011-2-19)就不需要处理,如果是旧版本的,要先删除这两个文件,然后再升级一流.正常情况下,这两个文件只有everyone读写的权限(没有运行) 其他有可能提示的文件: 文件:C:\WINDOWS\Temp\...

    代码审计:企业级Web代码安全架构

    第4~6章则介绍常见漏洞的审计方法,分别对应基础篇、进阶篇以及深入篇,涵盖SQL注入漏洞、XSS漏洞、文件操作漏洞、代码/命令执行漏洞、变量覆盖漏洞以及逻辑处理等漏洞;第7章介绍二次漏洞的挖掘方法;第8章介绍...

    代码审计 企业级Web代码安全架构

    第4~6章则介绍常见漏洞的审计方法,分别对应基础篇、进阶篇以及深入篇,涵盖SQL注入漏洞、XSS漏洞、文件操作漏洞、代码/命令执行漏洞、变量覆盖漏洞以及逻辑处理等漏洞;第7章介绍二次漏洞的挖掘方法;第8章介绍...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    Pluto1_9_9_2.rar

    脚本文件.vsp对多种模板和空置模板的判断,以及对VideoPlay模板的调用。 增加了作者页,启动时www目录不在默认程序下的判断和提示窗口。 V1.9.9.2(2020-5-24) 调整了辅助文件,修改了初始化信息,主要是匿名处理...

    EaglePHP框架1.9

    EaglePHP,是一款开源、高效、面向对象的PHP MVC开发框架,完全基于PHP5可用于开发WEB程序和服务,借鉴国外优秀框架的设计思路,分层的设计思想使独立开发成为可能,建立模型推动代码的重用,有助于促进快速软件开发...

    PHP 图像处理与SESSION制作超简单验证码的方法示例

    本文实例讲述了PHP 图像处理与SESSION制作超简单验证码的方法。分享给大家供大家参考,具体如下: 验证码的实现 首先我们要清楚,无论是做什么东西,在做之前一定要有思路,譬如这个验证码里他有些什么,为了实现它...

Global site tag (gtag.js) - Google Analytics