PHP 便利功能

示例

原始直接IO

file_get_contents并file_put_contents提供在单个调用中从PHP字符串读取文件或从文件写入PHP字符串的功能。

file_put_contents也可以与FILE_APPENDbitmask标志一起使用,而不是截断和覆盖文件。它可以与LOCK_EX位掩码一起使用,以在继续写入时获取对该文件的排他锁。可以将位掩码标志与|按位或运算符结合在一起。

$path = "file.txt";
// 将infile.txt中的内容读取到$contents
$contents = file_get_contents($path);
// 让我们进行一些更改...例如,将CRLF转换为LF!
$contents = str_replace("\r\n", "\n", $contents);
// 现在将其写回到file.txt,替换原始内容
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字段。成功或FALSE失败时,它将在数组中返回CSV字段。

默认情况下,它将仅读取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 
)