PHP – 檔案許可權



許可權的概念是 Unix/Linux 檔案系統的核心。許可權決定了誰可以訪問檔案以及如何訪問檔案。Linux 中的檔案許可權由chmod 命令操作,該命令可以在 Linux 終端中執行。PHP 提供了chmod() 函式,您可以用它以程式設計方式處理檔案許可權。

只有在 Linux 作業系統上工作時,PHP 的 chmod() 函式才有效。它在 Windows 上不起作用,因為 Windows 作業系統有不同的檔案許可權控制機制。

要檢視檔案上啟用的許可權,請使用“ls -l”命令(長列表)獲取檔案列表。

mvl@GNVBGL3:~$ ls -l

-rwxr-xr-x 1 mvl mvl 16376 May  5 21:52 a.out
-rw-r--r-- 1 mvl mvl    83 May  5 21:52 hello.cpp
-rwxr-xr-x 1 mvl mvl    43 Oct 11 14:50 hello.php
-rwxr-xr-x 1 mvl mvl    43 May  8 10:01 hello.py
drwxr-xr-x 5 mvl mvl  4096 Apr 20 21:52 myenv

第一列包含每個檔案的許可權標誌。第三列和第四列分別指示每個檔案的擁有者和組,後面跟著大小、日期和時間以及檔名。

許可權字串包含十個字元,其含義如下:

位置 含義
1 如果為目錄則為“d”,如果為普通檔案則為“-”
2, 3, 4 檔案擁有者(使用者)的讀、寫、執行許可權
5, 6, 7 組的讀、寫、執行許可權
8, 9, 10 其他使用者的讀、寫、執行許可權

許可權字串中的字元具有以下含義:

含義
- 標誌未設定。
r 檔案可讀。
w 檔案可寫。對於目錄,可以建立或刪除檔案。
x 檔案可執行。對於目錄,可以列出檔案。

如果您考慮上述列表中的第一個條目:

-rwxr-xr-x 1 mvl mvl 16376 May  5 21:52 a.out

"a.out" 檔案由使用者 "mvl" 和組 "mvl" 擁有。它是一個普通檔案,擁有者具有“讀/寫/執行”許可權,組和其他人具有“讀/執行”許可權。

許可權標誌的二進位制和八進位制表示可以透過下表理解:

八進位制數字 二進位制表示 (rwx) 許可權
0 000
1 001 僅執行
2 010 僅寫入
3 011 寫入和執行
4 100 僅讀取
5 101 讀取和執行
6 110 讀取和寫入
7 111 讀取、寫入和執行(完全許可權)

chmod() 函式

chmod() 函式可以更改指定檔案的許可權。成功時返回true,失敗時返回false

chmod(string $filename, int $permissions): bool

chmod() 函式嘗試將指定檔案($filename)的模式更改為 permissions 中給定的模式。

第二個引數$permissions是一個具有四個八進位制數字的八進位制數。第一位始終為零,第二位指定擁有者的許可權,第三位指定擁有者的使用者組的許可權,第四位指定其他所有人的許可權。每一位都是每種許可權值的總和。

1 執行許可權
2 寫入許可權
4 讀取許可權

$permissions引數的預設值為0777,這意味著目錄以啟用執行、寫入和讀取許可權的方式建立。

示例

請看下面的例子:

<?php

   // Read and write for owner, nothing for everybody else
   chmod("/PhpProject/sample.txt", 0600);

   // Read and write for owner, read for everybody else
   chmod("/PhpProject/sample.txt", 0644);

   // Everything for owner, read and execute for everybody else
   chmod("/PhpProject/sample.txt", 0755);

   // Everything for owner, read for owner's group
   chmod("/PhpProject/sample.txt", 0740);
?>

chown() 函式

chown() 函式嘗試將檔案 filename 的所有者更改為新使用者。請注意,只有超級使用者才能更改檔案的所有者。

chown(string $filename, string|int $user): bool

示例

請看下面的例子:

<?php

   // File name and username to use
   $file_name= "index.php";
   $path = "/PhpProject/backup: " . $file_name ;
   $user_name = "root";

   // Set the user
   chown($path, $user_name);

   // Check the result
   $stat = stat($path);
   print_r(posix_getpwuid(fileowner($path)));
?>

chgrp() 函式

chgrp() 函式嘗試將檔案 filename 的組更改為 group。

chgrp(string $filename, string|int $group): bool

只有超級使用者才能任意更改檔案的組;其他使用者可以將檔案的組更改為該使用者所屬的任何組。

示例

請看下面的例子:

<?php
   $filename = "/PhpProject/sample.txt";
   $format = "%s's Group ID @ %s: %d\n";
   printf($format, $filename, date('r'), filegroup($filename));
   chgrp($filename, "admin");
   clearstatcache();  	// do not cache filegroup() results
   printf($format, $filename, date('r'), filegroup($filename));
?>

它將產生以下輸出

/PhpProject/sample.txt's Group ID @ Fri, 13 Oct 2023 07:42:21 +0200: 0
/PhpProject/sample.txt's Group ID @ Fri, 13 Oct 2023 07:42:21 +0200: 0
廣告