最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP中的文件系统函数(一)

    正文概述 转载于:掘金(硬核项目经理)   2021-07-12   34

    从这篇文章开始,我们将学习一系列的 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() 之类函数的身影。

    测试代码:

    github.com/zhangyue050…

    参考文档:

    www.php.net/manual/zh/r…

    关注公众号:【硬核项目经理】获取最新文章

    添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

    知乎、公众号、抖音、头条搜索【硬核项目经理】

    B站ID:482780532


    起源地 » PHP中的文件系统函数(一)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元