首頁  >  文章  >  後端開發  >  檔案句柄的實例:透過句柄定位未見讀取的起始位置以及大檔案的分塊讀取

檔案句柄的實例:透過句柄定位未見讀取的起始位置以及大檔案的分塊讀取

黄舟
黄舟原創
2017-05-20 16:59:322230瀏覽

檔案句柄的實例:透過句柄定位未見讀取的起始位置以及大檔案的分塊讀取

為了使用讀取檔案函數,需要使用相對於PHP 腳本的路徑為他們指出要讀取的文件,然而,大多數PHP 的文件函數使用一種稍有區別的機制訪問文件,這種機制與連接數據庫的機制非常相似,該過程使用fopen()函數進行“連接”,並使用fclose函數“斷開連接”。 fopen函數的返回值是一個PHP文件指針,也被稱為文件句柄,一旦擁有了文件句柄,就可以使用他對文件執行多種操作,包括對去,附加操作等,那麼這個句柄在使用過程中都需要注意哪些問題呢?

我們先來看看檔案是如何開啟和關閉的,其程式碼如下:

<?php
$f_fopen = fopen("../file.txt.","rb");    //打开文件
  ....                               //对文件进行操作
fclose($f_fopen);                    //操作完成后关闭文件
?>

使用fopen連接檔時,必須制定檔案路徑和檔案存取模式(例如: r 表示只讀模式)。 b 模式表示檔案將以二進位模式開啟,二進位模式可以用來確保程式碼在不同操作之間具體可攜性。

一、透過句柄定位檔案讀取的起始位置

#在透過fopen()函數開啟一個檔案時就已經擁有了一個文件句柄,下面就應用該句柄讀取文件,其程式碼如下:

<?php
header("Content-Type:text/html; charset=utf-8");
$filename = "05.txt";                          //要读取的文件
$fp = fopen($filename,"rb");                   //打开文件
echo fread($fp,32);                            //使用fread()函数读取文件内容的前32个字节
echo "<p>";
echo fread($fp,filesize($filename));          //输出其余的文件内容
?>

其結果如下:

檔案句柄的實例:透過句柄定位未見讀取的起始位置以及大檔案的分塊讀取

這個列子示範如何使用文件句柄。注意,當使用fread時,第二個參數一位元組為單位,表示從檔案開始讀取的資料量,檔案內容被讀取到設定的資料量時,句柄將定位到這個位置,如果想要繼續讀取這個檔案中的其他內容,則可以透過filesize 函數讀取檔案的總大小,並且將這個值作為fread的第二個參數,此時輸出的將是檔案剩餘的內容,這就是句柄的作用。

二、大檔案的分塊讀取

#前面的方案對於小檔案讀取非常的有效,但是在讀取大文件的內容時,伺服器的記憶體將被佔用,有次可能會造成效能問題。為了減少發生該問題的可能,可以採用以塊讀取文件的方法,並以塊為對象進行操作,這樣就避免了對內存的佔用,其原理是,通過fopen函數打開文件, 應用while語句循環讀取檔案的內容,當檔案指標到達檔案結束為止時停止循環,否則應用fgets函數讀取檔案中數據,並且向前移動整個檔案句柄,以區塊讀取檔案的具體程式碼如下:

<?php
header("Content-Type:text/html; charset=utf-8");
$fopen = fopen("fun.php","rb");         
while(!feof($fopen)){             //使用 feof()函数测试指针是否到了文件结束的位置
    echo fgets($fopen);            // 输出当前行
}
fclose($fopen);
?>

還有很多函數能夠使用檔案句柄讀取檔案。其中一個是fgetss函數(注意是兩個s),它除了能夠像 strip_tags函數那樣剝離其發現的所有 HTML標記文件,其他方面幾乎與 fgets相同。另一個是 fscanf函數,它像printf一樣格式化來自檔案的輸出。另外還有fgetcsv,它使得處理 csv(comma separated values,逗號分割值)檔案變得十分容易。

但是如果希望將檔案的全部內容都讀取到一個變數中,那麼 file 和 file_get_content函數更容易使用,它們也潛在地提供了更好的效能。

那麼我們到這裡關於如何使用文件句柄就介紹到這裡,小伙伴們應該都可以輕鬆的掌握了吧!

以上是檔案句柄的實例:透過句柄定位未見讀取的起始位置以及大檔案的分塊讀取的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn