php檔案鎖 bin910729 新浪部落格

2021-10-10 12:10:29 字數 1067 閱讀 2237

**:

檔案鎖有兩種:共享鎖和排他鎖,也就是讀鎖(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之檔案鎖

1 4 5 r 唯讀模式開啟 指標指向檔案頭 6 r 讀寫模式開啟 檔案指標指向檔案頭 7 w 置空寫 忽略檔案中的內容,如果檔案不存在則建立 8 w 置空讀寫模式 忽略檔案中的內容,如果檔案不存在則建立 9 a 寫入 將檔案指標指向檔案尾部 如果不存在則建立檔案 10 a 讀寫 將檔案指標指向檔案...

php 定時任務 檔案鎖 PHP檔案鎖併發操作詳解

本文主要和大家分享php檔案鎖併發操作詳解,預設的 php的檔案操作函式,不是阻塞狀態,而是自由操作狀態,希望能幫助到大家。條件 當需要乙個指令碼操作而需要阻塞另外的指令碼操作時,需要用到檔案鎖。鎖操作流程 先加鎖,檢測鎖是否加成功,如果成功再使用!鎖定型別 讀鎖 s lock share lock...

php 定時任務 檔案鎖 php檔案鎖解決高併發

前面的文章對於高併發下單商品導致商品庫存為負值的問題請先閱讀再閱讀本篇文章一定對您有幫助,建議親手測試較好。加上檔案鎖後的下單處理 一 阻塞模式 如果其他程序已經加鎖檔案,當前程序會一直等其他程序解鎖檔案後繼續執行 連線資料庫 con mysqli connect 192.168.2.186 roo...