我正在为用户之间的web服务管理一个无状态会话池
因此,当用户请求web服务时,他会启动会话,响应超时为5秒,因此他可以最多保持会话5秒。第二个用户进来,系统检查是否有可用的会话,然后使用它。
现在我有一个问题。当假设有一个会话可用时,用户a来了,系统检查它是否在5秒以上之前被使用,并将其分配给用户a,同时另一个用户点击,系统检查会话是否在4秒以上之前使用,并分配给用户B。
现在,使用同一会话和系统的两个用户在一个会话上都失败了。
我也尝试过选择更新命令来锁定它。
我已经尝试在第一个用户选择后立即更新上次使用的时间,但这不起作用(我认为第二个用户也在同一时间点击系统)
有人能对此提出建议吗?
代码:从数据库中检查会话(如果可用),然后选择它或插入一个新的
//get 25 sessions from database order by lastqueryDate
$session = $sessionObj->select('session', '*', '', 'LastQueryDate DESC', '25');
$available_session = array();
//if sessions available, get rows from getResult
if ($session) {
$session_Data = $sessionObj->getResult();
//now get session which is sitting there more than response time out
$available_session = $sessionObj->getAvailableSession($session_Data);
}
//if there is any, use it. otherwise create new session and save in database
if (!$available_session) {
$auth->securityAuthenticate();
$header = $auth->getHeaders();
$sequence = (int) $header['Session']->SequenceNumber + 1;
$values[] = $header['Session']->SessionId;
$values [] = $sequence;
$values [] = $header['Session']->SecurityToken;
$rows = "SessionID,SequenceNo,Security_token";
if ($sessionObj->insert('session', $values, $rows)) {
$available_session['Session']->SessionId = $header['Session']->SessionId;
$available_session['Session']->SequenceNumber = $sequence;
$available_session['Session']->SecurityToken = $header['Session']->SecurityToken;
}
}
检查数据库中会话可用性的功能:
public function getAvailableSession($session_data) {
$available_session = array();
foreach ($session_data as $key) {
if (!is_array($key)) {
$key = $session_data;
}
$date = date('Y-m-d h:i:s a', time());
$now = new DateTime($date);
$last_query_time = new DateTime($key['LastQueryDate']);
$dteDiff = $last_query_time->diff($now);
$difference = $dteDiff->format("%H:%I:%S");
//if response time out is smaller than session used last. then pick it.
if (RTO <= $difference) {
$available_session['Session']->SessionId = $key['SessionID'];
$available_session['Session']->SequenceNumber = $key['SequenceNo'];
$available_session['Session']->SecurityToken = $key['Security_token'];
// run update to update lastqueryDate as its default value set to current time stamp
$session_value = $key['SessionID'];
$rows['SequenceNo'] = $key['SequenceNo'];
$where[0] = "SessionID";
$where[2] = "'" . $session_value . "'";
$this->update('session', $rows, $where);
return $available_session;
}
}
return false;
}
一旦我发现一个会话空闲超过5秒,我就会更新数据库。
打开事务。发出"选择…进行更新"查询以获取会话数据。在脚本结束时提交事务。