1.加锁解锁方法
<?php
/*
*lock_thisfile:获得独享锁
*@param $fileStr 用来作为共享锁文件的文件名(可以随便起一个名字)
*@param $locktype 锁类型,缺省为false(非阻塞型,也就是一旦加锁失败则直接返回false),设置为true则会一直等待加锁成功才返回
*@return 如果加锁成功,则返回锁实例(当使用unlock方法的时候需要这个参数),加锁失败则返回false.
*/
function lock($fileStr,$locktype=false){
if($locktype == false)
$locktype = LOCK_EX|LOCK_NB;
$can_write = 0;
$lockfp = @fopen($fileStr.".lock","w");
if($lockfp){
$can_write = @flock($lockfp,$locktype);
}
if($can_write){
return $lockfp;
}
else{
if($lockfp){
@fclose($lockfp);
@unlink($fileStr.".lock");
}
return false;
}
}
/*
*unlock:对先前取得的锁实例进行解锁
*@param $fp lock方法的返回值
*@param $fileStr 用来作为共享锁文件的文件名(可以随便起一个名字)
*/
function unlock($fp,$fileStr){
@flock($fp,LOCK_UN);
@fclose($fp);
@fclose($fp);
@unlink($fileStr.".lock");
}
?>
2.应用实例
<?php
// 使用举例
$fileStr = "/tmp/mylock.loc";
// 等待取得操作权限,如果要立即返回则把第二个参数设为false.
$locker = lock($fileStr,true);
if($locker){
// 在这里进行所有需要独占的事务处理。
// ... ... //如果a正在访问时,b进行访问,b等待;在a访问结束后b进行访问
// 事务处理完毕。
unlock($locker,$fileStr);
}
?>