[英]More than one writes to file
我有一個Web應用程序,當用戶單擊“保存”時,應該發生對文件的寫操作。 該應用程序是“足球調度程序”,因此多個玩家可以同時單擊“保存”按鈕。
最初,我認為這將是一件罕見的事情,但事實並非如此,因為當宣布的球員參加比賽時,這是因為比賽會在很短的時間內完成。
如果兩個玩家同時按下保存,會發生什么? 只有一名球員的保存會生效,而另一名球員的保存會丟失(而且這種情況很少發生在最后一個可用位置上,然后會有一些沖突)。
我該如何應對?
//刪除了不需要的代碼
我想知道如果不使用數據庫就可以做到這一點。 因此,也沒有答案。
我想您將以與數據庫相同的方式進行處理。 向文件添加鎖,然后等待。
就像是:
while (file_exists('file.lock')) {
usleep(10000);
}
touch('file.lock');
...
unlink('file.lock');
您可能要添加超時。 我認為這樣做已經足夠安全了,但是我想兩個用戶仍然可以同時運行它。 在這種情況下,您可能需要添加一個檢查,以確保其內容已成功保存,然后再繼續。
更新:正如Marc B所指出的那樣,文件鎖定似乎包含在php中,直到他指出flock()才知道此功能。
$fp = fopen("file", "r+");
// try to acquire an exclusive lock, otherwise sleep 10ms before trying again
while (!flock($fp, LOCK_EX)) {
usleep(10000);
}
fwrite($fp, "Write something here\n");
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
fclose($fp)
這將類似於我上面編寫的功能。 當然,不要關注fwrite,我只是從php.net復制了示例以顯示flock()
工作方式。
不能同時寫入同一文件。
您可以使用一個數據庫,該數據庫可以同時處理多個訪問。 我認為這是處理和訪問大量數據的最佳解決方案!
或者,您可以將數據存儲在單獨用戶的單獨文件中,這些文件都在某個文件夾中創建,並且如果有更多文件可用,請先保存一個文件,然后再刪除它們。 然后繼續寫入主文件,直到沒有更多文件可用為止。 這將是一個解決方法,我真的不建議這樣做,但是如果您真的不想使用數據庫,無論如何它應該可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.