平平博客平平博客

平平

ping@setbug.com

平平网络setbug.com

文章数
31801
评论数
3056
浏览数
9962134
平平
ping@setbug.com
平平网络setbug.com

php高并发文件锁新解决方案

代码片段2020-05-08 2424  0 
摘要:起因平平以前在api网站中加入了调用次数统计,由于采用的文件存储,读取后会清空然后加一后写...

起因

平平以前在api网站中加入了调用次数统计,由于采用的文件存储,读取后会清空然后加一后写入,导致几个用户同时用的时候次数重置了。

内置文件锁

一开始我也没有关心这个问题,直到上次写身份证图登记时剩余次数需要减一,如果并发大一点就会出现bug。于是我用了php内置文件锁flock,但是出现了更意想不到的问题,就是会出现死锁,无论你怎么防范,总有一次会出现问题,然后导致之后的所有操作都出现问题。一开始我以为是自己代码问题,后来查阅了一些资料,发现这是php设计的问题。

解决思路

最简单的就是利用临时文件来解决这个问题,首先判断锁文件是否存在,如果不存在那么就等待,设置一个超时时间,超时就返回Timeout,如果存在那么就把锁文件改名,然后访问目标文件或者执行目标操作,完成或者失败之后把锁文件名字改回来。

解决代码
function start(){
//程序开始或者操作开始时调用
        $startTime = time();
	do{
	if(file_exists('users/temp') && !file_exists('users/temp_temp')){
	if(rename('users/temp','users/temp_temp')){
		clearstatcache();
		break;
	}else{
	        error('timeout');
	        exit;
	}}
	usleep(50000);
	}while((time()-$startTime) < 2);
}
function end(){
//结束时调用
        @rename('users/temp_temp','users/temp');
        exit;
}

继续阅读
标签:教程bugphp代码高并发文件锁解决方案片段代码锁死锁
写代码真的很累!麻烦点个赞,评论一下,然后分享给自己的小伙伴!
打赏
海报分享
发表评论
表情
快捷
私密

右滑验证