php檔案鎖怎麼用? php檔案鎖入門教學課程

WBOY
發布: 2016-07-25 08:53:04
原創
1055 人瀏覽過
  1. $file = "temp.txt";
  2. $fp = fopen($file , 'w');
  3. if(flock($fp , LOCK_EX)){
  4. fwrite($fp , "abcn");
  5. sleep(10);
  6. fwrite($fp , "123n");
  7. flock($fp , LOCK_UN);
  8. }
  9. fclose($fp);
複製程式碼

2) b.php

  1. $file = "temp.txt";
  2. $fp = fopen($file , 'r');
  3. echo fread($ fp , 100);
  4. fclose($fp);
複製程式碼

運行a.php 後,馬上運行b.php ,可以運行b.php看到輸出: abc 等 a.php 運行後運行 b.php ,可以看到輸出: abc 123 顯然,當 a.php 寫檔案時資料太大,導致時間比較長時,這時 b.php 讀取資料不完整 以上方法在php檔案鎖定寫入實例教學有相關介紹,不明白的朋友,可以參考文章中的實例深入學習下。

修改 b.php 為:

  1. $file = "temp.txt";
  2. $fp = fopen($file , 'r');
  3. if(flock( $fp , LOCK_EX)){
  4. echo fread($fp , 100);
  5. flock($fp , LOCK_UN);
  6. } else{
  7. echo "Lock file failed...n";
  8. }
  9. fclose($fp);
複製程式碼

運行a.php 後,馬上執行b.php ,可以發現b.php 會等到a.php 運行完成後(即10 秒後)才顯示: abc 123 讀取資料完整,但時間過長,他要等待寫鎖釋放。

修改 b.php 為:

  1. $file = "temp.txt";
  2. $fp = fopen($file , 'r');
  3. if(flock( $fp , LOCK_SH | LOCK_NB)){
  4. echo fread($fp , 100);
  5. flock($fp , LOCK_UN);
  6. } else{
  7. echo "Lock file failed...nnock ";
  8. }
  9. fclose($fp);
複製程式碼

運行a.php 後,馬上執行b.php ,

運行a.php 後,馬上執行b.php ,可以看到輸出: Lock file failed… 證明可以返回鎖定文件失敗狀態,而不是向上面一樣要等很久。

結論: 建議作檔案快取時,選好相關的鎖,不然可能導致讀取資料不完整,或重複寫入資料。 file_get_contents 好像選擇不了鎖,不知道他預設用的什麼鎖,反正和不鎖得到的輸出一樣,是不完整的資料。 我是要做文件緩存,所以只需要知道是否有寫鎖存在即可,有的話就查資料庫就可以了。 測試環境:Linux(Ubuntu 6) , PHP 5.1.2 , Apache 2

再轉: 檔案鎖有兩種:共享鎖和排他鎖,也就是讀鎖(LOCK_SH)和寫鎖(LOCK_EX) 文件的鎖一般都這麼使用:
  1. $fp = fopen("filename", "a");
  2. flock($fp, LOCK_SH) or die("lock error")
  3. $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檔案鎖的入門教程,透過對比分析細述了php檔案鎖的用法,希望對大家有幫助。



來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板