乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      PHP中的文件系統(tǒng)函數(shù)(一)

       硬核項目經(jīng)理 2021-05-31

      PHP中的文件系統(tǒng)函數(shù)(一)

      從這篇文章開始,我們將學(xué)習(xí)一系列的 PHP 文件系統(tǒng)相關(guān)函數(shù)。其實這些函數(shù)中,有很多都是我們經(jīng)常用到的,大家并不需要刻意地去記住它們,只要知道有這么個東西,在使用的時候記得來查文檔就可以了。

      文件路徑相關(guān)函數(shù)

      文件路徑相關(guān)的函數(shù)往往在一些框架中會比較常見,而且多會配合 __FILE__ 、 __DIR__ 之類的魔術(shù)常量使用。

      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() 函數(shù)是獲得路徑中的文件名,它有兩個參數(shù),第一個是文件的路徑,第二個是過濾掉的內(nèi)容,比如第一條測試語句我們過濾掉文件的后綴名。

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

      dirname() 返回的是路徑中的路徑部分,也就是不包含文件名的那部分內(nèi)容,和 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() 函數(shù)用于以數(shù)組的形式返回路徑中的信息,從結(jié)果來看,我們可以看到文件的 dirname 部分,basename 部分,以及文件的擴展名 extension 和不包含擴展名的 filename 內(nèi)容。

      realpath() 返回的是規(guī)范化的絕對路徑名,它擴展所有的符號連接并且處理輸入的路徑中的 ./ 、 ../ 以及多余的 / ,返回的內(nèi)容是標(biāo)準(zhǔn)規(guī)范的絕對路徑。

      修改文件所屬相關(guān)信息

      接下來,我們學(xué)習(xí)一些修改文件相關(guān)屬性的函數(shù),主要就是在 Linux 系統(tǒng)環(huán)境中的文件權(quán)限信息的操作。

      當(dāng)然,首先我們得創(chuàng)建一個文件。和 Linux 中的命令是非常類似的。

      touch('test3.txt');

      touch() 函數(shù)除了給出要創(chuàng)建的文件名之外,還有兩個可選參數(shù)可以指定文件的創(chuàng)建時間及訪問時間,不給參數(shù)的話默認(rèn)就是當(dāng)前時間。這個文件名可以是相對或絕對路徑中有權(quán)限的目錄,并在該目錄下創(chuàng)建一個空的文件。

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

      通過 fileowner() 函數(shù),我們可以獲得某個文件所屬的用戶,默認(rèn)情況下我們的用戶是當(dāng)前運行 PHP 腳本的用戶,也就是系統(tǒng)目前的登錄用戶。在這里,我們使用 chown() 函數(shù),將用戶改為 www 用戶。clearstatcache() 是用于清理文件系統(tǒng)的緩存信息,如果不清理一下的話,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() 函數(shù)獲得文件的屬組信息,chgrp() 用于修改文件的屬組。fileperms() 用于返回文件的權(quán)限信息,它返回的是數(shù)字模式的文件訪問權(quán)限,這里我們使用 sprintf() 格式化結(jié)果后獲得我們常用的 Linux 系統(tǒng)權(quán)限格式。chmod() 函數(shù)用于修改文件的權(quán)限,它的權(quán)限參數(shù)是三個 8 進制數(shù)據(jù)組成的數(shù)字,也就是代表 Linux 系統(tǒng)中的 1 、2 、4 和它們的組合,所以我們需要在前面再加上一個 0 用于確保操作能夠正常執(zhí)行。關(guān)于系統(tǒng)文件權(quán)限的知識大家需要認(rèn)真學(xué)習(xí) Linux 系統(tǒng)中相關(guān)的內(nèi)容。

      注意,上述函數(shù)如果在命令行中運行失敗,大部分原因是沒有權(quán)限,可以使用 sudo 進行測試。在 fastcgi 中運行時,就更加需要注意權(quán)限問題,僅在我們服務(wù)器可以操作的目錄中進行安全的文件權(quán)限修改。

      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() 函數(shù)可以獲取到指定文件的所有屬性信息,在這里我們可以看到文件的 uid 、 gid 、 ctime 、 mtime 等信息。

      軟硬文件連接相關(guān)操作

      在 Linux 系統(tǒng)中,有軟連接和硬連接的相關(guān)知識。其實軟連接就像是 Windows 中的快捷方式,而硬連接相關(guān)于復(fù)制了一份數(shù)據(jù)。在 PHP 中,也為我們提供了創(chuàng)建軟硬連接以及相關(guān)的一些操作。

      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() 函數(shù)創(chuàng)建的就是一個指定文件的硬連接文件,而使用 symlink() 創(chuàng)建的則是一個軟連接文件。相對來說,我們使用軟連接的場景會更多一些。lstat() 就和 stat() 函數(shù)的功能一樣,查看文件的各種屬性信息,不過 lstat() 函數(shù)針對的是軟硬連接文件。

      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() 這類的函數(shù)查看到的依然是原始文件的信息。我們可以在系統(tǒng)環(huán)境中使用 ls -l 查看連接文件的用戶和用戶組信息是否修改成功。

      總結(jié)

      今天的內(nèi)容比較簡單,而且修改權(quán)限的操作也并不常用。不過對于系統(tǒng)安全來,它們還是非常有用的,比如對于上傳來說,我們要預(yù)防上傳可執(zhí)行文件的話,就可以通過修改文件的權(quán)限來讓文件無法直接運行,從而起到安全保護的作用。另外,目錄路徑相關(guān)的操作也是一些框架的基礎(chǔ),幾乎所有框架的入口或者說是 Composer 的入口,都會見到 dirname() 以及 basename() 之類函數(shù)的身影。

      測試代碼:

      https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/6.PHP中的文件系統(tǒng)函數(shù)(一).php

      參考文檔:

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

        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多