用文件锁排他锁实现商品秒杀、抢购

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lenovo403/article/details/50722734

在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙",计数器存储抢购的商品数量,避免查询数据库。

阻塞(等待)模式:并发时,当有第二个用户请求时,会等待第一个用户请求完成、释放锁,获得文件锁之后,程序才会继续运行下去

<?php
$fp = fopen('lock.txt', 'w');
if(flock($fp, LOCK_EX)){   //文件独占锁,阻塞
	$number; // 计数器
	
	if($number>=1){
		//处理订单 
		$number--;
	}else{
		//商品已经抢购完
	}
	flock($fp, LOCK_UN); //释放锁

}
fclose($fp);
?>
非阻塞模式:并发时,第一个用户请求,拿得文件锁之后。后面请求的用户直接返回系统繁忙,请稍后再试

<?php
$fp = fopen('lock.txt', 'w');
if(flock($fp, LOCK_EX|LOCK_NB)){   //文件独占锁,非阻塞
	$number; // 计数器
	
	if($number>=1){
		//处理订单 
		$number--;
	}else{
		//商品已经抢购完
	}
	flock($fp, LOCK_UN);//释放锁

}else{
   //系统繁忙,请稍后再试
}
fclose($fp);
?>



没有更多推荐了,返回首页