php读取大文件最棒的贯彻格局,PHP落成读取一个

作者: 计算机网络  发布:2019-09-26

 代码如下

须求如下: 现存二个1G左右的日记文件,大约有500多万行, 用php再次回到最终几行的内容。

读取大文件最终几行数据:
/**
 * 取文件最后$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;
}

  1. 直接使用file函数来操作 or file_get_content() 料定报内部存款和储蓄器溢出
    注: 由于 file函数是壹次性将有着剧情读入内部存款和储蓄器,而php为了防止部分写的相比较倒霉的顺序占用太多的内部存款和储蓄器而导致系统内部存储器不足,使服务器出现宕机,所以暗中同意境况下 限制只好最大利用内部存款和储蓄器16M,那是由此php.ini里的memory_limit = 16M来进展安装,这些值假设设置-1,则内部存款和储蓄器使用量不受限制.

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));

上面是一段用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,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

ini_set('memory_limit','-1');
$file = 'access.log';
$data = file($file);
$line = $data[count($data)-1];2.一直调用linux的tail命令来呈现最后几行

在linux命令行下,可以一向动用tail -n 10 access.log很随便的展现日志文件最终几行,能够平素用php来调用tail命令,实践php代码如下.

复制代码 代码如下:

file = 'access.log';
$file = escapeshellarg($file); // 对命令行参数实行安全转义
$line = `tail -n 1 $file`;
echo $line;3. 平昔行使php的fseek来拓宽文件操作

这种格局是最最布满的不二秘籍,它无需将文件的剧情总体读入内部存款和储蓄器,而是一向通过指针来操作,所以效能是分外神速的.在动用fseek来对文本进行操作时,也可以有二种差别的办法,效用大概也是略大有径庭的,上面是常用的两种方法.

方法一: 率先通过fseek找到文件的终极一人EOF,然后找最终一行的苗子地方,取这一行的数额,再找次一行的苗头地点,再取这一行的地方,依次类推,直到找到了$num行。

复制代码 代码如下:

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));

方法二 : 抑或利用fseek的不二秘技从文件最终早先读,但此刻不是一人一个人的读,而是一块一块的读,每读一块数据时,就将读取后的数目放在叁个buf里,然后经过换行符(n)的个数来剖断是不是已经读完最终$num行数据.

完成代码如下

复制代码 代码如下:

$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方法三:

复制代码 代码如下:

$fp = fopen($file, "r");
$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;

你只怕感兴趣的篇章:

  • php得到文件大小和文件成立时间的秘诀
  • php实现批量减去图片文件大小的台本
  • PHP文件大小格式化函数合集
  • php获取文件大小的方法
  • PHP 获取远程文件大小的3种缓和方法
  • 获得远程文件大小的php函数
  • php计算二个文件大小的措施

本文由金沙澳门官网送注册58发布于计算机网络,转载请注明出处:php读取大文件最棒的贯彻格局,PHP落成读取一个

关键词: