有時候你的php指令碼或許需要線程安全的保證,比如進行檔案寫操作的時候。本文提供了檔案加鎖函數以及使用樣本。檔案加鎖功能也可以用來獲得獨享的處理空間,防止指令碼執行發生同步錯誤。
代碼如下:
<?php/**lock_thisfile:獲得獨享鎖*@param $tmpFileStr 用來作為共用鎖定檔案的檔案名稱(可以隨便起一個名字)*@param $locktype 鎖類型,預設為false(非阻塞型,也就是一旦加鎖失敗則直接返回false),設定為true則會一直等待加鎖成功才返回*@return 如果加鎖成功,則返回鎖執行個體(當使用unlock_thisfile方法的時候需要這個參數),加鎖失敗則返回false.*/function lock_thisfile($tmpFileStr,$locktype=false){ if($locktype == false) $locktype = LOCK_EX|LOCK_NB; $can_write = 0; $lockfp = @fopen($tmpFileStr.".lock","w"); if($lockfp){ $can_write = @flock($lockfp,$locktype); } if($can_write){ return $lockfp; } else{ if($lockfp){ @fclose($lockfp); @unlink($tmpFileStr.".lock"); } return false; }}/** *unlock_thisfile:對先前取得的鎖執行個體進行解鎖*@param $fp lock_thisfile方法的傳回值*@param $tmpFileStr 用來作為共用鎖定檔案的檔案名稱(可以隨便起一個名字)*/function unlock_thisfile($fp,$tmpFileStr){ @flock($fp,LOCK_UN); @fclose($fp); @fclose($fp); @unlink($tmpFileStr.".lock");}?>
代碼如下:
<?php// 使用舉例$tmpFileStr = "/tmp/mylock.loc";// 等待取得操作許可權,如果要立即返回則把第二個參數設為false.$lockhandle = lock_thisfile($tmpFileStr,true);if($lockhandle){ // 在這裡進行所有需要獨佔的交易處理。 // ... ... // 交易處理完畢。 unlock_thisfile($lockhandle,$tmpFileStr);}?>