2
我們構建了一個PHP腳本來緩存服務器(Debian Wheezy,帶有SELinux,Apache,PHP 5.3.26)的硬盤驅動器(ext4)上的映像。PHP的file_get_contents()有時會返回零字節/ false
類似下面的代碼用於:
$data = "...";
$file = "cached_foo_1234.jpg";
if (!is_file($file)) file_put_contents($file, $data);
在劇本之後,同樣的文件被打開閱讀:
$content = file_get_contents($file);
儘管硬盤驅動器上正確的數據,有時$在文件寫入文件系統的時間內容是空的。函數filesize()顯示相同的行爲。
任何日誌文件(審計,php等)都沒有錯誤。在file_get_contents()之上放置clearstatcache()或在file_put_contents()中使用LOCK_EX鎖定文件不會有幫助。該腳本與相同的文件名並行訪問很多。 Apache直接返回現有的緩存圖像,而不需要PHP。
我猜文件鎖定應該避免空文件寫入時的返回。
當我們試圖從文件系統中讀取文件時,爲什麼我們會得到零字節?
是否運行web服務器的用戶有權限R/W/X文件系統/目錄?另外,該文件是否在webroot之外? – Braiam
'file_get_contents'不會*查看*諮詢鎖,不會輕視它們。您需要鎖定閱讀器*和*作者。 – Charles
用戶擁有正確的權限。問題有時會發生,並非總是如此。爲什麼文件化的行爲完全一樣? – olliiiver