//---并发下日志写入方案
$fp = fopen('./log/test_log.txt', 'a+');
if (flock($fp, LOCK_EX)) {
fwrite($fp, '1\n');
flock($fp, LOCK_UN);
}
fclose($fp);
//---接口并发控制示例 这个只是测试案例,可以将锁的粒度按照一定维度或者标识往下切割到更细来提高性能
public function test()
{
$id = $_REQUEST['id'];
$fp = fopen('./test_log.txt', 'r');
//打开后给被访问的文件施加排他锁(阻塞模式) 用以阻塞执行代码期间 其它进程对这个文件的访问 让其它进程处于等待状态
if (flock($fp, LOCK_EX)) { //如果需要非阻塞模式可以用 LOCK_EX | LOCK_NB
//以下进行业务逻辑的处理
$list = M("test")->where("id={$id}")->find();
if ($list && $list['status'] < 1) {
$add_data['test_id'] = $id;
$add_data['time'] = $_SERVER['REQUEST_TIME'];
$add_rus = M("test_log")->add($add_data);
if ($add_rus) {
$save_data['id'] = $id;
$save_data['status'] = 1;
$up_rus = M('test')->save($save_data);
}
}
//以上进行业务逻辑的处理
flock($fp, LOCK_UN);//记得解锁,PHP5.3.2以后的版本不再在调用fclose的时候自动解锁
}
fclose($fp);
}
PHP中利用文件锁实现日志写入和网站接口访问等常见场景下的并发控制
点赞
收藏