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
;