PHP基础入门(四)

[!NOTE]

本篇文章仅用于个人交流与学习,如涉及侵权请联系站长删除!

​ 本篇文章来介绍PHP文件系统操作函数的核心用法的第二部分!

1. 文件锁与指针

  1. flock($handle, $operation)

    • 文件锁是一种文件读写机制,在任何特定的时间只允许一个进程访问一个文件。利用这种机制能够使读写单个文件的过程变得更安全。这里我们使用flock()函数。flock()会依参数$operation所指定的方式对参数$handle所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。

      • LOCK_SH建立共享锁定。多个进程可同时对同一个文件作共享锁定。

      • LOCK_EX建立互斥锁定。一个文件同时只有一个互斥锁定。

      • LOCK_UN解除文件锁定状态。

      • LOCK_NB法建立锁定时,此操作可不被阻断,马上返回进程。

    • 简单地说文件锁就是一个防止多人同时操作文件数据,而导致发生冲突的机制,谁先拿到锁谁就可以安心操作文件,后面的人要么排队等待前面的文件操作完成,要么收到正在使用的通知。

      1
      2
      3
      4
      if (flock($file, LOCK_EX)) {
      fwrite($file, "Data");
      flock($file, LOCK_UN);
      }
    • 解释:上面的程序就是一个很好的例子,先通过if (flock($file, LOCK_EX))来获得写锁,使得其他人无法对这个文件进行操作,再通过if语句来判断文件是否已经锁定成功,这里需要注意flock()函数返回的是一个布尔值,如果返回TRUE则说明文件锁操作成功,反之则说明操作失败;之后就是对文件进行操作,最后再通过flock($file, LOCK_UN);来释放文件,这样下一个人才能对此文件进行操作。

  2. 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
  3. rewind($handle)

    • rewind()函数的作用是重置指针到开头。

2. CSV处理

​ CSV文件是一种用于存储表格和电子表格信息的纯文本文件,PHP的CSV处理其实就是一种可以让用户轻松进行:「读表格数据」、「存表格数据」、「转表格数据」的实用工具。

  1. fputcsv($handle, $arry)
    • fputcsv()函数是用来写入CSV行。
  2. fgetcsv($handle)
    • fgetcsv()函数是用来读取CSV行。
1
2
3
4
5
6
7
$file = fopen("G:/phpCode/test.txt", 'w+'); // 以读写的方式打开文件
$arry = ["Peter", "Oslo", "Norway"]; // 定义需要存储的数组

fputcsv($file, $arry); // 使用csv处理将数组以文本方式写入文件

rewind($file); // !重要!重置指针到文件头
print_r(fgetcsv($file)); // 打印数组 输出Array ( [0] => Peter [1] => Oslo [2] => Norway )
  • 补充:在代码中我们使用rewind()函数来重置指针位置的原因是:当我们在执行fputcsv()函数是指针默认从文件头开始,在写入所有数据后,指针会停留在文件末尾。如果不进行指针重置的话fgetcsv()函数就会从当前位置开始读取数据,但是当前指针后面是没有数据的,这回导致print_r()函数不会打印任何东西。

3. 文件操作

  1. 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');
  2. unlink($file)

    • 该函数用来删除文件。
    • $file参数表示删除文件的路径
  3. rename($old, $new)

    • 重命名文件/目录:rename("images", "pictures")
  4. 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. 目录操作

  1. mkdir($dir, $mode)

    • 该函数用来创建目录,$dir参数表示要创建的目录路径,$mode参数表示目录权限,,默认为 0777(最大权限)。他的返回值为布尔值。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <?php
      $dir = '/php/newFolder';

      // 创建目录(使用默认权限 0777)
      if (mkdir($dir)) {
      echo "目录 '{$dir}' 创建成功!";
      } else {
      echo "创建目录失败!";
      }
      ?>
  2. rmdir($dir)

    • 该函数用来删除目录rmdir("/php/newFolder")
  3. glob($pattern)

    • 该函数用来匹配文件或者目录。

      1
      print_r(glob("*.txt"))

5. 连接处理

  1. 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 的内容
  2. 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
  3. readlink($link)

    • 读取链接目标:echo readlink("backup.dat")

6. 磁盘信息

  1. disk_free_space($path)

    • 用来读取磁盘剩余空间。

      1
      2
      echo disk_free_space("/") // 当前php文件所在磁盘可用大小
      echo disk_free_space("G:/") // G磁盘剩余储蓄空间可用大小
  2. disk_total_space($path)

    • 用来读取磁盘总空间。

      1
      2
      echo disk_total_space("/") // 当前php文件所在磁盘总大小
      echo disk_total_space("G:/") // G磁盘剩余储蓄空间总大小

7. 临时文件

  1. tmpfile()

    • 创建一个自动删除的临时文件,文件关闭后或脚本结束时自动销毁。

    • 特点

      • 返回一个文件句柄(资源类型),不可直接访问文件路径
      • 文件存储在系统默认临时目录(如 Linux 的 /tmp
      • 无需手动清理,适合短期临时操作
      1
      2
      3
      4
      $temp = tmpfile();     // 创建临时文件(返回资源)
      fwrite($temp, "Test"); // 写入数据
      // ...其他操作...
      fclose($temp); // 关闭文件 → 自动删除
  2. 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. 文件权限检查

  1. is_readable($file) / is_writable($file)
    • 检查可读性:is_readable("test.txt"),返回01
    • 检查可写性:is_writable("test.txt"),返回01
  2. fileperms($file)
    • 获取权限值:echo decoct(fileperms("test.txt"))(八进制)
      • 其中decoat()函数用来将十进制数字转化为八进制。
      • 例如:输出为100644实际表示的权限为0644。输出为100664实际表示的权限为0664。

9. 其他关键函数

  1. parse_ini_file($file)

    • 用于解析 INI 配置文件并返回关联数组,用于读取 PHP 配置信息。
    • 参数:
      • $file:INI 文件路径。
      • $process_sections(可选):
        • true → 返回多维数组(带节分组)。
        • false → 返回单维数组(默认)。
  2. 。realpath($path

    • 返回绝对路径:echo realpath("test.txt")
  3. move_uploaded_file($tmp, $dest)

    • 安全移动上传的临时文件到新位置,专门用于处理 HTTP 文件上传。

    • 参数:

      • $tmp:上传文件的临时路径(来自 $_FILES['field']['tmp_name'])。
      • $dest:目标路径(包含文件名)。
    • 关键特性

      • 安全检查:验证 $tmp 是否为合法上传文件(防止伪造路径攻击)。
      • 覆盖行为:若目标文件存在,​自动覆盖​(无警告)。
      1
      move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/file.txt");