php使用文件锁解决少量并发问题
先写一个函数来检测
function create_sn(){
mt_srand((double)microtime() * 1000000);
return date('Y-m-d H:i:s.').str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}
先看一张没有使用文件锁的并发截图,看截图我们知道如果在并发状态下是存在重复的时间的。
#非阻塞模式:
$fp = fopen("lock.txt", "r");
if(flock($fp,LOCK_EX | LOCK_NB))
{
echo create_sn();
flock($fp,LOCK_UN);
}else
{
echo "系统繁忙,请稍后再试";
}
fclose($fp);
#阻塞(等待)模式:
$fp = fopen("lock.txt", "w");
if(flock($fp,LOCK_EX))
{
echo create_sn();
flock($fp,LOCK_UN);
}
fclose($fp);
ps:文件锁只适合在小并发情况下使用。大流量并发使用redis我们下次说。