2013-12-12 34 views
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。

我猜文件鎖定應該避免空文件寫入時的返回。

當我們試圖從文件系統中讀取文件時,爲什麼我們會得到零字節?

+0

是否運行web服務器的用戶有權限R/W/X文件系統/目錄?另外,該文件是否在webroot之外? – Braiam

+0

'file_get_contents'不會*查看*諮詢鎖,不會輕視它們。您需要鎖定閱讀器*和*作者。 – Charles

+0

用戶擁有正確的權限。問題有時會發生,並非總是如此。爲什麼文件化的行爲完全一樣? – olliiiver

回答

1

遇到此問題,並發現它是由於文件名包含不允許的字符而導致無效。

要刪除無效的文件名字符使用:

$bad = array_merge(
    array_map('chr', range(0,31)), 
    array("<", ">", ":", '"', "/", "\\", "|", "?", "*")); 
$result = str_replace($bad, "", $filename); 

Filename practice