Skip to content

PHP 文件处理

文件处理是许多 Web 应用程序的关键组成部分。PHP 提供了一套全面的函数,用于在服务器上创建、读取、写入和管理文件。

**重要安全提示:**在处理文件时要格外小心,尤其当文件路径或内容涉及用户输入时。不当处理可能导致严重的安全漏洞(例如,目录遍历、任意文件读写)或数据丢失。务必验证和清理输入、检查文件权限,并避免暴露敏感文件路径。

对于将文件全部内容读取到字符串或将字符串写入文件等常见任务,PHP 提供了一些便捷的快捷函数:

读取文件 (file_get_contents):

此函数将整个文件读取为一个字符串。对于较小的文件来说非常方便。

<?php
$filename = 'data/dictionary.txt';
// 在尝试读取之前检查文件是否存在且可读
if (file_exists($filename) && is_readable($filename)) {
$content = file_get_contents($filename);
if ($content === false) {
echo "读取文件出错。";
} else {
echo "<pre>" . htmlspecialchars($content) . "</pre>";
}
} else {
echo "文件未找到或不可读。";
}
?>

写入文件 (file_put_contents):

此函数将数据(字符串或数组)写入文件。默认情况下会覆盖文件;使用 FILE_APPEND 标志可以追加内容。

<?php
$filename = 'logs/app.log';
$logMessage = date('Y-m-d H:i:s') . " - User action logged.\n";
// 尝试将消息追加到日志文件
// file_put_contents 会在文件不存在时创建它
$bytesWritten = file_put_contents($filename, $logMessage, FILE_APPEND | LOCK_EX);
if ($bytesWritten === false) {
echo "写入日志文件出错。";
} else {
echo "日志消息添加成功(写入 $bytesWritten 字节)。";
}
?>

请注意使用 LOCK_EX 进行独占锁定,以防止多个进程同时写入时出现竞态条件(race conditions)。

高级文件处理(使用文件指针)

Section titled “高级文件处理(使用文件指针)”

如需更多控制,例如逐行或逐块读取大型文件,或处理二进制数据,请使用传统的文件指针函数:

  • fopen(string $filename, string $mode):打开一个文件或 URL,并返回一个文件指针资源。
  • fread(resource $handle, int $length):从文件指针读取最多 length 字节。
  • fgets(resource $handle, ?int $length = null):从文件指针获取一行。
  • fwrite(resource $handle, string $string, ?int $length = null):将一个字符串写入文件指针。
  • fclose(resource $handle):关闭文件指针。
  • feof(resource $handle):检查是否已到达文件末尾。

示例:逐行读取文件

<?php
$filename = 'data/users.csv';
$handle = @fopen($filename, 'r'); // 使用 'r' 模式进行读取
if ($handle) {
echo "<ul>";
while (($line = fgets($handle)) !== false) {
// 处理每一行(例如,解析 CSV,显示)
echo "<li>" . htmlspecialchars(trim($line)) . "</li>";
}
echo "</ul>";
if (!feof($handle)) {
echo "错误:意外的 fgets() 失败。";
}
fclose($handle);
} else {
echo "无法打开文件:$filename";
}
?>

使用 @fopen 可以抑制文件无法打开时的错误,这就是为什么紧随其后的 if ($handle) 检查至关重要。

  • file_exists(string $filename):检查文件或目录是否存在。
  • is_readable(string $filename):检查文件是否存在且可读。
  • is_writable(string $filename):检查文件是否存在且可写。
  • is_dir(string $filename):检查文件路径是否为目录。
  • is_file(string $filename):检查文件路径是否为常规文件。
  • filesize(string $filename):获取文件大小(以字节为单位)。
  • unlink(string $filename):删除一个文件。
  • mkdir(string $pathname, int $mode = 0777, bool $recursive = false):创建一个目录。
  • rmdir(string $dirname):删除一个空目录。
  • copy(string $source, string $dest):复制一个文件。
  • rename(string $oldname, string $newname):重命名或移动一个文件或目录。

关于这些函数的详细用法、参数、返回值和潜在错误条件,请务必查阅官方 PHP 文档。