众所周知,并发容易造成数据重复处理或者商品超卖等等情况; 如果使用数据库排他锁消耗的资源相对较高,那么这时可考虑使用文件排他锁。

阻塞(等待)模式:

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

1
2
3
4
5
6
7
8
9
<?php
$fp = fopen('lock.txt', 'w');
if(flock($fp, LOCK_EX)){ //文件独占锁,阻塞
//TODO 业务代码...

flock($fp, LOCK_UN); //释放锁
}
fclose($fp);
?>

非阻塞模式:

并发时,当第一个用户请求拿得文件锁之后。后面请求的用户直接返回系统繁忙,请稍后再试。

1
2
3
4
5
6
7
8
9
10
11
<?php
$fp = fopen('lock.txt', 'w');
if(flock($fp, LOCK_EX|LOCK_NB)){ //文件独占锁,非阻塞
//TODO 业务代码...

flock($fp, LOCK_UN);//释放锁
}else{
//系统繁忙,请稍后再试(直接返回提示)
}
fclose($fp);
?>