便利功能

原始直接 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 
)