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//)echorealpath('./../../..//../etc/passwd'),PHP_EOL;///private/etc/passwd
pathinfo() 函数用于以数组的形式返回路径中的信息,从结果来看,我们可以看到文件的 dirname 部分,basename 部分,以及文件的扩展名 extension 和不包含扩展名的 filename 内容。
realpath() 返回的是规范化的绝对路径名,它扩展所有的符号连接并且处理输入的路径中的 ./ 、 ../ 以及多余的 / ,返回的内容是标准规范的绝对路径。
修正文件所属干系信息接下来,我们学习一些修正文件干系属性的函数,紧张便是在 Linux 系统环境中的文件权限信息的操作。
当然,首先我们得创建一个文件。和 Linux 中的命令是非常类似的。
touch('test3.txt');
touch() 函数除了给出要创建的文件名之外,还有两个可选参数可以指定文件的创建韶光及访问韶光,不给参数的话默认便是当前韶光。这个文件名可以是相对或绝对路径中有权限的目录,并在该目录下创建一个空的文件。
echofileowner('test.txt'),PHP_EOL;//501chown('test.txt','www');clearstatcache();echofileowner('test.txt'),PHP_EOL;//70
通过 fileowner() 函数,我们可以得到某个文件所属的用户,默认情形下我们的用户是当前运行 PHP 脚本的用户,也便是系统目前的登任命户。在这里,我们利用 chown() 函数,将用户改为 www 用户。clearstatcache() 是用于清理文件系统的缓存信息,如果不清理一下的话,fileowner() 返回的依然还是之前的用户信息。
echofilegroup('test.txt'),PHP_EOL;//20chgrp('test.txt','www');clearstatcache();echofilegroup('test.txt'),PHP_EOL;//70echosubstr(sprintf('%o',fileperms('test.txt')),-4),PHP_EOL;//0766chmod('test.txt',0777);clearstatcache();echosubstr(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');echolinkinfo('ltest.txt'),PHP_EOL;//16777220symlink('test.txt','ltest2.txt');echolinkinfo('ltest2.txt'),PHP_EOL;//16777220print_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-x1zhangyuestaff8Oct1909:58ltest2.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