便利功能

原始直接 IO

file_get_contentsfile_put_contents 提供了在單個呼叫中從/向 PHP 字串讀取/寫入檔案的功能。

file_put_contents 也可以與 FILE_APPEND 位掩碼標誌一起使用,而不是截斷和覆蓋檔案。它可以與 LOCK_EX 位掩碼一起使用,以便在繼續寫入時獲取對檔案的獨佔鎖定。位掩碼標誌可以與|按位運算子連線。

$path = "file.txt";
// reads contents in file.txt to $contents
$contents = file_get_contents($path);
// let's change something... for example, convert the CRLF to LF!
$contents = str_replace("\r\n", "\n", $contents);
// now write it back to file.txt, replacing the original contents
file_put_contents($path, $contents);

FILE_APPEND 可以方便地附加到日誌檔案,而 LOCK_EX 有助於防止多個程序寫入檔案的競爭條件。例如,要寫入有關當前會話的日誌檔案:

file_put_contents("logins.log", "{$_SESSION["username"]} logged in", FILE_APPEND | LOCK_EX);

CSV IO

fgetcsv($file, $length, $separator)

fgetcsv 從開啟的檔案中解析一行檢查 CSV 欄位。它會在成功時返回陣列中的 CSV 欄位,或者在失敗時返回 FALSE

預設情況下,它只讀取 CSV 檔案的一行。

$file = fopen("contacts.csv","r");
print_r(fgetcsv($file));    
print_r(fgetcsv($file,5," "));
fclose($file); 

contacts.csv

Kai Jim, Refsnes, Stavanger, Norway
Hege, Refsnes, Stavanger, Norway

輸出:

Array
(
    [0] => Kai Jim
    [1] => Refsnes
    [2] => Stavanger
    [3] => Norway
)
Array
(
    [0] => Hege,
)

直接將檔案讀取到 stdout

readfile 將檔案複製到輸出緩衝區。即使在傳送大檔案時,readfile() 也不會出現任何記憶體問題。

$file = 'monkey.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}

或者從檔案指標

或者,要在檔案中尋找一個點以開始複製到 stdout,請使用 fpassthru 代替。在以下示例中,最後 1024 個位元組被複制到 stdout:

$fh = fopen("file.txt", "rb");
fseek($fh, -1024, SEEK_END); 
fpassthru($fh);

將檔案讀入陣列

file 返回陣列中傳遞檔案中的行。陣列的每個元素對應於檔案中的一行,換行符仍然附加。

print_r(file("test.txt"));

test.txt

Welcome to File handling
This is to test file handling

輸出:

Array 
( 
    [0] => Welcome to File handling 
    [1] => This is to test file handling 
)