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