首页 > php代码 > php读取大文件最好的实现方法

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

转载随意,但请附上文章地址:-)

标签:catch fopen

相关文章

发表留言