2012-04-29 79 views
4

由於這篇文章的標題的文件否認的是幾乎不言自明,我就跳到代碼:的fopen權限與777個權限

echo sprintf('%o', fileperms('test.txt'))."<br/>"; 

fopen("test.txt", "w"); 

而與此我得到:

100777 
fopen(test.txt): failed to open stream: Permission denied 

任何想法?

編輯:問題解決:服務器上存在未正確配置的訪問控制列表。

謝謝!

+1

也許SElinux阻止你?在文件上試試'ls -Z'。 – kichik

回答

4

我認爲它可能對文件有寫/讀權限,但對文件夾沒有寫權限。在您的網站的公共根目錄中查看,看看您是否可以讀取或寫入文件。

對於安全模式(http://php.net/manual/en/function.fopen.php),PHP文檔說以下內容:

注:當安全模式被激活,PHP將檢查 該腳本的操作的目錄是否有相同的UID(所有者)作爲正在執行的腳本 。

最後你還需要確保php有權訪問你正在嘗試寫入的文件夾。

+0

我會看看安全模式是否啓用。至於該文件夾,權限也設置爲777. – personne3000

0

我想你所遇到的問題是文件的所有權問題......你可以用它來找出問題

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

$file = "a.jpg"; 

echo sprintf ('%o', fileperms ($file)), PHP_EOL; 
echo posix_getpwuid (fileowner ($file)), PHP_EOL; // Get Owner 
echo posix_getpwuid (posix_getuid()), PHP_EOL; // Get User 

if (is_file ($file)) { 
    echo "is_file", PHP_EOL; 
    ; 
} 

if (is_readable ($file)) { 
    echo "is_readable", PHP_EOL; 
    ; 
} 

if (is_writable ($file)) { 
    echo "is_readable", PHP_EOL; 
} 

fopen ($file, "w"); 
+0

感謝您的答案,一切運行良好,直到「is_writable」(該文件顯然不是)。所有者和用戶不是一樣的,但它不應該是一個問題,因爲每個用戶都有對這個文件的寫權限......對嗎? – personne3000

+0

這可能是一個問題......除非你有root用戶..你很多人不能寫入文件.. .try通過'chown'改變所有權http://php.net/manual/en/function .chown.php和chnage文件許可,使用'chmod' http://php.net/manual/en/function.chmod.php – Baba

+0

我會要求服務器管理員來做這個事情。但是,我仍然不明白爲什麼PHP不能寫入一個文件,如果所有用戶都被允許寫入文件:-s – personne3000

0

我只是碰到了這個問題,不幸的是,錯誤信息沒有提供任何線索實際的原因。我必須將777賦給包含在給出錯誤信息的文件中的類的文件。該錯誤信息僅表示調用該類的php文件,該文件已經具有777.

因此,請檢查錯誤消息(比如說index.php)中提到的文件,然後檢查哪些類在其中實例化該文件(class-file.php,class-writer.php等)。然後檢查這些文件的權限(class-file.php,class-writer.php)。

一旦我授予了類文件的權限,它就可以正常工作。也許網絡主機改變了他們的配置,因爲一切工作到幾天前。

0

我有同樣的問題:文件夾是777,但fopen不起作用。 fopen表示允許否認。確保您的腳本具有「良好」的權限。也許它會幫助你:

echo $dst, file_exists($dst) ? ' exists' : ' does not exist', "\n"; 
echo $dst, is_readable($dst) ? ' is readable' : ' is NOT readable', "\n"; 
echo $dst, is_writable($dst) ? ' is writable' : ' is NOT writable', "\n"; 
$fh = fopen($dst, 'w'); 
if (!$fh) { 
    echo ' last error: '; 
    var_dump(error_get_last()); 
}