关于php:PHP中的文件系统函数一

38次阅读

共计 4139 个字符,预计需要花费 11 分钟才能阅读完成。

从这篇文章开始,咱们将学习一系列的 PHP 文件系统相干函数。其实这些函数中,有很多都是咱们常常用到的,大家并不需要刻意地去记住它们,只有晓得有这么个货色,在应用的时候记得来查文档就能够了。

文件门路相干函数

文件门路相干的函数往往在一些框架中会比拟常见,而且多会配合 \_\_FILE\_\_、\_\_DIR\_\_ 之类的魔术常量应用。

echo "1)".basename("/etc/sudoers.d", ".d"), PHP_EOL;
echo "2)".basename("/etc/passwd"), PHP_EOL;
echo "3)".basename("/etc/"), PHP_EOL;
echo "4)".basename("."), PHP_EOL;
echo "5)".basename("/"), PHP_EOL;
echo "6)".basename("/usr/local/Cellar/php/7.3.9_1/README.md"), PHP_EOL;
// 1) sudoers
// 2) passwd
// 3) etc
// 4) .
// 5) 
// 6) README.md

basename() 函数是取得门路中的文件名,它有两个参数,第一个是文件的门路,第二个是过滤掉的内容,比方第一条测试语句咱们过滤掉文件的后缀名。

echo "1)" . dirname("/etc/passwd") , PHP_EOL;
echo "2)" . dirname("/etc/") , PHP_EOL;
echo "3)" . dirname("."), PHP_EOL;
// 1) /etc
// 2) /
// 3) .

dirname() 返回的是门路中的门路局部,也就是不蕴含文件名的那局部内容,和 basename() 正好是相同的性能。

print_r(pathinfo('/usr/local/Cellar/php/7.3.9_1/README.md'));
// Array
// (//     [dirname] => /usr/local/Cellar/php/7.3.9_1
//     [basename] => README.md
//     [extension] => md
//     [filename] => README
// )

echo realpath('./../../..//../etc/passwd'), PHP_EOL;
// /private/etc/passwd

pathinfo() 函数用于以数组的模式返回门路中的信息,从后果来看,咱们能够看到文件的 dirname 局部,basename 局部,以及文件的扩展名 extension 和不蕴含扩展名的 filename 内容。

realpath() 返回的是规范化的绝对路径名,它扩大所有的符号连贯并且解决输出的门路中的 ./、../ 以及多余的 /,返回的内容是标准规范的绝对路径。

批改文件所属相干信息

接下来,咱们学习一些批改文件相干属性的函数,次要就是在 Linux 零碎环境中的文件权限信息的操作。

当然,首先咱们得创立一个文件。和 Linux 中的命令是十分相似的。

touch('test3.txt');

touch() 函数除了给出要创立的文件名之外,还有两个可选参数能够指定文件的创立工夫及拜访工夫,不给参数的话默认就是以后工夫。这个文件名能够是绝对或绝对路径中有权限的目录,并在该目录下创立一个空的文件。

echo fileowner('test.txt'), PHP_EOL; // 501
chown('test.txt', 'www');
clearstatcache();
echo fileowner('test.txt'), PHP_EOL; // 70

通过 fileowner() 函数,咱们能够取得某个文件所属的用户,默认状况下咱们的用户是以后运行 PHP 脚本的用户,也就是零碎目前的登录用户。在这里,咱们应用 chown() 函数,将用户改为 www 用户。clearstatcache() 是用于清理文件系统的缓存信息,如果不清理一下的话,fileowner() 返回的仍然还是之前的用户信息。

echo filegroup('test.txt'), PHP_EOL; // 20
chgrp('test.txt', 'www');
clearstatcache();
echo filegroup('test.txt'), PHP_EOL; // 70

echo substr(sprintf('%o', fileperms('test.txt')), -4), PHP_EOL; // 0766
chmod('test.txt', 0777);
clearstatcache();
echo substr(sprintf('%o', fileperms('test.txt')), -4), PHP_EOL; // 0777

同理,应用 filegroup() 函数取得文件的属组信息,chgrp() 用于批改文件的属组。fileperms() 用于返回文件的权限信息,它返回的是数字模式的文件拜访权限,这里咱们应用 sprintf() 格式化后果后取得咱们罕用的 Linux 零碎权限格局。chmod() 函数用于批改文件的权限,它的权限参数是三个 8 进制数据组成的数字,也就是代表 Linux 零碎中的 1、2、4 和它们的组合,所以咱们须要在后面再加上一个 0 用于确保操作可能失常执行。对于系统文件权限的常识大家须要认真学习 Linux 零碎中相干的内容。

