2013-02-15 76 views
7

我目前有一個php腳本,當瀏覽器瀏覽器瀏覽到網頁時正在運行。我想要做的是在運行存儲變量的腳本時編寫一個文本文件。該文件夾的所有者是apache,但每個人都已經閱讀寫入,嚴格來說是爲了測試目的。 (我認爲這可能是一個權限問題)在服務器上啓用SELINUX,並且當我從控制檯運行腳本時,它會創建文本文件並且在正確的目錄中。file_put_contents不創建txt文件

file_put_contents("My working file location", $myString); 

我用這條線來嘗試寫入和創建文本文件,我知道我的文件位置的作品我因爲...可以運行它,並在離線模式下,即創建通過控制檯運行它。問題是我試圖編寫的變量通過HTTP Post填充,當我通過瀏覽器運行腳本時,或者Apache運行腳本時,它不寫入或創建文件。我需要做什麼才能允許訪問寫入/更改語法以獲取此腳本來編寫此文本文件?

+1

Apache的用戶應該有權目錄 - 只是嘗試執行腳本的命令行apache用戶,看看是否能工作 – user1914292 2013-02-15 18:12:25

+2

檢查Apache的錯誤日誌,它可能給你一些細節的地方失敗了。 – 2013-02-15 18:12:27

+0

什麼是$ myString值?那是對的嗎 ? – Cooper 2013-02-15 18:12:59

回答

9

您的問題可能是由於apache沒有權限寫入您指定的文件位置。進入該目錄,並檢查權限和組所有權與ls命令:

cd "My working file location" 
ls -l . 

有在顯示的權限,所有者和組的目錄輸出三列。它們很可能是由root擁有的,並且沒有apache的寫入目錄的權限。

如果是這種情況,那麼當您嘗試創建文件時,您會在apache日誌中看到一個錯誤。嘗試拖尾你的日誌運行腳本,而在你的瀏覽器:

tail -f /var/log/apache2/error.log 
+0

我固定的問題,它是一個高潮selinux權限和apache權限。 – choppyfireballs 2013-02-15 18:28:13

+2

可以很好地分享您的答案。谷歌在這裏重定向我,我仍然被阻止。 – 2015-06-02 14:10:28

+1

@VenderAeloth貌似choppyfireballs不是很活躍在這裏,但他如果他不作出迴應,那麼要確保您與我們分享您的答案,當你找到它! – 2015-06-03 18:01:26

-2

您是否嘗試過chmodding目錄中777

試試這個:

if(file_put_contents('file.txt', 'text')){ 
    die('yes'); 
} else { 
    die('no'); 
} 

魔法門的拼寫錯誤的東西。^

+1

有時這是查看錯誤的好方法 – tofutim 2015-12-04 08:44:42

1

我最近遇到了同樣的麻煩,並且偶然發現了這個問題。不幸的是,OP在評論中說,他發現他自己的解決方案,並接受了一個答案,沒有幫助我們任何人......然後經過搜索和成功,使file_put_contents再次工作,我決定分享我的解決方案。

我的文件和目錄的權限可以接受任何寫入(請確保您的目錄是chmod 757這會給根和其他授予在該位置寫入文件)。如果它仍然無法正常工作,那是因爲您的系統可能是SELinux(安全增強型Linux)系統。

如果你想確保寫入setenforce 0這會變成對SELinux的許可模式,再次運行腳本,如果它的工作原理,則意味着這個問題有很好的描述。

在這種情況下,請將selinux放回setenforce 1並嘗試ls -Zl放在項目目錄所在的目錄中。這會給你喜歡

drwx---r-x. 9 root root system_u:object_r:httpd_sys_content_t:s0 4096 Dec 8 00:25 project 

或不同的東西,但httpd_sys_content_t一條線,如果你使用chcon上下文從一個目錄轉移到這一個。但如果你沒有httpd_sys_content_t這沒關係,因爲我們需要改變那個目錄的上下文。

首先你需要接受任何public_content_rw_t上下文寫入文件。鍵入

setsebool -P httpd_anon_write on 

這將設置(P)ermanently中的SELinux httpd_anon_write爲true,被戲稱爲public_content_rw_t必須寫在自己的位置中的任何文件的權利的情況下。

現在你不得不說的SELinux您的項目目錄是public_content_rw_t或者你仍然不能寫入文件。類型:

semanage fcontext --add --type public_content_rw_t "/project(/.*)?" 

restorecon -RvF /project告訴SELinux的適用上述規定。

現在你的目錄是public_content_rw_t你應該可以寫文件。

-1

我注意到肯定,如果我的解決方案非常清晰,但它的工作:

cd /mydir/ 
setsebool -P allow_httpd_anon_write true 

問候

0

我就遇到了這個問題了。就我而言,我發現目錄的所有權是錯誤的。對於典型的Apache安裝,該目錄應該由www-data:www-data所有,而不是root:root。

+0

這不能提供問題的答案。一旦你有足夠的[聲譽](https:// stackoverflow。com/help/whats-reputation)你將能夠[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/17017422) – 2017-08-13 07:36:15