2016-10-04 38 views
1

我有一個虛擬服務器的實例裏面的Ubuntu系統(Oracle虛擬盒)在我的電腦上運行上運行這個愚蠢的小測試PHP腳本:fopen創建文件,那麼爲什麼fwrite失敗?

<? 
error_reporting(E_ALL); 
ini_set('display_errors', 1); // show errors 

echo "<p>test</p>"; 

$filename = "andy.txt"; 
$fh = fopen($filename, 'w') or die('fopen failed'); 
fwrite($fh, "qwerty") or die('fwrite failed'); 
fclose($fh); 
?> 

儘管所有相應的目錄和文件權限被設置,它在fwrite上失敗。 fopen工作並創建文件,因此寫入訪問被明確啓用,但fwrite死亡,並輸出'fwrite failed'消息(不顯示其他錯誤輸出)。

當我上傳到我的真實服務器時,相同的腳本工作得非常好,所以我完全難以理解它爲什麼不寫入文件;也許這是關於我的虛擬服務器引起的問題。

看起來像這樣一個可憐的東西,但它讓我瘋狂!相當長的時間谷歌沒有得出答案,所以任何人在這裏請提供一些見解?非常感謝。

+1

刪除'or die('fwrite failed')'部分以查看其產生的錯誤 – Clay

+0

您是否啓用了SELinux? – NaeiKinDus

回答

2

不確定爲什麼fwrite()調用會死掉,因爲它返回寫入的字節數。

這就是說,你用file_put_contents()來代替嗎?這是寫入文件的一個簡單的方法,是因爲早期的PHP的推薦方式5.
有了它,你只需要做好以下

$filename = "andy.txt"; 
if(!file_put_contents ($contents, $filename)) { 
    // Write failed! 
} 

無需與打開和關閉文件指針打擾,因爲這是由函數自動處理的。 :)

1

解決!這是我的虛擬服務器上的磁盤空間錯誤。在我的腦海裏,我知道我在其他地方已經看到了這個寫作失敗的問題,但在這種情況下,我沒有建立聯繫。

@ChristianF謝謝!切換到file_put_contents()是非常有益的,因爲它也失敗了,但給了我一個有意義的錯誤消息:

'file_put_contents(): Only 0 of 6 bytes written, possibly out of free disk space' 

啊哈!回想起越來越多的日誌文件可能成爲問題,我自己把它刪除/ var/log(保存之後)和Presto!它現在工作!所以,謝謝你的提示 - 我將從現在開始使用file_put_contents。 BTW:error.log本身的內容是2GB,而其他所有其他大小的/ var/log只有大約15MB,但是刪除error.log本身並不起作用,所以我刪除了所有內容。

@Clayton Smith謝謝,但刪除「或死('fwrite失敗')」部分沒有導致任何進一步的錯誤信息 - 這是如此令人沮喪:這是一個恥辱,那些錯誤報告指令在劇本的開始似乎沒有太多。

@NaeiKinDus謝謝,但我不認爲我有SELinux正在運行(恐怕我對此一無所知)。雖然我有一個/ etc/selinux目錄,但它裏面沒有配置文件,只是看起來像是一個框架semanage.conf - 無論如何。諸如sestatus之類的命令無法識別。

+0

啊,得到愛信息錯誤信息。 :)很高興我能幫忙,並且你已經整理出來了。感謝你回來告訴我們真正的問題是什麼。 :) – ChristianF

+0

糟糕!沒有完全解決。刪除所有的日誌創建它自己的問題 - 我不應該如此傲慢。Apache失敗了,因爲它無法找到它的日誌文件,並且MySQL現在無法啓動,但這是我猜想的另一個故事。 – schenken

+0

嘿,是不是典型的...我建議在服務器上設置日誌輪換,從長遠來看將爲您節省很多麻煩! – ChristianF