PHP文件系统与目录操作全面指南文件操作在PHP里是用得很多的功能。从简单的文件读写到目录遍历PHP提供了丰富的函数。今天就把这些内容都梳理一遍。最基本的文件读写函数是file_get_contents和file_put_contents一条语句完成整个操作。php// 写入文件file_put_contents(/tmp/test.txt, Hello PHP!\n);file_put_contents(/tmp/test.txt, 追加内容\n, FILE_APPEND);// 读取文件$content file_get_contents(/tmp/test.txt);echo $content;// Lock_EX防止并发写入file_put_contents(/tmp/log.txt, 日志行\n, FILE_APPEND | LOCK_EX);// JSON配置文件的读写$config [database [host localhost,port 3306,name test,],app [debug true,timezone Asia/Shanghai,],];file_put_contents(/tmp/config.json, json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));$loaded json_decode(file_get_contents(/tmp/config.json), true);echo 数据库主机: {$loaded[database][host]}\n;?逐行处理大文件用fopenfgets避免一次性加载到内存。php// 逐行读取大文件function processLargeFile(string $path, callable $lineCallback): void{$handle fopen($path, r);if ($handle false) {throw new RuntimeException(无法打开文件: $path);}$lineNumber 0;while (($line fgets($handle)) ! false) {$lineNumber;$line trim($line);if ($line ! ) {$lineCallback($lineNumber, $line);}}fclose($handle);}// 写入大文件function writeLargeFile(string $path, array $lines): void{$handle fopen($path, w);if ($handle false) {throw new RuntimeException(无法写入文件: $path);}foreach ($lines as $line) {fwrite($handle, $line . \n);}fclose($handle);}// CSV文件处理function readCsv(string $path, bool $hasHeader true): array{$handle fopen($path, r);if ($handle false) {throw new RuntimeException(无法打开CSV: $path);}$headers [];$data [];$rowIndex 0;while (($row fgetcsv($handle)) ! false) {if ($hasHeader $rowIndex 0) {$headers $row;$rowIndex;continue;}if ($hasHeader !empty($headers)) {$data[] array_combine($headers, $row);} else {$data[] $row;}$rowIndex;}fclose($handle);return $data;}function writeCsv(string $path, array $data, ?array $headers null): void{$handle fopen($path, w);if ($handle false) {throw new RuntimeException(无法写入CSV: $path);}if ($headers ! null) {fputcsv($handle, $headers);}foreach ($data as $row) {fputcsv($handle, $row);}fclose($handle);}// CSV使用示例$users [[name 张三, email zhangsantest.com, age 28],[name 李四, email lisitest.com, age 35],];writeCsv(/tmp/users.csv, $users, [name, email, age]);$imported readCsv(/tmp/users.csv);print_r($imported);?目录操作包括遍历、创建、删除等。php// 创建目录mkdir(/tmp/mydir/subdir, 0755, true); // true表示递归创建// 删除目录必须为空rmdir(/tmp/emptydir);// 递归删除目录function removeDirectory(string $path): void{if (!is_dir($path)) {return;}$items scandir($path);foreach ($items as $item) {if ($item . || $item ..) continue;$fullPath $path/$item;if (is_dir($fullPath)) {removeDirectory($fullPath);} else {unlink($fullPath);}}rmdir($path);}// 遍历目录function scanDirectory(string $path, string $prefix ): void{$items scandir($path);foreach ($items as $item) {if ($item . || $item ..) continue;$fullPath $path/$item;if (is_dir($fullPath)) {echo $prefix $item/\n;scanDirectory($fullPath, $prefix );} else {$size filesize($fullPath);$sizeStr $size 1024 ? round($size / 1024, 1) . KB : $size . B;echo $prefix $item ($sizeStr)\n;}}}mkdir(/tmp/testdir, 0755, true);file_put_contents(/tmp/testdir/a.txt, 内容A);file_put_contents(/tmp/testdir/b.txt, 内容B);mkdir(/tmp/testdir/sub, 0755, true);file_put_contents(/tmp/testdir/sub/c.txt, 内容C);scanDirectory(/tmp/testdir);?文件信息查询和权限操作。php$path /tmp/test.txt;file_put_contents($path, 测试文件内容);echo 文件名: . basename($path) . \n;echo 目录: . dirname($path) . \n;echo 扩展名: . pathinfo($path, PATHINFO_EXTENSION) . \n;echo 大小: . filesize($path) . 字节\n;echo 创建时间: . date(Y-m-d H:i:s, filectime($path)) . \n;echo 修改时间: . date(Y-m-d H:i:s, filemtime($path)) . \n;echo 访问时间: . date(Y-m-d H:i:s, fileatime($path)) . \n;echo 可读: . (is_readable($path) ? 是 : 否) . \n;echo 可写: . (is_writable($path) ? 是 : 否) . \n;echo 文件: . (is_file($path) ? 是 : 否) . \n;// 文件权限echo 权限: . substr(sprintf(%o, fileperms($path)), -4) . \n;chmod($path, 0644); // 修改权限// 文件操作copy($path, /tmp/copy.txt);rename(/tmp/copy.txt, /tmp/renamed.txt);unlink(/tmp/renamed.txt);?临时文件在PHP中用于存储临时数据。php// 创建临时文件$tempFile tmpfile();fwrite($tempFile, 临时数据);// 脚本结束或fclose时自动删除// 获取临时文件路径$tempPath tempnam(sys_get_temp_dir(), php_);file_put_contents($tempPath, 数据);echo 临时文件: $tempPath\n;unlink($tempPath);// 流式处理$stream fopen(php://temp, r);fwrite($stream, 流式数据);rewind($stream);echo fread($stream, 1024) . \n;fclose($stream);?锁定机制防止并发写入问题。php// 文件锁定$fp fopen(/tmp/locktest.txt, a);// 获取独占锁if (flock($fp, LOCK_EX)) {fwrite($fp, 写入数据\n);flock($fp, LOCK_UN); // 释放锁} else {echo 无法获取文件锁\n;}fclose($fp);// 非阻塞锁$fp fopen(/tmp/locktest.txt, a);if (flock($fp, LOCK_EX | LOCK_NB)) {fwrite($fp, 非阻塞写入\n);flock($fp, LOCK_UN);} else {echo 文件被锁定跳过\n;}fclose($fp);?PHP的文件函数用起来方便但也有些需要注意的地方。file_get_contents会把整个文件读入内存几百兆的大文件不能这么搞。写文件时考虑文件锁避免并发写入冲突。上传文件必须用move_uploaded_file不能用copy因为有安全检查。这些细节注意到了文件操作就不会出问题。