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.
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!