2011-11-11 289 views
1

我已經使用了Google,但似乎無法讓我的腳本正常工作。在php中改變目錄權限(chmod)

這是我的代碼

if (is_dir("tmp")) { 
    if (substr(sprintf("%o", fileperms("tmp")), -4) == "0777") { 
     echo "good"; 
    } else { 
     echo "going to chmod the tmp folder to 777"; 
     if (!chmod("tmp", octdec(0777))) { // tried chmod("tmp, 0777) too 
       echo "Oops, I couldn't chmod the /setup/tmp directory, please do this manually"; 
     } 
    } 
} else { 
    echo "we'll make the folder"; 
} 

我似乎無法得到chmod來工作,我讀的地方,如果註冊全局變量是關閉那麼這將無法正常工作(我有設置設置爲關閉)。

我遵循PHP.net手冊和他們在用戶註釋中提供的一些示例,以及一些我認爲相關的堆棧溢出帖子。但也許我需要調整一些PHP設置才能使其工作?

有沒有辦法讓chmod函數無需改變PHP.ini就可以工作?

+0

是tmp目錄的php用戶所有者,還是該文件夾的組?如果不是,則不能更改文件夾的chmod。 – sascha

+0

它的主人和集團的一部分 – Eli

+0

hm,是一臺windows機器嗎? – sascha

回答

0

你還沒有給我們足夠的信息,以確定爲什麼chmod()失敗。可能是網絡服務器沒有足夠的權限來修改目錄權限。

網絡服務器進程的所有者應擁有該目錄或成爲擁有組的成員。例如,如果root擁有tmp,並且您的Web服務器以用戶'apache'運行,則不可能從PHP修改目錄的權限。

我相信你在提到的設置php.ini是用於調試,而不是神奇地'修復'chmod。嘗試在前面加上下面的代碼行到你的PHP腳本,你應該得到更多有用的調試輸出:

ini_set('display_errors', 'On'); 
error_reporting(E_ALL) 
+0

的一個示例啊,這表示操作不允許使用chmod。我可能需要查看腳本是否以擁有者用戶和權限運行。我以爲他們自己從哪裏開始設置LAMP服務器。任何建議?我確實擁有與我登錄用戶相同的所有者的apache。 – Eli

+0

如果您沒有權限在* tmp *上使用'chmod',但在服務器上有root終端訪問權限,那麼您可以使用'ps aux | grep http'來查看Apache的進程細節並找到用戶。一旦知道Apache正在運行的用戶,就可以通過'sudo chown -R webProcessUser/path/to/tmp'獲取* tmp *的目錄所有權。如果不想更改目錄所有者,並且您知道運行Apache的用戶屬於某個組,則可以改爲更改組所有者:'sudo chown -R currentOwner:newGroup/path/to/tmp' – Rob

+0

謝謝,我看看匹配了一些權限。 – Eli

0

代表這樣的: -

chmod("tmp", 0777); 
+0

我也試過,我發佈的當前版本是來自php.net chmod用戶註釋 – Eli

0

運行PHP的守護程序或Web服務器守護程序必須有您要的目錄的寫訪問的用戶文件模式。在我的情況下,www-data是運行php的用戶以及php正在嘗試運行的任何命令,它將作爲www-data用戶運行。

如果您使用php mkdir函數創建一個目錄,您會注意到該目錄的所有者是曾經運行php或webserver守護進程的人。而任何由php創建的目錄,php都能夠chmod,chown,做任何事情,因爲它是所有者。

您可以

  1. chown將此目錄讓主人是PHP的用戶
  2. 爲組設置寫權限和組設置爲同一組的PHP用戶
  3. 做些什麼像給sudo權限的PHP用戶這是不推薦順便說一句。