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的时候,会有一定几率出现错误