background image

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)); 

 

 

方法二
还是采用

fseek

的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每

读一块数据时,就将读取后的数据放在一个 buf 里,然后通过换行符(\n)的个数来判断是否已
经读完最后

$num

行数据. 

 

实现代码如下

 

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

$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

 --;