搜索
系统检测到您的用户名不符合规范:

并发下脏读、更新丢失解决方案之一

浏览:2072 发布日期:2016年09月01日 分类:技术分享 关键字: 并发 文件锁 效率 PHP
//方法一 并发下调用接口示例 每次只允许处理一个进程
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");
}
最佳答案
评论() 相关
后面还有条评论,
评论支持使用[code][/code]标签添加代码
您需要登录后才可以评论 登录 | 立即注册
收藏
cctv531529
积分:344 等级:LV2
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /