您所在位置: 网站首页 / PHP中读取大文件实现方法详解.docx / 文档详情
PHP中读取大文件实现方法详解.docx 立即下载
2025-08-18
约2.7千字
约6页
0
12KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

PHP中读取大文件实现方法详解.docx

PHP中读取大文件实现方法详解.docx

预览

免费试读已结束,剩余 1 页请下载文档后查看

10 金币

下载文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

PHP中读取大文件实现方法详解

读取大文件方法我们一般是一行行来讲取而不是一次性把文件全部写入内存中了,这样会导致php程序卡死,下面小编给大家介绍PHP中读取大文件实现方法,欢迎阅读!需求如下:现有一个1G左右的日志文件,大约有500多万行,用php返回最后几行的内容。实现方法:直接采用file函数来操作注:由于file函数是一次性将所有内容读入内存,而php为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的memory_limit=16M来进行设置,这个值如果设置-1,则内存使用量不受限制.下面是一段用file来取出这具文件最后一行的代码.整个代码执行完成耗时116.9613(s).代码如下ini_set('memory_limit','-1');$file='access.log';$data=file($file);$line=$data[count($data)-1];echo$line;我机器是2个G的内存,当按下F5运行时,系统直接变灰,差不多20分钟后才恢复过来,可见将这么大的文件全部直接读入内存,后果是多少严重,所以不在万不得以,memory_limit这东西不能调得太高,否则只有打电话给机房,让reset机器了.2.直接调用linux的tail命令来显示最后几行在linux命令行下,可以直接使用tail-n10access.log很轻易的显示日志文件最后几行,可以直接用php来调用tail命令,执行php代码如下.整个代码执行完成耗时0.0034(s)代码如下file='access.log';$file=escapeshellarg($file);//对命令行参数进行安全转义$line=`tail-n1$file`;echo$line;3.直接使用php的fseek来进行文件操作这种方式是最为普遍的方式,它不需要将文件的内容全部读入内存,而是直接通过指针来操作,所以效率是相当高效的.在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法.方法一:首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置,再取这一行的位置,依次类推,直到找到了$num行。整个代码执行完成耗时0.0095(s)代码如下functiontail($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));}}returnarray_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--;}$t="";$data.=fgets($fp);$line--;}fclose($fp);echo$data方法三:整个代码执行完成耗时0.0003(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)?$ch
查看更多
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

PHP中读取大文件实现方法详解

文档大小:12KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用