2016-08-12 18 views
0

我創建了一個函數來將設置存儲到文件(以可讀的方式),以便稍後通過直接編輯文件來修改設置。php寫入文件會產生語法錯誤和內容順序錯誤的輸出

我用的方法是here

$data = "<?php return ".var_export($var, true).";"; 
file_put_contents($filename, $data); 

似乎時,有較低的沒有作出更改該文件要求做工精細,但是當有多個併發請求的文件內容都充滿了語法錯誤或內容錯誤的訂單,有時它仍然是空的。

我嘗試使用file_get_conents(..)與第三個參數LOCK_EX和fwrite()使用flock()後,但也導致相同的怪異行爲。這裏發生了什麼?如何糾正?

+0

你發現「不同的內容」?像什麼? –

回答

0

這裏的問題是部分保存。使用flock()似乎沒有幫助,因爲它只是設置諮詢鎖定,並可以被其他進程忽略,如here所述。

防止部分保存的唯一選擇是首先將數據寫入臨時文件,然後用臨時文件替換現有文件。

我通過使用shell命令移動並替換原始文件來糾正了該問題。

$data = "<?php return ".var_export($var, true).";"; 
file_put_contents($filename, $data); 
exec("move tempfile ".$filename); // PHP copy()/rename() seemed to be affected by simultaneous requests. 

這些誰不明白是怎麼回事:

當同一個文件被讀取並通過並行某些進程可能讀取的數據運行多個進程同時修改另一個進程完成之前寫這本有時會導致錯誤/不完整的數據被存入文件。

相關問題