php代码锁
2020-12-13 15:51
标签:des class blog code java http 在为台湾公司开发“保证金交易系统”的过程中,出现了这样的情况: 一个间银行有n个操作员,可以同时在系统中下单,系统需要判断银行的保证金是否足够来决定是否可以下单成功。账号保证金足够,正常下单,账号保证金不足则给出提示。 当n个操作员同时操作时,会有这样的情况发生: 分成两个阶段:1、判断保证金 2、进行交易,扣除交易的金额。 A经过第一阶段 判断保证金 足够,B 经过第一阶段 判断保证金 足够。 A进行交易,扣减保证金金额。注意此时 B已经经过判断了,还未进行交易,而此时账户金额变化了。 有可能B的交易金额,大于账号的金额。不满足交易条件。但此时B已经经过了第一阶段的判断,然后系统会将银行的账号扣为负数,B的交易完成。 对于这个问题需要用锁来解决。以下是我搜集的资料: 据说目前PHP并没有完善的线程支持,甚至部署到基于线程模型的httpd服务器都会产生一些问题,但即使是多进程模型下的PHP,也难免出现多进程共同访问同一资源的情况。比如整个程序共享的数据缓存,或者因为资源受限而必须对特定处理过程进行排队,以及针对每个用户生成唯一的某种标识的情形。PHP语言自身没有提供进程互斥和锁定机制,因而使得在这些情况下的编程遇到了困难,目前了解到的可选的办法有以下这些: 有这么一个需求:生成文件的时候,由于多用户都有权限进行生成,防止并发下,导致生成的结果出现错误,需要对生成的过程进行加锁,只容许一个用户在一个时间内进行操作,这个时候就需要用到锁了,将这个操作过程锁起来。在用了cache的时候,cache失效可能导致瞬间的多数并发请求穿透到数据库此时也可以得需要用锁在同一并发的过程中将这个操作锁定。 针对以上的2种情况,现在的解决方法是对处理过程进行锁机制,通过PHP实现如下: 用到了Eaccelerator的内存锁和文件锁,原理:判断系统中是否安了EAccelerator如果有则使用内存锁,如果不存在,则进行文件锁。根据带入的key的不同可以实现多个锁直接的并行处理,类似Innodb的行级锁。 具体类如下: 使用如下: 黏贴完了。下面自己写的测试文件: 可以打开两个cmd进行测试,结果必须第一个输入完成后,第二个cmd才会有输出,程序阻塞。结果: 这里有一个不友好的方面,如果锁里面的代码执行时间太长,那么其他用户一直被阻塞,不能得到系统的提示! 这里有更好的解决方法:http://blog.163.com/lgh_2002/blog/static/4401752620114411329424/ 感谢 javascript罗浮宫群里的vi。 php代码锁,搜素材,soscw.com php代码锁 标签:des class blog code java http 原文地址:http://www.cnblogs.com/simpman/p/3796833.html
eAccelerator = function_exists("eaccelerator_lock");
if(!$this->eAccelerator)
{
$this->path = $path.($this->_mycrc32($name) % $this->hashNum).‘.txt‘;
}
$this->name = $name;
}
/**
* crc32
* crc32封装
* @param int $string
* @return int
*/
private function _mycrc32($string)
{
$crc = abs (crc32($string));
if ($crc & 0x80000000) {
$crc ^= 0xffffffff;
$crc += 1;
}
return $crc;
}
/**
* 加锁
* Enter description here ...
*/
public function lock()
{
//如果无法开启ea内存锁,则开启文件锁
if(!$this->eAccelerator)
{
//配置目录权限可写
$this->fp = fopen($this->path, ‘w+‘);
if($this->fp === false)
{
return false;
}
return flock($this->fp, LOCK_EX);
}else{
return eaccelerator_lock($this->name);
}
}
/**
* 解锁
* Enter description here ...
*/
public function unlock()
{
if(!$this->eAccelerator)
{
if($this->fp !== false)
{
flock($this->fp, LOCK_UN);
clearstatcache();
}
//进行关闭
fclose($this->fp);
}else{
return eaccelerator_unlock($this->name);
}
}
}
?>
$lock = new CacheLock(‘key_name‘);
$lock->lock();
//logic here
$lock->unlock();
//使用过程中需要注意下文件锁所在路径需要有写权限.
$handle = fopen("t.txt","r+");
if($handle!==false){ //打开成功
flock($handle, LOCK_EX);
for($i=0;$i
E:\htdocs\mytest\lab>php.exe t.php
01234567891011121314151617181920212223242526272829303132333435363738394041424344
45464748495051525354555657585960616263646566676869707172737475767778798081828384
858687888990919293949596979899
上一篇:003 逻辑 + mfc
下一篇:python异常处理