background image

PHP 代码:php 读取操作大文件进行实现代码

在 php 中,对于文件的读取时,最快捷的方式莫过于使用一些诸如 file、

file_get_contents

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

file_get_contents

之类的函数,简简单单的几行代码就能很漂亮的完成我们所需要的功能。但当所操作的文
件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明

 

对于读取大文件时,常用的操作方法。

 

需求
 
有一个 800M 的日志文件,大约有 500

 

多万行, 用 php

 

返回最后几行的内容。

 

 

实现方法
 
1. 直接采用 file

 

函数来操作

 

 

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

 

整个代码执行完成耗时 116.9613 (s). 
代码如下:
 

$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