看板 PHP 關於我們 聯絡資訊
請問多台Web主機對同一個檔案操作應該如何避免檔案被改壞掉... 我是有找到flock來使用 但是這個flock指令只有原來的主機認得,同時間如果有其他台主機要寫那個檔案 還是會把它寫壞掉 例如web1主機要寫/tmp/test.inc這個檔案(有使用flock來做檔案lock的動作) 可是只有web1主機的其他程序會等待test.inc檔案的lock結束 其它台主機(web2、web3)的程序仍然會對那個檔案作寫入的動作,然後檔案裡面就會亂七八糟(被寫壞了) 所以想請問各位先進,如果遇到多台主機要對單一檔案操作應該如何處理? web1 web2 web3 主機會mount同一個網路空間 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.131.226
buganini:開.lock temp file? 10/09 15:52
guardlan:開.lock的方式一開始有做,但是檔案仍然會寫壞掉... 10/09 16:09
guardlan: if($FH = fopen($file_path, 'w+')){ 10/09 16:10
guardlan: while((strtotime('now') - $starttime <= $wait 10/09 16:10
guardlan: if(!file_exists($file_path.'.lock')){ 10/09 16:10
guardlan: $canwrite = TRUE; 10/09 16:11
guardlan: break; 10/09 16:11
guardlan: } 10/09 16:11
guardlan: usleep(round(rand(0, 300)*1000)); 10/09 16:11
guardlan: } 10/09 16:11
guardlan: touch($file_path.'.lock'); 10/09 16:11
guardlan: fwrite($FH, $file_content); 10/09 16:12
guardlan: unlink($file_path.'.lock'); 10/09 16:12
guardlan: fclose($FH); 10/09 16:12
guardlan: } 10/09 16:12
guardlan:不知道這樣的寫法是不是有問題,程式上線後檔案依然寫壞. 10/09 16:13
guardlan:少copy到一行...touch的前面有 if($canwrite){ 10/09 16:15
chocho1981:為何不用大E修改文章阿= =? 這樣推不會累嗎 10/09 17:17
arrack:$wait 時間如何確保夠長? 10/09 18:38
arrack:而且那行 似乎有錯誤 10/09 18:38
buganini:對了NFS應該不能確保即時性吧.. 10/10 00:57
buganini:lock本身也是個有點歷史的問題 10/10 00:57
world294:/ect/init.d/nfslock start 這不行嗎? 10/10 14:42
guardlan:$wait 時間目前是先暫時給個2秒...因為那個檔案很小... 10/12 10:15
guardlan:最討厭的是偏偏不能使用DB來存資料...非得用檔案... 10/12 10:16
guardlan:如果兩秒後 $canwrite還是false的話則跳過不處理 10/12 10:19
guardlan:我好像沒有大E可以用...按shift + e沒反應... 10/12 10:29
guardlan:看來只能跟上頭反映這機制沒辦法做了XD 10/12 10:36
arrack:如果有DB,用DB來存LOCK資訊也不錯 10/12 12:12
guardlan:用DB的話就不會有這個問題...因為某些原因不能使用DB... 10/13 10:02