php lock sh,php文件加锁 lock_sh ,lock_ex
參考網站:http://hi.baidu.com/honly1215/item/8d27a66d11689c3aac3e83fe
文件鎖有兩種:共享鎖和排他鎖,也就是讀鎖(LOCK_SH)和寫鎖(LOCK_EX)
文件的鎖一般這么使用:
$fp?=?fopen("filename","a");
flock($fp,?LOCK_SH)?or?die("lock?error")
$str?=?fread($fp,1024);
flock($fp,?LOCK_UN);
fclose($fp);
注意fwrite之后,文件立即就被更新了,而不是等fwrite然后fclose之后文件才會更新,這個可以通過在fwrite之后fclose之前讀取這個文件進行檢查
但是什么時候使用lock_ex什么時候使用lock_sh呢?
讀的時候:
如果不想出現dirty數據,那么最好使用lock_sh共享鎖。可以考慮以下三種情況:
1.?如果讀的時候沒有加共享鎖,那么其他程序要寫的話(不管這個寫是加鎖還是不加鎖)都會立即寫成功。如果正好讀了一半,然后被其他程序給寫了,那么讀的后一半就有可能跟前一半對不上(前一半是修改前的,后一半是修改后的)
2.?如果讀的時候加上了共享鎖(因為只是讀,沒有必要使用排他鎖),這個時候,其他程序開始寫,這個寫程序沒有使用鎖,那么寫程序會直接修改這個文件,也會導致前面一樣的問題
3.?最理想的情況是,讀的時候加鎖(lock_sh),寫的時候也進行加鎖(lock_ex),這樣寫程序會等著讀程序完成之后才進行操作,而不會出現貿然操作的情況
寫的時候:
如果多個寫程序不加鎖同時對文件進行操作,那么最后的數據有可能一部分是a程序寫的,一部分是b程序寫的
如果寫的時候加鎖了,這個時候有其他的程序來讀,那么他會讀到什么東西呢?
1.?如果讀程序沒有申請共享鎖,那么他會讀到dirty的數據。比如寫程序要寫a,b,c三部分,寫完a,這時候讀讀到的是a,繼續寫b,這時候讀讀到的是ab,然后寫c,這時候讀到的是abc.
2.?如果讀程序在之前申請了共享鎖,那么讀程序會等寫程序將abc寫完并釋放鎖之后才進行讀。
總結
以上是生活随笔為你收集整理的php lock sh,php文件加锁 lock_sh ,lock_ex的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php chilkat.certstor
- 下一篇: 架构 php_十年PHP架构师的成长之路