php讀取大文件最好的實現(xiàn)方法

字號:


    php讀取大文件方法我們一般是一行行來講取而不是一次性把文件全部寫入內(nèi)存中了,這樣會導(dǎo)致php程序卡死,下面給大家整理一個例子。
    代碼如下:
    讀取大文件最后幾行數(shù)據(jù):
    /**
    * 取文件最后$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);
    $eof=”";
    $n–;
    }
    return $str;
    }
    echo nl2br(FileLastLines(‘sss.txt’,4));
    /** * 取文件最后$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); $eof=""; $n--; } return $str; } echo nl2br(FileLastLines('sss.txt',4));
    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);
    }
    var_dump(tail(fopen("access.log","r+"),10));
    $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