PHP 读取大文件

最近在工作中遇到了需要读取系统日志的问题,日志文件很大,大概在1G以上甚至更大,随即研究了读取得方法,直接使用PHP自带的函数就可以解决这几个问 题,但是绝对不能使用file和file_get_contents,这两个函数是一次性将文件全部加载进来,如果文件在几十M 还是可以的,但是稍大的文件时不能用的,内存是会溢出的 ,贴个自己的方法,欢迎大家指教!

Java代码  

  1. <?  
  2. /** 
  3. * PHP 读取大文件 测试文件大于1G的文本文件 
  4. * @copyright(c) 2010 by 高成. All rights reserved 
  5. * @author 高成 
  6. */  
  7. /** 
  8. * 文件读取 
  9. * @param String $filename 文件地址 
  10. * @param Int $count 读取得行数 
  11. * @param String $sep 每行的分隔标记 
  12. * @return String 返回结果 
  13. */  
  14. function readBigFile($filename, $count = 20, $tag = '\r\n') {  
  15.     $content = '';//最终内容  
  16.     $_current = '';//当前读取内容寄存  
  17.     $step= 1;//每次走多少字符  
  18.     $tagLen = strlen($tag);  
  19.     $start = 0;//起始位置  
  20.     $i = 0;//计数器  
  21.     $handle = fopen($filename,'r+');//读写模式打开文件,指针指向文件头  
  22.     while($i < $count && !feof($handle)) {    //文件没有到结尾和小鱼需要读取得行数时  
  23.         fseek($handle, $start, SEEK_SET);//指针设置在文件开头  
  24.         $_current = fread($handle,$step);//读取文件  
  25.         $content .= $_current;//组合字符串  
  26.         $start += $step;//依据步长向前移动  
  27.         //依据分隔符的长度截取字符串最后免得几个字符  
  28.         $substrTag = substr($content, -$tagLen);  
  29.         if ($substrTag == $tag) {    //判断是否为判断是否是换行或其他分隔符  
  30.             $i++;  
  31.         }  
  32.     }  
  33.     //关闭文件  
  34.     fclose($handle);  
  35.     //返回结果  
  36.     return $content;  
  37. }  
  38. $filename = 'E:/2010log.log';//需要读取的文件  
  39. $tag = '\r\n';//行分隔符 注意这里必须用双引号  
  40. $count = 20;//读取行数  
  41. $data = readBigFile($filename,$count,$tag);  
  42. echo $data;  
  43. ?>  
时间: 2024-10-10 06:29:06

PHP 读取大文件的相关文章

PHP如何快速读取大文件

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

java读取大文件简单实例

 这篇文章主要介绍了java读取大文件简单实例,有需要的朋友可以参考一下 我要从一个文本文件中提有用的数据  文本文件200多MB  是不是可以建一个缓存来把有用的数据一段一段的提出来,请问该怎么做?    JAVA中可以使用内存映射文件来操作大文件.  最大可达2GB.  下面是个简单的示例,更具体的自己看Java API DOCS或相关资料      代码如下: import java.io.*;  import java.nio.*;  import java.nio.channels.*

PHP几个快速读取大文件例子

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

php读取大文件最好的实现方法

  php读取大文件方法我们一般是一行行来讲取而不是一次性把文件全部写入内存中了,这样会导致php程序卡死,下面给大家整理一个例子.  代码如下   读取大文件最后几行数据: /**  * 取文件最后$n行  * @param string $filename 文件路径  * @param int $n 最后几行  * @return mixed false表示有错误,成功则返回字符串  */ function FileLastLines($filename,$n){     if(!$fp=f

php 使用file_get_contents读取大文件的方法_php技巧

当我们遇到文本文件体积很大时,比如超过几十M甚至几百M几G的大文件,用记事本或者其它编辑器打开往往不能成功,因为他们都需要把文件内容全部放到内存里面,这时就会发生内存溢出而打开错误,遇到这种情况我们可以使用PHP的文件读取函数file_get_contents()进行分段读取. 函数说明 string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset

java 通过apache ftp读取大文件或者下载大文件

问题描述 java 通过apache ftp读取大文件或者下载大文件 本人技术短,参照网上各位大侠的帖子写了登录ftp去读取ftp下面文件然后直接存进数据库的代码 ,但是我的代码只能读取一些小的文件,文件大点就报内存溢出.谁可以给个能在ftp上面下载大文件或者能够直接读取ftp服务器上面的大文件然后直接解析存进数据库的代码例子.不胜感激. 解决方案 内存溢出..说明内存方步下文件..ftp取到liu后写入文件吧...ps都内存溢出了..你不可能在内存中解析的..有可能是你jvm内存设置太小所致.

内存映射-读取大文件时遇到的问题

问题描述 读取大文件时遇到的问题 用readfile()函数也好,用内存映射的方式也好,怎么读取的数据都只是文件第一行?其他的都读取不到?不知道错在哪里,谢谢您的回答! 解决方案 应该要遍历去读取吧?不知道你怎么在弄... 解决方案二: 你可能只指定了第一行,没有遍历去指定行.把代码贴出来看看 解决方案三: 你是不是用了strtok. 它会把原字符串的分隔符替换成/0

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

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

php使用file函数、fseek函数读取大文件效率对比分析_php技巧

php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接采用file函数来操作 由于 file函数是一次性将所有内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,