//---并发下日志写入方案
$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);
}