PHP 文件处理
PHP 文件处理
Section titled “PHP 文件处理”文件处理是许多 Web 应用程序的关键组成部分。PHP 提供了一套全面的函数,用于在服务器上创建、读取、写入和管理文件。
**重要安全提示:**在处理文件时要格外小心,尤其当文件路径或内容涉及用户输入时。不当处理可能导致严重的安全漏洞(例如,目录遍历、任意文件读写)或数据丢失。务必验证和清理输入、检查文件权限,并避免暴露敏感文件路径。
简单文件读取和写入
Section titled “简单文件读取和写入”对于将文件全部内容读取到字符串或将字符串写入文件等常见任务,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) 检查至关重要。
其他有用的文件函数
Section titled “其他有用的文件函数”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 文档。