2013-02-13 118 views
1

我有我的筆記本電腦上運行的XAMPP虛擬Arch Linux的測試服務器,我不能讓PHP創建新的文件,即使設定在777以下權限的代碼:即使擁有777權限,爲什麼PHP不能創建文件?

$CompleteFilepath = $AFilepath . '/filepath/filename.php'; 
$FileHandle = fopen($CompleteFilepath, 'c') 
    or 
die ("cannot be opened for writing"); // Debug 

有明顯更多代碼之後,但它是無關緊要的,因爲它總是在這裏死去。我無法通過修改所有者和組設置來實現它,所以我最終採用遞歸方式將所有內容(主根文件夾除外)設置爲777,並且仍然無法工作。但該文件夾不是直接在根目錄下創建的,所以它應該沒關係,對吧?

編輯: 我仍然不確定我做錯了什麼,但今天我把所有者設置爲服務器,它的工作。我以爲我曾嘗試過,但也許不是。至少我可以繼續開發,即使我需要更安全地配置我的生產服務器。

+2

請告訴我的錯誤日誌說? – 2013-02-13 01:39:29

+0

'$ CompleteFilepath'的完整路徑是什麼?你可以在自己的腳本之外打開它嗎? – JakeGould 2013-02-13 01:40:24

+0

在錯誤消息中打印完整的文件路徑。是的,包含文件夾中的「777」應該足夠了。 – mario 2013-02-13 01:40:26

回答

0

PHP有一個名爲open_basedir的指令,它允許將文件系統上的訪問限制到指定的目錄樹。

例如,如果你在你的php.ini

open_basedir = /srv/http/:/home/:/tmp/ 

,你會訪問該文件/filepath/filename.php,則必須設置:

open_basedir = /srv/http/:/home/:/tmp/:/filepath/ 

否則PHP將無法訪問該文件。

通過這種方式,讓這臺機器上運行的所有PHP代碼訪問/filepath/目錄樹,所以它是不用於生產環境的安全。更好的方法是設置虛擬主機基於open_basedirhttpd.conf。我讓你檢查一下你的HTTP服務器文檔,也可以查看這個文檔的open_basedir

+0

謝謝。我已經重寫了生產代碼(它現在使用mod_rewrite),但是當我問這個問題時,這就是我正在尋找的東西。 – Adam11 2013-04-25 21:40:28

0

什麼PHP版本正在運行,afaik選項'c'只適用於PHP 5.2.6及更高版本。

或短:確實

$FileHandle = fopen($CompleteFilepath, 'w'); 

工作?

+0

我正在運行5.4.7,所以這不應該是一個問題。 – Adam11 2013-02-13 02:01:53

0

嗯,我把所有者設置到服務器,現在它的工作。我以爲我已經嘗試過,但顯然不是。仍然不確定我做錯了什麼,但至少現在它可以工作,所以我可以繼續開發。

0

我有一個乾淨安裝的CentOS 7的類似問題。事實證明,它默認安裝了SELinux,即使在目錄權限正確的情況下,它也可以防止所有PHP寫入。

如果安裝了SELinux

測試:sestatus

認沽SELinux的在許可模式:setenforce 0