PHP实现读取一个1G的文件大小
|
需求如下: 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容。 注: 由于 file函数是一次性将所有内容读入内存,而php为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下 限制只能最大使用内存16M,这是通过php.ini里的memory_limit = 16M来进行设置,这个值如果设置-1,则内存使用量不受限制. 下面是一段用file来取出这具文件最后一行的代码. 代码如下: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,$n); } var_dump(tail(fopen("access.log","r+"),10)); 还是采用fseek的方式从文件最后开始读,但这时不是一位一位的读,而是一块一块的读,每读一块数据时,就将读取后的数据放在一个buf里,然后通过换行符(n)的个数来判断是否已经读完最后$num行数据. 实现代码如下 $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; if (substr_count($readData,"n") >= $num + 1) { preg_match("!(.*?n){".($num)."}$!",$readData,$match); $data = $match[0]; break; } } fclose($fp); echo $data; (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
