2024 年日本 PHP 研討會

chmod

(PHP 4, PHP 5, PHP 7, PHP 8)

chmod變更檔案模式

說明

chmod(字串 $filename, 整數 $permissions): 布林值

嘗試將指定檔案的模式變更為 permissions 中給定的模式。

參數

filename

檔案的路徑。

permissions

請注意,permissions 不會自動被假設為八進位值,因此為了確保預期的操作,您需要在 permissions 前面加上零 (0)。諸如 "g+w" 之類的字串將無法正常運作。

<?php
chmod
("/somedir/somefile", 755); // 十進位;可能不正確
chmod("/somedir/somefile", "u+rwx,go+rx"); // 字串;不正確
chmod("/somedir/somefile", 0755); // 八進位;正確的模式值
?>

permissions 參數由三個八進位數字組成,依序指定了檔案擁有者、擁有者所屬的群組以及其他所有人的存取權限。每個數字可以透過將目標用戶所需的權限加總計算得出。數字 1 表示授予執行權限,數字 2 表示授予寫入權限,數字 4 表示授予讀取權限。將這些數字加總即可指定所需的權限。您也可以在 Unix 系統上使用 'man 1 chmod' 和 'man 2 chmod' 指令了解更多關於模式的資訊。

<?php
// 擁有者可讀寫,其他人沒有任何權限
chmod("/somedir/somefile", 0600);

// 擁有者可讀寫,其他人可讀
chmod("/somedir/somefile", 0644);

// 擁有者所有權限,其他人可讀和執行
chmod("/somedir/somefile", 0755);

// 擁有者所有權限,擁有者群組可讀和執行
chmod("/somedir/somefile", 0750);
?>

回傳值

成功時回傳 true,失敗時回傳 false

錯誤/例外

失敗時,會發出 E_WARNING 錯誤。

注意事項

注意事項:

目前的使用者是指執行 PHP 的使用者。它可能與您一般使用 shell 或 FTP 登入的使用者不同。在大多數系統上,只有檔案的擁有者才能更改檔案的模式。

注意此函式無法用於 遠端檔案,因為要檢查的檔案必須可透過伺服器的檔案系統存取。

參見

新增筆記

使用者貢獻的筆記 6 則筆記

MethodicalFool
14 年前
注意,註解中的一些範例建議這樣做

chmod(file_or_dir_name, intval($mode, 8));

然而,如果 $mode 是一個整數,那麼 intval( ) 不會修改它。所以,這段程式碼...

$mode = 644;
chmod('/tmp/test', intval($mode, 8));

...會產生如下所示的權限

1--w----r-T

請改用 octdec( ),像這樣

chmod(file_or_dir_name, octdec($mode));

另請參閱:https://php.dev.org.tw/manual/en/function.octdec.php
Geoff W
14 年前
注意在第二個參數周圍使用引號...

如果您使用引號,例如

chmod (file, "0644");

PHP 不會報錯,但在執行 chmod 之前會隱式轉換為整數。不幸的是,隱式轉換沒有考慮八進位字串,因此您最終會得到一個整數版本 644,也就是八進位的 1204
masha at mail dot ru
19 年前
實用參考

值 權限等級
400 擁有者讀取
200 擁有者寫入
100 擁有者執行
40 群組讀取
20 群組寫入
10 群組執行
4 全域讀取
2 全域寫入
1 全域執行

(取自 http://www.onlamp.com/pub/a/php/2003/02/06/php_foundations.html)
chris at ocproducts dot com
4 年前
Windows 的檔案權限模型與 Unix 非常不同,並且僅最低限度地整合它們。

在 Windows 上,此函數所能做的就是更改「唯讀」旗標,如果 $mode & 0200 沒有通過,則會開啟該旗標。
也就是說,它只檢查位元遮罩中是否缺少 u+w,如果缺少,則設定唯讀旗標。

無法設定可執行旗標,因為 Windows 根據檔案副檔名決定它。
無法設定寫入旗標,因為 Windows 根據 ACL 決定寫入權限,而 ACL 並未在此整合。
alex at feidesign dot com
19 年前
如果您因為安全模式限制而無法使用 PHP 更改檔案/目錄的權限,但您可以使用 FTP 更改它們,則只需使用 PHP 的 FTP 函數(例如 ftp_chmod 或 ftp_site)。效率不高,但有效。
sander
15 年前
如果您也想更改目錄的權限,請使用以下程式碼

<?php
$iterator
= new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathname), RecursiveIteratorIterator::SELF_FIRST);

foreach(
$iterator as $item) {
chmod($item, $filemode);
}
?>
To Top