最近,项目中的所有crond定时尽量取消,改成触发式。
比如每日6点清理数据。
原来的逻辑,写一个crond定时搞定
现在改为触发式
6点之后第一个玩家/用户 进入,才开始清理数据。
出现了一个问题
1 如何确保第一个玩家触发?
update xxx set shijian = date('Y-m-d',time()-6*3600) 返回为0 则表示已有人触发过 返回1 表示第一个玩家 触发
这又出现了一个问题:
第一个人进入,触发清理数据。
第二个人进入,进入正常数据操作,但是第一个人触发的清理数据操作也许并未完成。第二个玩家操作的数据可能被清理数据清理掉,如何防止??
最后总结了一套比较可行的方案:
$t = date(Y-m-d,time()-3600*6);
if( 执行sql'update xxx set sj_start = $t'返回的0|1 ) {
更新操作
sj_end=今天
}
if( sj_end = 今天 ){
正常操作流程
}else{
echo '正在更新操作,请稍后';
}