最近,項目中的所有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 '正在更新操作,請稍后';
}