class AppLock{ function __construct($appid) { $this->m_appid = $appid; //初始化数据 $this->get(); } function __destruct() { $this->free(); } public function alloc() { if ($this->m_bGot == true) { return true; } $this->repairData(); $appid = $this->m_appid; $ret = $this->update($appid,APPLOCK_MODE_FREE,APPLOCK_MODE_ALLOC); if ($ret === false) { app_error_log('applock alloc fail'); return false; } if ($ret <= 0) { app_error_log('applock alloc fail,affected_rows:$ret'); return false; } $this->m_bGot = true; return true; } public function free() { if ($this->m_bGot != true) { return true; } $appid = $this->m_appid; $ret = $this->update($appid,APPLOCK_MODE_ALLOC,APPLOCK_MODE_FREE); if ($ret === false) { app_error_log('applock free fail'); return false; } if ($ret <= 0) { app_error_log('applock free fail,affected_rows:$ret'); return false; } $this->m_bGot = false; return true; } function repairData() { $db = APP_DB(); $appid = $this->m_appid; $now = time(); $need_time = $now - APPLOCK_REPAIR_SECS; $str_need_time = date('Y-m-d H:i:s', $need_time); $db->where('appid',$appid); $db->where('lock_mode',APPLOCK_MODE_ALLOC); $db->where('change_time <=',$str_need_time); $db->set('lock_mode',APPLOCK_MODE_FREE); $db->set('change_time','NOW()',false); $ret = $db->update(TB_APPLOCK); if ($ret === false) { app_error_log('repair applock error,appid:$appid'); return false; } return true; } private function get() { $db = APP_DB(); $appid = $this->m_appid; $db->where(\'appid\', $appid); $query = $db->get(TB_APPLOCK); if ($query === false) { app_error_log('AppLock get fail.appid:$appid'); return false; } if (count($query->result_array()) <= 0) { $applock_data = array( \'appid\'=>$appid, \'lock_mode\'=>APPLOCK_MODE_FREE, ); $db->set(\'change_time\',\'NOW()\',false); $ret = $db->insert(TB_APPLOCK, $applock_data); if ($ret === false) { app_error_log('applock insert fail:$appid'); return false; } //重新获取数据 $db->where(\'appid\', $appid); $query = $db->get(TB_APPLOCK); if ($query === false) { app_error_log('AppLock get fail.appid:$appid'); return false; } if (count($query->result_array()) <= 0) { app_error_log('AppLock not data,appid:$appid'); return false; } } $applock_data = $query->row_array(); return $applock_data; } private function update($appid,$old_lock_mode,$new_lock_mode) { $db = APP_DB(); $db->where(\'appid\',$appid); $db->where(\'lock_mode\',$old_lock_mode); $db->set(\'lock_mode\',$new_lock_mode); $db->set(\'change_time\',\'NOW()\',false); $ret = $db->update(TB_APPLOCK); if ($ret === false) { app_error_log('update applock error,appid:$appid,old_lock_mode:$old_lock_mode,new_lock_mode:$new_lock_mode'); return false; } return $db->affected_rows(); } //是否获取到了锁 public $m_bGot = false; public $m_appid;} |
|