PHP基础入门(四)
PHP基础入门(四)
[!NOTE]
本篇文章仅用于个人交流与学习,如涉及侵权请联系站长删除!
本篇文章来介绍PHP文件系统操作函数的核心用法的第二部分!
1. 文件锁与指针
flock($handle, $operation)
文件锁是一种文件读写机制,在任何特定的时间只允许一个进程访问一个文件。利用这种机制能够使读写单个文件的过程变得更安全。这里我们使用
flock()
函数。flock()
会依参数$operation
所指定的方式对参数$handle
所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。LOCK_SH
建立共享锁定。多个进程可同时对同一个文件作共享锁定。LOCK_EX
建立互斥锁定。一个文件同时只有一个互斥锁定。LOCK_UN
解除文件锁定状态。LOCK_NB
法建立锁定时,此操作可不被阻断,马上返回进程。
简单地说文件锁就是一个防止多人同时操作文件数据,而导致发生冲突的机制,谁先拿到锁谁就可以安心操作文件,后面的人要么排队等待前面的文件操作完成,要么收到正在使用的通知。
1
2
3
4if (flock($file, LOCK_EX)) {
fwrite($file, "Data");
flock($file, LOCK_UN);
}解释:上面的程序就是一个很好的例子,先通过
if (flock($file, LOCK_EX))
来获得写锁,使得其他人无法对这个文件进行操作,再通过if
语句来判断文件是否已经锁定成功,这里需要注意flock()
函数返回的是一个布尔值,如果返回TRUE
则说明文件锁操作成功,反之则说明操作失败;之后就是对文件进行操作,最后再通过flock($file, LOCK_UN);
来释放文件,这样下一个人才能对此文件进行操作。
fseek($handle, $offset, $whence)
和ftell($handle)
fseek()
函数的作用是将指针移动到指定位置,其中$handle
文件资源由fopen()
函数打开,offset
参数为偏移量(字节),$whence
参数是基准位置,是一个可选项,如果不设置的话则默认从文件开头开始。SEEK_SET
(默认):从文件开头计算($offset
>= 0)SEEK_CUR
:从当前位置计算($offset
可正可负)SEEK_END
:从文件末尾计算($offset
通常为负)
1
2
3
4
5
6
7
8
9$file = fopen("test.txt", "r");
// 跳转到第 10 字节(从开头)
fseek($file, 10);
// 向前移动 5 字节(从当前位置)
fseek($file, 5, SEEK_CUR);
// 跳转到倒数第 8 字节(从末尾)
fseek($file, -8, SEEK_END);ftell()
函数的作用是获取当前文件的指针位置(距离文件开头的字节偏移量)。他的参数$handle
也指文件资源。返回值是一个整数,来表示当前文件指针位置。1
2
3$file = fopen("test.txt", "r");
fseek($file, 100);
echo ftell($file); // 输出 100
rewind($handle)
rewind()
函数的作用是重置指针到开头。
2. CSV处理
CSV文件是一种用于存储表格和电子表格信息的纯文本文件,PHP的CSV处理其实就是一种可以让用户轻松进行:「读表格数据」、「存表格数据」、「转表格数据」的实用工具。
fputcsv($handle, $arry)
fputcsv()
函数是用来写入CSV行。
fgetcsv($handle)
fgetcsv()
函数是用来读取CSV行。
1 | $file = fopen("G:/phpCode/test.txt", 'w+'); // 以读写的方式打开文件 |
- 补充:在代码中我们使用
rewind()
函数来重置指针位置的原因是:当我们在执行fputcsv()
函数是指针默认从文件头开始,在写入所有数据后,指针会停留在文件末尾。如果不进行指针重置的话fgetcsv()
函数就会从当前位置开始读取数据,但是当前指针后面是没有数据的,这回导致print_r()
函数不会打印任何东西。
3. 文件操作
copy($source, $dest)
该函数的作用是复制文件,他的两个参数必须是路径。
$source
参数表示原文件的路径,而$dest
参数表示目标路径。1
2
3
4
5
6
7
8// 使用绝对路径(推荐)
copy('/home/user/data.txt', '/home/user/backup/data.txt');
// 使用相对路径(相对于当前脚本目录)
copy('source/images/photo.jpg', 'backup/photo.jpg');
// 跨目录操作
copy('../../shared/file.txt', '../target/file.txt');
unlink($file)
- 该函数用来删除文件。
$file
参数表示删除文件的路径
rename($old, $new)
- 重命名文件/目录:
rename("images", "pictures")
- 重命名文件/目录:
ftruncate($handle, $size)
截断文件:
ftruncate($file, 100)
(保留100字节)需要注意的是,
ftruncate()
函数在使用前需要通过fopen()
函数来创建一个文件句柄。1
2
3
4
5$handle = fopen("data.txt", "r+"); // 以读写模式创造一个文件句柄
ftruncate($handle, 100); // 将文件缩减至 100 字节
fclose($handle); // 操作完成后释放资源
4. 目录操作
mkdir($dir, $mode)
该函数用来创建目录,
$dir
参数表示要创建的目录路径,$mode
参数表示目录权限,,默认为0777
(最大权限)。他的返回值为布尔值。1
2
3
4
5
6
7
8
9
10
$dir = '/php/newFolder';
// 创建目录(使用默认权限 0777)
if (mkdir($dir)) {
echo "目录 '{$dir}' 创建成功!";
} else {
echo "创建目录失败!";
}
rmdir($dir)
- 该函数用来删除目录
rmdir("/php/newFolder")
- 该函数用来删除目录
glob($pattern)
该函数用来匹配文件或者目录。
1
print_r(glob("*.txt"))
5. 连接处理
symlink($target, $link)
- 该函数的作用是:创建符号链接(软连接),它的返回值为布尔类型。
其中参数
$target
表示的是源文件或者目录的真实路径(即软连接所指向的位置)。参数$link
表示的是要创建的符号连接路径。特点: 1. 符号链接类似 Windows 的“快捷方式”。 2. 如果
$target
被删除,链接会失效(称为“断链”)。 3. 支持跨文件系统和指向目录。1
2
3
4
5// 创建指向 /var/www/file.txt 的软链接
if (symlink('/var/www/file.txt', 'shortcut.ln')) {
echo "符号链接创建成功!";
}
// 访问 shortcut.ln 会读取 /var/www/file.txt 的内容
link($target, $link)
该函数的作用是:创建硬链接,它的返回值也为布尔类型。
其中参数
$target
表示已存在的源文件路径(不可以是目录)。参数$link
表示要创建的硬链接路径。特点: 1. 硬链接是原始文件的副本引用(指向同一个
inode
)。 2. 删除$target
后,文件内容仍可通过硬链接访问。 3. 不支持跨文件系统或目录 4. 所有硬链接地位平等,没有主从之分。1
2
3
4
5// 为 /home/user/data.txt 创建硬链接
if (link('/home/user/data.txt', 'backup.dat')) {
echo "硬链接创建成功!";
}
// 修改 backup.dat 会同步修改 data.txt
readlink($link)
- 读取链接目标:
echo readlink("backup.dat")
- 读取链接目标:
6. 磁盘信息
disk_free_space($path)
用来读取磁盘剩余空间。
1
2echo disk_free_space("/") // 当前php文件所在磁盘可用大小
echo disk_free_space("G:/") // G磁盘剩余储蓄空间可用大小
disk_total_space($path)
用来读取磁盘总空间。
1
2echo disk_total_space("/") // 当前php文件所在磁盘总大小
echo disk_total_space("G:/") // G磁盘剩余储蓄空间总大小
7. 临时文件
tmpfile()
创建一个自动删除的临时文件,文件关闭后或脚本结束时自动销毁。
特点:
- 返回一个文件句柄(资源类型),不可直接访问文件路径
- 文件存储在系统默认临时目录(如 Linux 的
/tmp
) - 无需手动清理,适合短期临时操作
1
2
3
4$temp = tmpfile(); // 创建临时文件(返回资源)
fwrite($temp, "Test"); // 写入数据
// ...其他操作...
fclose($temp); // 关闭文件 → 自动删除
tempnam($dir, $prefix)
生成一个唯一的临时文件名(不创建文件),需手动管理删除。
参数:
$dir
:指定目录(若目录无效则使用系统临时目录)$prefix
:文件名前缀(如"TMP"
会生成TMPxxxxx
)
特点:
返回文件路径的字符串
需手动用
unlink()
删除文件需配合
fopen()
等函数操作文件
1
2
3
4
5
6$path = tempnam("/tmp", "TMP"); // 生成路径如 "/tmp/TMPaBc123"
$file = fopen($path, "w+"); // 创建文件
fwrite($file, "Test"); // 写入数据
// ...其他操作...
fclose($file); // 关闭文件
unlink($path); // 手动删除文件!⚠️
8. 文件权限检查
is_readable($file)
/is_writable($file)
- 检查可读性:
is_readable("test.txt")
,返回0
或1
。 - 检查可写性:
is_writable("test.txt")
,返回0
或1
。
- 检查可读性:
fileperms($file)
- 获取权限值:
echo decoct(fileperms("test.txt"))
(八进制)- 其中
decoat()
函数用来将十进制数字转化为八进制。 - 例如:输出为
100644
实际表示的权限为0644。输出为100664
实际表示的权限为0664。
- 其中
- 获取权限值:
9. 其他关键函数
parse_ini_file($file)
- 用于解析 INI 配置文件并返回关联数组,用于读取 PHP 配置信息。
- 参数:
$file
:INI 文件路径。$process_sections
(可选):true
→ 返回多维数组(带节分组)。false
→ 返回单维数组(默认)。
。realpath($path
- 返回绝对路径:
echo realpath("test.txt")
- 返回绝对路径:
move_uploaded_file($tmp, $dest)
安全移动上传的临时文件到新位置,专门用于处理 HTTP 文件上传。
参数:
$tmp
:上传文件的临时路径(来自$_FILES['field']['tmp_name']
)。$dest
:目标路径(包含文件名)。
关键特性:
- 安全检查:验证
$tmp
是否为合法上传文件(防止伪造路径攻击)。 - 覆盖行为:若目标文件存在,自动覆盖(无警告)。
1
move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/file.txt");
- 安全检查:验证