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