程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP文件鎖的使用方法

PHP文件鎖的使用方法

編輯:PHP綜合
  文件鎖有兩種:共享鎖和排他鎖,也就是讀鎖(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寫完並釋放鎖之後才進行讀。

*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved