2015-10-07 20 views
1

我有一個運行在各種平臺上的Javascript應用程序。 (我試圖保持客戶端設備的列表儘可能大,包括早期的Android手機和早期的iPhone,使用caniuse.com)。爲什麼PHP文件只能在99.7%的嘗試中完全成功添加

每次客戶端應用程序的數據發生更改時,新數據都會附加到服務器上的純文本日誌文件中。附錄是大約20個字符到70個字符之間的單個字符串。

問題

每隔一段時間 - 在250左右一個時間 - 追加的第6到20個字符去擅離職守。

客戶端設備上的JavaScript應用程序通過XmlHttpRequest將數據發送到Windows PC上的PHP 5.5.10,然後將該數據寫入NAS的掛載分區上的磁盤文件(在PC上掛載爲Windows驅動器盤符) 。

的PHP是一個貓鼬web服務器上運行的Windows 7,然後將數據存儲在硬盤驅動器上的服務器的網絡上的國內網絡附加存儲設備上。 (Debian Linux NAS設備)NAS有時需要幾秒鐘才能啓動硬盤。

只有一個客戶端設備正在與任何特定的純文本文件,但多達10點客戶的設備可能在任何給定的時間內訪問各自的純文本文件。

的問題

有什麼事情,如果我修復服務器+ NAS組合上的延遲,這將消失? (例如,通過將文件本地放在服務器上)例如,

或者是否有辦法使用新設施來保證寫入?比如說,通過寫入SQLite表而不是純文本文件,或者Couchbase數據庫或CouchDB等。

只要客戶端設備的參與保持爲一個簡單的XmlHttpRequest,我可以保持廣泛的客戶端設備。

回答

0

我不認爲這裏有足夠的信息去做,太多的系統和太少的信息。 只有我能想到的是這是一個併發問題。

如果您正在寫入磁盤上的文件,如果兩個請求同時進入,會發生什麼情況?如果你閱讀,然後寫,你可能會被第一個覆蓋的第二個請求結束。例如:

Process 1 receives data Y. 
Process 2 receives data Z. 
Process 1 reads data X from the disk. 
Process 2 reads data X from the disk. 
Process 1 writes to the disk, data is now XY 
Process 2 writes to the disk, data is now XZ 

在此示例中,Y丟失。

如果你使用一個數據庫(MySQL的,沙發等),如果數據已經閱讀和寫作之間的改變,但應該的問題少。在個別情況下在那裏我不得不讀的東西和編輯確切的事情,我用沿

UPDATE table SET data = "XY" WHERE data = "X" 

行這意味着如果數據改變了我讀X之後,它不會更新查詢的東西該字段,這是我可以在代碼中觀察和處理的內容。

0

fwrite的PHP文檔說它是一個原子操作 - 要麼寫入所有東西,要麼什麼都不寫。

這指出它是PHP中的一個錯誤。

我已經提交缺陷報告。

關於工作輪的任何想法? (在今天的測試中,沒有任何寫入是部分的,12個丟失了,17個是亂序發生的 - 即與客戶端發送信息的順序不同,總數爲42) 。

+0

我已經改變了 _fopen($文件名, 「A」); fwrite($ stuff); FCLOSE()_ 序列 _file_put_contents($文件名,$的東西,FILE_APPEND | LOCK_EX)_ 這增加了一個隱含的文件鎖定的過程中,FCLOSE釋放()。 這應該使所有寫入成功或完全失敗。 (與目前的情況相反,它們偶爾會部分失敗) –

相關問題