再說PHP檔案鎖,共享鎖和排它鎖注意點

高洛峰
發布: 2016-10-17 10:53:32
原創
1373 人瀏覽過

檔案鎖有兩種:共享鎖和排他鎖,也就是讀鎖(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.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!