php读取大文件最好的实现方法
<?php header("Content-type:text/html;charset=utf-8"); //读取大文件最后几行数据: $file = 'sss.txt'; /** * 取文件最后$n行 * @param string $filename 文件路径 * @param int $n 最后几行 * @return mixed false表示有错误,成功则返回字符串 */ function FileLastLines($filename, $n) { if (!$fp = fopen($filename, 'r')) { echo "打开文件失败,请检查文件路径是否正确,路径和文件名不要包含中文"; return false; } $pos = -2; $eof = ""; $str = ""; while ($n > 0) { while ($eof != "\n") { if (!fseek($fp, $pos, SEEK_END)) { $eof = fgetc($fp); $pos--; } else { break; } } $str = fgets($fp).$str; $eof = ""; $n--; } return $str; } p(FileLastLines($file, 4)); /** * 取文件最后$n行 * @param string $filename 文件路径 * @param int $n 最后几行 * @return mixed false表示有错误,成功则返回数组,输出顺序自行连接元素 */ function FileLastLines2($filename, $n = 1) { if(!$fp = fopen($filename, 'r')) { return false; } $pos = -2; $eof = ''; $arr = array(); while ($n > 0) { while ($eof != "\n") { if (!fseek($fp, $pos, SEEK_END)) { $eof = fgetc($fp); $pos--; } else { break; } } //是正序则使用array_unshift,倒序使用array_push(但要注意各个元素之间的连接符占用) array_unshift($arr, fgets($fp)); $eof = ''; $n--; } return $arr; } p(FileLastLines2($file, 10)); //该方法不是很灵,在文本以空行结尾的时候比较准确,否则不准,不推荐使用 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, 0, $n); } p(tail(fopen($file, "r+") , 10)); function p($var) { echo '<pre>'; if($var === false) { echo 'false'; }else if($var === null){ print_r("null"); }else if($var === ''){ print_r("''"); }else{ print_r($var); } echo '</pre>'; }
本文地址:http://www.phprm.com/code/64359.html
转载随意,但请附上文章地址:-)