总所知周,并发容易造成数据的重复处理,我的一个项目给游戏客户端提供了接口,游戏用户相对较多,如果使用数据库排它锁消耗的资源较高,
因而使用了文件的排它锁来应对并发。
思路是打开一个文件并取得文件的独占锁,采用的是非阻塞,当程序运行完毕再释放独占锁资源。
/** * 加锁,独占锁 */ public function lockFile() { $this->handle=fopen(‘lock‘,‘w+‘); if($this->handle){ //如果文件被锁定则非阻塞操作 if(flock($this->handle,LOCK_EX | LOCK_NB)){ return true; }else{ \Log::INFO(‘并发啦‘); $this->ajaxMessage(1,‘服务器繁忙,稍后再试‘); } } return false; }
/** *解锁 */ public function unlockFile() { if($this->handle){
//释放锁定 flock($this->handle,LOCK_UN); clearstatcache(); fclose($this->handle); } }