php fseek實現函數讀取大檔案的兩種方法

來源:互聯網
上載者:User
php中讀取檔案非常簡單,但如果讀取的檔案非常大,改如何解決呢?我們可以直接使用fseek來進行大檔案操作,本文章向大家介紹php使用fseek函數讀取大檔案,需要的朋友可以參考一下

php讀取大檔案,使用fseek函數是最為普遍的方式,它不需要將檔案的內容全部讀入記憶體,而是直接通過指標來操作,所以效率是相當高效的.在使用fseek來對檔案進行操作時,也有多種不同的方法,效率可能也是略有差別的,下面是常用的兩種方法.

方法一:

首先通過fseek找到檔案的最後一位EOF,然後找最後一行的起始位置,取這一行的資料,再找次一行的起始位置,再取這一行的位置,依次類推,直到找到了$num行。實現代碼如下:

整個代碼執行完成耗時 0.0095 (s)

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行資料.實現代碼如下

整個代碼執行完成耗時 0.0009(s).

$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

總結:以上就是本篇文的全部內容,希望能對大家的學習有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.