PHP读取大文件的多种方法介绍__第1页
PHP读取大文件的多种方法介绍__第2页
PHP读取大文件的多种方法介绍__第3页
PHP读取大文件的多种方法介绍__第4页
PHP读取大文件的多种方法介绍__第5页
免费预览已结束,剩余3页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PHP读取大文件的多种方法介绍_ 读取大文件始终是一个头痛的问题,我们像用法php开发读取小文件可以挺直用法各种函数实现,但一到大文章就会发觉常用的方法是无法正常用法或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决方法,盼望例子能关心到各位。 在PHP中,对于文件的读取时,最快捷的方式莫过于用法一些诸如file、file_get_contents之类的函数,简简洁单的几行代码就能 很美丽的完成我们所需要的功能。但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。 需求: 有一个800M的日志文件,大约

2、有500多万行, 用PHP返回最终几行的内容。 实现方法: 1. 挺直采纳file函数来操作 由于 file函数是一次性将全部内容读入内存,而PHP为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器消失宕机,所以默认状况下限制只能最大用法内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值假如设置-1,则内存用法量不受限制。 下面是一段用file来取出这具文件最终一行的代码: ?php ini_set(memory_limit, -1); $file = access.log; $data = file($file); $lin

3、e = $datacount($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代码如下:

4、?php $file = access.log; $file = escapeshellarg($file); / 对指令行参数进行平安转义 $line = tail -n 1 $file; echo $line; ? 整个代码执行完成耗时 0.0034 (s) 3. 挺直用法PHP的 fseek 来进行文件操作 这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,而是挺直通过指针来操作,所以效率是相当高效的。在用法fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法: 方法一 首先通过fseek找到文件的最终一位EOF,然后找最终一行的起始位

5、置,取这一行的数据,再找次一行的起始位置, 再取这一行的位置,依次类推,直到找到了$num行。 实现代码如下: ?php $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) 方法二 还是采纳

6、fseek的方式从文件最终开头读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换 行符(n)的个数来推断是否已经读完最终$num行数据。 实现代码如下: ?php $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 += $chu

7、nk) $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 = $match0; break; fclose($fp); echo $data;

8、 ? 整个代码执行完成耗时 0.0009(s)。 方法三 ?php 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) 方法四,PHP的stream_get_line函数 ,读取快速,读取50万条数据大文件,也许需要20秒左右的时间!例子代码如下: $fp = fopen(./iis.log, r); /文件 while (!feof(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论