一旦工作,那就要努力的干,聪明的干,快速的干——用省下来的时间干自己喜欢干的事情。!

Yii2使用DbSession时,同时调用写session和删除session的时候,会有一定几率出现错误

Yii lampnick 2786℃ 0评论

yii2使用DbSession的时候,如果两个接口同时请求了 Yii::$app->user->logout()【会删除session】和Yii::$app->user->isGuest【或者 Yii::$app->user->login($user)】会写入session,当logout 调用destroySession方法删除数据库中的记录的同时,另外一个接口能够获取到这条待删除的记录Id,然后去调用writeSession方法时判断有记录就会去数据库更新这条记录,当准备更新的时候,这条记录已经被删除了,就会报找不到要更新的记录的错误(有一定的机率发生,不是必然出错)

源代码如下:

\yii\web\DbSession::writeSession

public function writeSession($id, $data)
 {
 // exception must be caught in session write handler
 // http://us.php.net/manual/en/function.session-set-save-handler.php
 try {
     $expire = time() + $this->getTimeout();
     $query = new Query;
     $exists = $query->select(['id'])
     ->from($this->sessionTable)
     ->where(['id' => $id])
     ->createCommand($this->db)
     ->queryScalar();
 if ($exists === false) {
     $this->db->createCommand()
     ->insert($this->sessionTable, [
     'id' => $id,
     'data' => $data,
     'expire' => $expire,
     ])->execute();
 } else {
     $this->db->createCommand()
     ->update($this->sessionTable, ['data' => $data, 'expire' => $expire], ['id' => $id])
     ->execute();
 }
 } catch (\Exception $e) {
     $exception = ErrorHandler::convertExceptionToString($e);
 // its too late to use Yii logging here
     error_log($exception);
     echo $exception;
return false;
 }
return true;
 }

\yii\web\DbSession::destroySession//这段代码是从数据库中删除记录

public function destroySession($id)
 {
     $this->db->createCommand()
     ->delete($this->sessionTable, ['id' => $id])
     ->execute();
    return true;
 }

 

 

转载请注明:MitNick » Yii2使用DbSession时,同时调用写session和删除session的时候,会有一定几率出现错误

喜欢 (2)or分享 (0)
头像
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址