数码资讯
PHP读取大文件的几种方法
读取大文件总是让人头疼的,我们喜欢用php开发读取文件,可以直接使用各种函数,但对一篇大文章会发现常用的方法是不正常使用或长时间使用的卡,下面我们来看看一个php读取大文件的解决方案,希望对大家有帮助的例子。 场景:PHP读取大型文件,如1G的日志文件,我这里使用的是400m的access.log文
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
读取大文件总是让人头疼的,我们喜欢用php开发读取文件,可以直接使用各种函数,但对一篇大文章会发现常用的方法是不正常使用或长时间使用的卡,下面我们来看看一个php读取大文件的解决方案,希望对大家有帮助的例子。
场景:PHP读取大型文件,如1G的日志文件,我这里使用的是400m的access.log文件
1。文件直接读取
< PHP
StartTime = microtime_float(美元);
ini_set('memory_limit ',' 1 ');
文件大小= 'testfile .txt;
数据=文件($文件);
$ = $数据{计数($数据)- 1000 };
结果= microtime_float(美元);
回声计数(数据),;
echo $结束时间至开始时间;
功能microtime_float(){
列表(USEC美元美元,SEC)=爆炸(
返回((浮动)$ USEC +(浮动)$秒);
}
>
运行结果:使用10127784线,7.8764359951s
我的计算机是3G内存,这种方法不推荐,因为所有的文件都需要加载到内存中。
2。使用Linux命令尾
< PHP
StartTime = microtime_float(美元);
文件大小= 'testfile .txt;
文件大小= escapeshellarg(文件); / /安全撤离的命令行参数
$行=尾n 100 $文件;
$,;
结果= microtime_float(美元);
echo $结束时间至开始时间;
功能microtime_float(){
列表(USEC美元美元,SEC)=爆炸(
返回((浮动)$ USEC +(浮动)$秒);
}
结束
运行结果:只需几毫秒,很容易做到,这种方法不能在windows下使用。
三.使用fseek函数
这是最流行的方式。它不需要阅读所有文件的内容的内容,因为PHP是用C写的,所以当它实现了,它也像C读取文件,通过移动指针,这样的效率是很有效的。还有当使用fseek操作文件的许多不同的方法,和效率可能略有不同。
下面是几种常用的方法
方法一:用fopen打开文件(从文件指针资源句柄)
< PHP
StartTime = microtime_float(美元);
文件大小= 'testfile .txt;
$ FP = fopen(文件,R);
$ = 100;
$ = 2;
$ $ =;
当($行> 0)
{
虽然(美元)!= ) / /换行
{
fseek(fp美元美元,POS,seek_end); / /指针
$ T =指针($ FP); / /得到一个字符
$
}
= $ ;
$data = fgets($ FP); / /得到的数据在当前行
一行--;
}
Fclose($ FP);
,;
结果= microtime_float(美元);
echo $结束时间至开始时间;
功能microtime_float(){
列表(USEC美元美元,SEC)=爆炸(
返回((浮动)$ USEC +(浮动)$秒);
}
>
手术结果:0.338493108749
方法二:一读
< PHP
StartTime = microtime_float(美元);
文件大小= 'testfile .txt;
$ FP = fopen(文件,R);
$ = 10;
$块= 4096;一个块
FS = sprintf($ % U
readdata美元=;
为最大值=(intval($ FS)= = php_int_max)php_int_max:$ FS;
为($ = 0;
seeksize美元=(最大长度>美元美元美元美元美元一块):最大至len;
fseek($ FP,(($ len + $ seeksize)* 1,seek_end);
readdata美元= fread($ FP,seeksize美元)。readdata美元;
如果(substr_count($ readdata,> > $ = 1){
NS = substr_count美元(美元readdata,$+ 2;
(preg_match / (*。){,} $纳秒。' / ',readdata美元,$匹配);
$ =匹配{ 1 };
打破;
}
}
Fclose($ FP);
,;
结果= microtime_float(美元);
echo $结束时间至开始时间;
功能microtime_float(){
列表(USEC美元美元,SEC)=爆炸(
返回((浮动)$ USEC +(浮动)$秒);
}
>
运行时间:0.00199198722839
以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。
场景:PHP读取大型文件,如1G的日志文件,我这里使用的是400m的access.log文件
1。文件直接读取
< PHP
StartTime = microtime_float(美元);
ini_set('memory_limit ',' 1 ');
文件大小= 'testfile .txt;
数据=文件($文件);
$ = $数据{计数($数据)- 1000 };
结果= microtime_float(美元);
回声计数(数据),;
echo $结束时间至开始时间;
功能microtime_float(){
列表(USEC美元美元,SEC)=爆炸(
返回((浮动)$ USEC +(浮动)$秒);
}
>
运行结果:使用10127784线,7.8764359951s
我的计算机是3G内存,这种方法不推荐,因为所有的文件都需要加载到内存中。
2。使用Linux命令尾
< PHP
StartTime = microtime_float(美元);
文件大小= 'testfile .txt;
文件大小= escapeshellarg(文件); / /安全撤离的命令行参数
$行=尾n 100 $文件;
$,;
结果= microtime_float(美元);
echo $结束时间至开始时间;
功能microtime_float(){
列表(USEC美元美元,SEC)=爆炸(
返回((浮动)$ USEC +(浮动)$秒);
}
结束
运行结果:只需几毫秒,很容易做到,这种方法不能在windows下使用。
三.使用fseek函数
这是最流行的方式。它不需要阅读所有文件的内容的内容,因为PHP是用C写的,所以当它实现了,它也像C读取文件,通过移动指针,这样的效率是很有效的。还有当使用fseek操作文件的许多不同的方法,和效率可能略有不同。
下面是几种常用的方法
方法一:用fopen打开文件(从文件指针资源句柄)
< PHP
StartTime = microtime_float(美元);
文件大小= 'testfile .txt;
$ FP = fopen(文件,R);
$ = 100;
$ = 2;
$ $ =;
当($行> 0)
{
虽然(美元)!= ) / /换行
{
fseek(fp美元美元,POS,seek_end); / /指针
$ T =指针($ FP); / /得到一个字符
$
}
= $ ;
$data = fgets($ FP); / /得到的数据在当前行
一行--;
}
Fclose($ FP);
,;
结果= microtime_float(美元);
echo $结束时间至开始时间;
功能microtime_float(){
列表(USEC美元美元,SEC)=爆炸(
返回((浮动)$ USEC +(浮动)$秒);
}
>
手术结果:0.338493108749
方法二:一读
< PHP
StartTime = microtime_float(美元);
文件大小= 'testfile .txt;
$ FP = fopen(文件,R);
$ = 10;
$块= 4096;一个块
FS = sprintf($ % U
readdata美元=;
为最大值=(intval($ FS)= = php_int_max)php_int_max:$ FS;
为($ = 0;
seeksize美元=(最大长度>美元美元美元美元美元一块):最大至len;
fseek($ FP,(($ len + $ seeksize)* 1,seek_end);
readdata美元= fread($ FP,seeksize美元)。readdata美元;
如果(substr_count($ readdata,> > $ = 1){
NS = substr_count美元(美元readdata,$+ 2;
(preg_match / (*。){,} $纳秒。' / ',readdata美元,$匹配);
$ =匹配{ 1 };
打破;
}
}
Fclose($ FP);
,;
结果= microtime_float(美元);
echo $结束时间至开始时间;
功能microtime_float(){
列表(USEC美元美元,SEC)=爆炸(
返回((浮动)$ USEC +(浮动)$秒);
}
>
运行时间:0.00199198722839
以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。