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
转载随意,但请附上文章地址:-)