background image

PHP 代码:PHP 读取大文件的 行到 行内容的实现

代码

需要读取一个文件的几行内容,但是文件比较大,所以研究了下 php 读取大文件的几行
内容的方法,写了一个方法,代码如下
需要读取一个文件的几行内容,但是文件比较大,所以研究了下 php 读取大文件的几行
内容的方法,写了一个方法,代码如下(加了注释)  

缓存文件如果能够保存在一行, 而利用算法读取指定的行数, 自然会比全部读出来挑选要
快得多. 但 php 似乎这方面比较弱, 不太好操作. 就算使用 SplFileObject 仍然不是特别可取, 
内存压力存在. 
 
代码如下:

$fp

->seek(

$startLine

 - 1); 

 
经过测试, 此行代码在 8MB 文本中游走到最后一行, 内存占用为 49KB, 还算不错. 换成

fopen

方式用

fgets

跳过的模式, 则花费 29KB 的内存, 

fopen

还是占优势. 

 代码如下:

function

 getFileLines(

$filename

$startLine

 = 1, 

$endLine

 = 50, 

$method

 = 'rb'){ 

$content

 = 

array

(); 

 

if

 (version_compare(PHP_VERSION, '5.1.0', '>=')) { 

// 判断 php 版本(因为要用到

SplFileObject,PHP>=5.1.0

 

$count

 = 

$endLine

 - 

$startLine

$fp

 = 

new

 SplFileObject(

$filename

$method

); 

$fp

->seek(

$startLine

 - 1); 

// 转到第 N 行, seek 方法参数从 0

 

开始计数

for

 (

$i

 = 0; 

$i

 <= 

$count

; ++

$i

) { 

$content

[] = 

$fp

->current(); 

// current()

 

获取当前行内容

$fp

->next(); 

// 

 

下一行


else

 { 

//PHP<5.1 

$fp

 = 

fopen

(

$filename

$method

); 

if

 (!

$fp

return

 'error:can not read file'; 

for

 (

$i

 = 1; 

$i

 < 

$startLine

; ++

$i

) { 

// 跳过前$startLine