便利功能
原始直接 IO
file_get_contents
和 file_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
)