我正在管理一个无状态会话池,用于用户之间的Web服务。因此,当用户请求Web服务时,他开始会话,并且响应超时时间为5秒,因此他最多可以保持会话5秒钟。第二个用户进来,系统检查是否有可用的会话,然后使用它。
现在我有一个问题。例如,当有会话可用时,用户A进来,系统检查它是否在5秒前被使用过,然后分配给用户A,同时另一个用户发出请求并且系统检查该会话是否在4秒前被使用过,分配给用户B。现在两个用户都在使用同一个会话,但系统只能处理其中一个用户。
我尝试了选择更新命令来锁定它。我试图在第一个用户选择后立即更新最后使用时间,但这没有起作用(我认为第二个用户在同时访问系统)。请问有人可以提供建议吗?
代码:从数据库中检查会话是否可用,如果可用,则选择它或插入新的。
一旦我发现一个会话空闲超过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秒,我就会更新数据库。