Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara yang cekap untuk membaca n baris pada penghujung fail besar dalam php

Cara yang cekap untuk membaca n baris pada penghujung fail besar dalam php

藏色散人
藏色散人asal
2021-07-23 09:23:332412semak imbas

Cara membaca n baris di hujung fail besar dalam PHP: mula-mula gerakkan penunjuk ke hujung dan kembali 2 kedudukan kemudian baca aksara melalui fgetc dan akhirnya gunakan fgets terus ke; tukar aksara Hanya keluarkan seluruh baris.

Cara yang cekap untuk membaca n baris pada penghujung fail besar dalam php

Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.1, komputer DELL G3

php membaca n baris di penghujung fail besar Kaedah cekap

dikongsi dengan semua orang di bawah, dan juga berfungsi sebagai rujukan untuk semua orang.

Untuk fail kecil dalam beberapa megabait, anda boleh menggunakan fungsi fail() untuk membaca fail ke dalam tatasusunan baris demi baris, dan kemudian gunakan array_pop untuk mendapatkan baris terakhir.

Tetapi untuk fail teks yang sangat besar, memori mesin tidak cukup besar, atau PHP sendiri mempunyai had memory_limit, jadi kaedah ini tidak boleh digunakan Walaupun tiada had, kecekapannya sangat rendah.

Adakah tiada cara lain? Sudah tentu ada, tetapi tidak ada fungsi siap pakai, jadi anda perlu melakukannya sendiri.

Penunjuk fail perlu digunakan di sini Mereka yang telah mempelajari C harus tahu apa itu penunjuk. Untuk meletakkannya dalam istilah awam, fail dibuka melalui fopen dalam PHP telah dibaca. Pada masa ini, penunjuk menunjuk kepada Ia adalah permulaan fail, dan kedudukan penunjuk ialah 0. Apabila anda membaca kandungan dari fail melalui fgets atau fgetc, penunjuk akan maju dengan sewajarnya semasa anda membaca dicapai oleh

while(!feof($fp)){
$data.=fgets($fp,4096);
}

Prinsipnya ialah fgets membaca rentetan panjang yang ditentukan ke belakang dari kedudukan penunjuk semasa sehingga aksara baris baharu ditemui.

Jadi, adakah mungkin untuk mengawal kedudukan penuding ke garisan N dari bawah? Malangnya, tidak, tetapi anda boleh mengalihkan penunjuk terus ke hujung dan belakang kedudukan N melalui fungsi fseek().

Kami mula-mula mengalihkan penunjuk ke penghujung dan kembali 2 kedudukan, membaca aksara melalui fgetc, dan menentukan sama ada aksara itu ialah "n", iaitu watak baris baharu, Jika ia bukan aksara baris baharu. kemudian terus ke belakang Satu kedudukan dinilai semula sehingga kita kembali ke akhir baris baru watak baris sebelumnya Hanya gunakan fgets untuk mengeluarkan keseluruhan baris. Dua gelung while digunakan di sini Gelung luar mengawal bilangan baris yang akan diperolehi, dan gelung dalam mengawal tindakan fseek.

Fungsinya adalah seperti berikut:

/**
 * 取文件最后$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));

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Cara yang cekap untuk membaca n baris pada penghujung fail besar dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn