|
发表于 2016/11/21 15:32
|
显示全部楼层
|阅读模式
|Google Chrome 45.0.2454.101 |Windows 7
<?php
02
/**
03
* 用于解决PHP在并发时候的锁控制,不同的锁之间并行执行,类似mysql innodb的行级锁
04
* @author www.phpernote.com
05
*/
06
class FileLock{
07
//文件锁存放路径
08
private $path='';
09
//文件句柄
10
private $fp='';
11
//锁文件
12
private $lockFile='';
13
/**
14
* 构造函数
15
* @param string $path 锁的存放目录
16
* @param string $name 锁 KEY
17
*/
18
public function __construct($name,$path=''){
19
if(empty($path)) $this->path=dirname(__FILE__)。'/';
20
else $this->path=$path;
21
$this->lockFile=$this->path.md5($name)。'.lock';
22
}
23
24
/**
25
* 加锁
26
*/
27
public function lock(){
$this->fp=fopen($this->lockFile,'a+');
if($this->fp===false){
return false;
}
return flock($this->fp,LOCK_EX);//获取独占锁
}
/**
* 解锁
*/
public function unlock(){
if($this->fp!==false){
@flock($this->fp,LOCK_UN);
clearstatcache();
}
@fclose($this->fp);
@unlink($this->lockFile);
}
}
文件锁类使用示例:
查看代码打印
<?php
$userid=21;
$article_id=108;
//对业务请求加锁
$lock=new FileLock($userid.$article_id);
$lockResult=$lock->lock();
if(!$lockResult){
echo '当前请求速度过快,请稍后访问!';
$lock->unlock();
exit;
}
/*
正常的业务逻辑处理
*/
//业务逻辑处理完毕解锁
$lock->unlock(www.9ask.cn/suqian/); |
|