PHP 代码:PHP 读取大文件的 X 行到 Y 行内容的实现
代码
需要读取一个文件的几行内容,但是文件比较大,所以研究了下 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
行