看板 PHP 關於我們 聯絡資訊
用'以server_id改檔名'的招數不知可不可行? 不管是不是server_id, 只要能夠用來識別不同的伺服器就行了. 假設原共享資料檔名為 data.txt 每次要寫入資料時的程式執行步驟: loop(try5次,每隔1秒try 1次){ 1 若檔案 data.txt 不存在, 則 1.1 continue; (代表其它server佔用中) 2 以server_id改 data.txt 檔名為: [server_id]_data.txt 2.1 若2. 失敗, continue; (代表被其它server搶先一步) 3 開啟 [server_id]_data.txt 4 寫入資料; 5 將 [server_id]_data.txt 改回檔名為 data.txt 6 跳離loop; } 結束 ※ 引述《guardlan (亞修)》之銘言: : 請問多台Web主機對同一個檔案操作應該如何避免檔案被改壞掉... : 我是有找到flock來使用 : 但是這個flock指令只有原來的主機認得,同時間如果有其他台主機要寫那個檔案 : 還是會把它寫壞掉 : 例如web1主機要寫/tmp/test.inc這個檔案(有使用flock來做檔案lock的動作) : 可是只有web1主機的其他程序會等待test.inc檔案的lock結束 : 其它台主機(web2、web3)的程序仍然會對那個檔案作寫入的動作,然後檔案裡面就會亂七八糟(被寫壞了) : 所以想請問各位先進,如果遇到多台主機要對單一檔案操作應該如何處理? : web1 web2 web3 主機會mount同一個網路空間 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.115.151.184 ※ 編輯: bobju 來自: 58.115.151.184 (10/15 08:59)
guardlan:被改名的那段時間,如果有其他台主機要"讀取"該檔,會錯吧? 10/15 11:12
或許可以試試. 這是作業系統對於檔案的管理規則了, 沒深入研究我也不確定. 就我的理解, "讀取"應該不會影響到"改名", "以寫入模式開檔"才會鎖住檔案, 禁止其它程式試圖改名. 而你所提出的問題, 主要似乎是為了解決不同主機要同時"寫入"資料的矛盾, 而非讀取. 如果其它主機因目前的工作主機改變了檔案名稱而讀取失敗, 頂多 是隔時間再試讀, 至少不會造成寫入資料混亂的狀況. 僅供參考, 如果牽涉到細節的話, 恐怕這就幫不上忙了.
knives:你可以研究看看google文件是怎麼做到 10/15 11:20
bobju:那google文件有沒有透過資料庫管理來做到同步? 10/15 11:33
※ 編輯: bobju 來自: 58.115.151.184 (10/15 11:47)
guardlan:感覺這部份不靠DB來做都會有碰撞的問題... 10/15 13:21