首頁 >後端開發 >php教程 >帶大家學習PHP中的檔案系統函數(一)

帶大家學習PHP中的檔案系統函數(一)

藏色散人
藏色散人轉載
2021-07-13 14:37:233015瀏覽

從這篇文章開始,我們將學習一系列的 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

推荐学习:《PHP视频教程

以上是帶大家學習PHP中的檔案系統函數(一)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除