PHP鎖定機制

2022-08-30 04:57:08 字數 3643 閱讀 4644

bool flock ( int handle, int operation [, int &wouldblock] );

flock() 操作的 handle 必須是乙個已經開啟的檔案指標。operation 可以是以下值之一:

要取得共享鎖定(讀取程式),將 operation 設為 lock_sh(php 4.0.1 以前的版本設定為 1)

要取得獨佔鎖定(寫入程式),將 operation 設為 lock_ex(php 4.0.1 以前的版本中設定為 2)

要釋放鎖定(無論共享或獨佔),將 operation 設為 lock_un(php 4.0.1 以前的版本中設定為 3)

如果你不希望 flock() 在鎖定時堵塞,則給 operation 加上 lock_nb(php 4.0.1 以前的版本中設定為 4)

建兩個檔案

(1) a.php

?$file="temp.txt";

$fp=fopen($file,'w');

if(flock($fp, lock_ex))

fclose($fp);

(2) b.php

?$file="temp.txt";

$fp=fopen($file,'r');

echofread($fp, 100);

fclose($fp);

執行 a.php 後,馬上執行 b.php ,可以看到輸出:

abc等 a.php 執行完後執行 b.php ,可以看到輸出:

abc123

顯然,當 a.php 寫檔案時資料太大,導致時間比較長時,這時 b.php 讀取資料不完整

修改 b.php 為:

?$file="temp.txt";

$fp=fopen($file,'r');

if(flock($fp, lock_ex))else

fclose($fp);

執行 a.php 後,馬上執行 b.php ,可以發現 b.php 會等到 a.php 執行完成後(即 10 秒後)才顯示:

abc123

讀取資料完整,但時間過長,他要等待寫鎖釋放。

修改 b.php 為:

?$file="temp.txt";

$fp=fopen($file,'r');

if(flock($fp, lock_sh | lock_nb))else

fclose($fp);

執行 a.php 後,馬上執行 b.php ,可以看到輸出:

lock file failed…

證明可以返回鎖檔案失敗狀態,而不是向上面一樣要等很久。

結論:建議作檔案快取時,選好相關的鎖,不然可能導致讀取資料不完整,或重複寫入資料。

file_get_contents 好像選擇不了鎖,不知道他預設用的什麼鎖,反正和不鎖得到的輸出一樣,是不完整的資料。

我是要做檔案快取,所以只需要知道是否有寫鎖存在即可,有的話就查資料庫就可以了。

測試環境:linux(ubuntu 6) , php 5.1.2 , apache 2

再**檔案鎖有兩種:共享鎖和排他鎖,也就是讀鎖(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寫完並釋放鎖之後才進行讀。

mysql的鎖定機制 MySQL鎖定機制

一 樂觀鎖與悲觀鎖 1.1 樂觀鎖與使用版本號實現樂觀鎖 樂觀鎖假設認為資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則對使用者返回錯誤資訊,讓使用者決定如何去處理。實現方式為版本號和時間戳。使用版本號時,可以在資料初始化時指定乙個版本號...

mysql鎖定機制

標籤 空格分隔 mysql 鎖 mysql對於不同儲存引擎支援不同的鎖定機制,myisam和memory儲存引擎採用的是表級鎖 innodb採用行級鎖,也支援表級鎖 bdb儲存引擎採用的是頁級鎖同時也支援表級鎖。行級鎖最大特點是鎖定物件的粒度很小,發生資源競爭的概率就比較小,故而能提高較大的併發處理...

Notes鎖定機制

notes鎖定機制是 r6 的乙個新功能,軟鎖 是存在使用者的客戶端 記憶體中,只允許乙個使用者同時編輯文件。去掉軟鎖辦法 notes client的notes.ini引數中增加乙個edit no soft locks 1 或者寫 更改dim session as new notessession ...