//方法一 并发下调用接口示例 每次只允许处理一个进程
public function test1(){
$id = rand(1,5);
//先打开一个文件(已经存在的文件可任意模式打开,不存在的文件不能用r和r+模式)
$fp = fopen(APP_PATH."Lib/Pay/pay_log/test_log.txt","r");
//打开后被访问的文件加独占锁 用以阻塞执行代码期间 其它进程对这个文件的访问 让其它进程处于等待状态
if(flock($fp,LOCK_EX)){
//以下进行业务逻辑的处理
$list = M("test")->where("id={$id}")->find();
if($list && $list['status']<1){
$add_data['test_id'] = $id;
$add_data['time'] = 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);
}
}
//以上进行业务逻辑的处理
}
//关闭文件 释放独占锁 使其它进程继续访问
fclose($fp);
}
//方法二、利用临时文件的锁进行并发控制 根据订单id值的不同,可以同时处理多个不通订单的进程 相同订单并发会被阻塞,需要一个个执行
public function test2(){
//接收调用接口时回传的订单id 用以创建文件
$order_id=empty($_GET['order_id'])?0:$_GET['order_id'];
//先打开一个文件(已经存在的文件可任意模式打开,不存在的文件不能用r和r+模式)
$file_path = APP_PATH."Lib/Pay/pay_log/test";
$fp = fopen("{$file_path}/{$order_id}.txt","w");
//打开后给北方网的文件加独占锁 已阻塞 执行代码期间 其它进程对这个文件的访问 让其它进程处于等待状态
if(flock($fp,LOCK_EX)){
//处理自己的业务逻辑代码
$list = M("test")->where("id={$order_id}")->find();
if($list && $list['status']<1){
$add_data['test_id'] = $order_id;
$add_data['time'] = time();
$add_rus = M("test_log")->add($add_data);
if($add_rus){
$save_data['id'] = $order_id;
$save_data['status'] = 1;
$up_rus = M('test')->save($save_data);
}
}
}
fclose($fp);
//删除临时文件
unlink("{$file_path}/{$order_id}.txt");
} 最佳答案