首頁  >  文章  >  後端開發  >  PHP mkdir()無寫入權限的問題解決方法

PHP mkdir()無寫入權限的問題解決方法

高洛峰
高洛峰原創
2016-12-21 15:18:381355瀏覽

使用mkdir建立資料夾時,發現這個函數有兩個參數,第二個參數是為新建立的資料夾指定權限。

但是如果直接用mkdir('檔案位址', 0777);時 發現新資料夾的權限並不是777,一般情況下會是022。

因為mkdir在給資料夾制定權限時,會跟目前登入作業系統使用者的umask(使用者缺省權限屬 性)值進行位元“與”,得到的值才是最終權限值。

umask 是什麼?

我們建立檔案的預設權限是怎麼來的?如何改變這個預設權限呢?

當我們登入系統之後創建一個檔案總是有一個預設權限的,那麼這個權限是怎麼來的呢?這就是 umask 幹的事情。

umask 設定了使用者建立檔案的預設權限,它與 chmod 的效果剛好相反,umask 設定的是權限“補碼”,而 chmod 設定的是檔案權限碼。一般在 /etc/profile、$HOME/.bash_profile 或 $HOME/.profile 中設定 umask 值。

如何計算 umask 值?

umask 指令可讓你設定檔案建立時的缺省模式,對應每一類使用者(檔案屬主、同組使用者、其他使用者)存在一個對應的 umask 值中的數字。對文件來說,這一數字的最大值分別是 6。系統不允許你在建立一個文字檔案時就賦予它執行權限,必須在建立後用 chmod 指令增加這個權限。目錄則允許設定執行權限,這樣針對目錄來說,umask 中各數字最大可以到 7。

此指令的一般形式為:umask nnn,其中 nnn 可為 000 - 777。

我們只要記住 umask 是從權限中「拿走」對應的位元即可。

如:umask 值為 022,則預設目錄權限為 755,預設檔案權限為 644。
所以,如果使用者umask是022(一般預設是這個),即:000 010 010 在於mkdir指定的777 ,即:111 111 111 位元「與」後,得到的真實權限為:022。

如果想讓新建資料夾權限最大,有兩種方法可以實現:(當然,是在目前使用者能賦予最高權限的條件下)

1、修改使用者umask,php提供有umask函數:

$oldumask=umask(0); 
mkdir('test',0777); 
umask($oldumask);

這種方法看起來一勞永逸,在腳本開頭檔案裡指定下umask值,後面直接用mkdir就可以控制權限,需要注意的是:在多執行緒伺服器上使用umask函數時,多個執行緒會公用一個umask,所以可能會造成混亂。

2、使用chmod函數,這也是最常用的方法:

mkdir('文件地址', 0777); 
chmod('文件地址', 0777);

最後,需要注意一點,權限值最好使用八進位表示,即「0」開頭,而且一定不要加引號。

更多PHP mkdir()無寫權限的問題解決方法相關文章請關注PHP中文網!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn