[請益] 請問多台主機操作同個檔案應該如何鎖定檔案?

看板PHP作者 (亞修)時間16年前 (2009/10/09 15:50), 編輯推噓6(6024)
留言30則, 5人參與, 最新討論串1/1
請問多台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

10/09 15:52, , 1F
開.lock temp file?
10/09 15:52, 1F

10/09 16:09, , 2F
開.lock的方式一開始有做,但是檔案仍然會寫壞掉...
10/09 16:09, 2F

10/09 16:10, , 3F
if($FH = fopen($file_path, 'w+')){
10/09 16:10, 3F

10/09 16:10, , 4F
while((strtotime('now') - $starttime <= $wait
10/09 16:10, 4F

10/09 16:10, , 5F
if(!file_exists($file_path.'.lock')){
10/09 16:10, 5F

10/09 16:11, , 6F
$canwrite = TRUE;
10/09 16:11, 6F

10/09 16:11, , 7F
break;
10/09 16:11, 7F

10/09 16:11, , 8F
}
10/09 16:11, 8F

10/09 16:11, , 9F
usleep(round(rand(0, 300)*1000));
10/09 16:11, 9F

10/09 16:11, , 10F
}
10/09 16:11, 10F

10/09 16:11, , 11F
touch($file_path.'.lock');
10/09 16:11, 11F

10/09 16:12, , 12F
fwrite($FH, $file_content);
10/09 16:12, 12F

10/09 16:12, , 13F
unlink($file_path.'.lock');
10/09 16:12, 13F

10/09 16:12, , 14F
fclose($FH);
10/09 16:12, 14F

10/09 16:12, , 15F
}
10/09 16:12, 15F

10/09 16:13, , 16F
不知道這樣的寫法是不是有問題,程式上線後檔案依然寫壞.
10/09 16:13, 16F

10/09 16:15, , 17F
少copy到一行...touch的前面有 if($canwrite){
10/09 16:15, 17F

10/09 17:17, , 18F
為何不用大E修改文章阿= =? 這樣推不會累嗎
10/09 17:17, 18F

10/09 18:38, , 19F
$wait 時間如何確保夠長?
10/09 18:38, 19F

10/09 18:38, , 20F
而且那行 似乎有錯誤
10/09 18:38, 20F

10/10 00:57, , 21F
對了NFS應該不能確保即時性吧..
10/10 00:57, 21F

10/10 00:57, , 22F
lock本身也是個有點歷史的問題
10/10 00:57, 22F

10/10 14:42, , 23F
/ect/init.d/nfslock start 這不行嗎?
10/10 14:42, 23F

10/12 10:15, , 24F
$wait 時間目前是先暫時給個2秒...因為那個檔案很小...
10/12 10:15, 24F

10/12 10:16, , 25F
最討厭的是偏偏不能使用DB來存資料...非得用檔案...
10/12 10:16, 25F

10/12 10:19, , 26F
如果兩秒後 $canwrite還是false的話則跳過不處理
10/12 10:19, 26F

10/12 10:29, , 27F
我好像沒有大E可以用...按shift + e沒反應...
10/12 10:29, 27F

10/12 10:36, , 28F
看來只能跟上頭反映這機制沒辦法做了XD
10/12 10:36, 28F

10/12 12:12, , 29F
如果有DB,用DB來存LOCK資訊也不錯
10/12 12:12, 29F

10/13 10:02, , 30F
用DB的話就不會有這個問題...因為某些原因不能使用DB...
10/13 10:02, 30F
文章代碼(AID): #1ApkjSoV (PHP)
文章代碼(AID): #1ApkjSoV (PHP)