留神,上述函数如果在命令行中运行失败,大部分起因是没有权限,能够应用 sudo 进行测试。在 fastcgi 中运行时,就更加须要留神权限问题,仅在咱们服务器能够操作的目录中进行平安的文件权限批改。

print_r(stat('test.txt'));
// Array
// (//     [0] => 16777220
//     [1] => 8707958352
//     [2] => 33279
//     [3] => 2
//     [4] => 70
//     [5] => 70
//     [6] => 0
//     [7] => 0
//     [8] => 1603070453
//     [9] => 1603070453
//     [10] => 1603072836
//     [11] => 4096
//     [12] => 0
//     [dev] => 16777220
//     [ino] => 8707958352
//     [mode] => 33279
//     [nlink] => 2
//     [uid] => 70
//     [gid] => 70
//     [rdev] => 0
//     [size] => 0
//     [atime] => 1603070453
//     [mtime] => 1603070453
//     [ctime] => 1603072836
//     [blksize] => 4096
//     [blocks] => 0
// )

stat() 函数能够获取到指定文件的所有属性信息,在这里咱们能够看到文件的 uid、gid、ctime、mtime 等信息。

软硬文件连贯相干操作

在 Linux 零碎中,有软连贯和硬连贯的相干常识。其实软连贯就像是 Windows 中的快捷方式,而硬连贯相干于复制了一份数据。在 PHP 中,也为咱们提供了创立软硬连贯以及相干的一些操作。

link('test.txt', 'ltest.txt');
echo linkinfo('ltest.txt'), PHP_EOL; // 16777220

symlink('test.txt', 'ltest2.txt');
echo linkinfo('ltest2.txt'), PHP_EOL; // 16777220

print_r(lstat('ltest2.txt'));
// Array
// (//     [0] => 16777220
//     [1] => 8707962848
//     [2] => 41453
//     [3] => 1
//     [4] => 0
//     [5] => 20
//     [6] => 0
//     [7] => 8
//     [8] => 1603072717
//     [9] => 1603072717
//     [10] => 1603072717
//     [11] => 4096
//     [12] => 0
//     [dev] => 16777220
//     [ino] => 8707962848
//     [mode] => 41453
//     [nlink] => 1
//     [uid] => 0
//     [gid] => 20
//     [rdev] => 0
//     [size] => 8
//     [atime] => 1603072717
//     [mtime] => 1603072717
//     [ctime] => 1603072717
//     [blksize] => 4096
//     [blocks] => 0
// )

应用 link() 函数创立的就是一个指定文件的硬连贯文件,而应用 symlink() 创立的则是一个软连贯文件。相对来说,咱们应用软连贯的场景会更多一些。lstat() 就和 stat() 函数的性能一样,查看文件的各种属性信息,不过 lstat() 函数针对的是软硬连贯文件。

lchown('ltest2.txt', 'zhangyue');
lchgrp('ltest2.txt', 'staff');
// lrwxr-xr-x  1 zhangyue  staff      8 Oct 19 09:58 ltest2.txt -> test.txt

同样地,咱们也能够批改软硬连贯的用户和用户组信息,不过它们的信息不能通过 fileowner() 或 filegroup() 查看。因为它们是连贯文件,自身还是和原始文件绑定在一起的,应用 fileowner() 这类的函数查看到的仍然是原始文件的信息。咱们能够在零碎环境中应用 ls -l 查看连贯文件的用户和用户组信息是否批改胜利。

总结

明天的内容比较简单,而且批改权限的操作也并不罕用。不过对于系统安全来,它们还是十分有用的,比方对于上传来说,咱们要预防上传可执行文件的话,就能够通过批改文件的权限来让文件无奈间接运行,从而起到平安爱护的作用。另外,目录门路相干的操作也是一些框架的根底,简直所有框架的入口或者说是 Composer 的入口,都会见到 dirname() 以及 basename() 之类函数的身影。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/6.PHP 中的文件系统函数(一).php

参考文档:

https://www.php.net/manual/zh/ref.filesystem.php

各自媒体平台均可搜寻【硬核项目经理】

正文完
 0