高并发下社区间歇性出现(Discuz! Database Error)Bug修复 New
Bug:高并发下,pre_common_session会员认证表的delete操作表锁冲突导致数据库连接数耗尽,适用X3.2、X3.4
Fix:
public function delete_by_session($session, $onlinehold, $guestspan) {
if(!empty($session) && is_array($session)) {
$onlinehold = time() - $onlinehold;
$guestspan = time() - $guestspan;
$session = daddslashes($session);
$condition = " sid='{$session[sid]}' ";
$condition .= " OR lastactivity<$onlinehold ";
$condition .= " OR (uid='0' AND ip1='{$session['ip1']}' AND ip2='{$session['ip2']}' AND ip3='{$session['ip3']}' AND ip4='{$session['ip4']}' AND lastactivity>$guestspan) ";
$condition .= $session['uid'] ? " OR (uid='{$session['uid']}') " : '';
//DB::delete('common_session', $condition);
//fix by wangxj
$query = DB::query("SELECT sid FROM ".DB::table('common_session')." WHERE $condition");
$sids = array();
while ($row = DB::fetch($query)) {
$sids[] = $row['sid'];
}
// 按主键sid删除
if (!empty($sids)) {
DB::delete('common_session', DB::field('sid', $sids));
}
}
}
我知道答案 回答被采纳将会获得1 贡献 已有0人回答
Fix:
public function delete_by_session($session, $onlinehold, $guestspan) {
if(!empty($session) && is_array($session)) {
$onlinehold = time() - $onlinehold;
$guestspan = time() - $guestspan;
$session = daddslashes($session);
$condition = " sid='{$session[sid]}' ";
$condition .= " OR lastactivity<$onlinehold ";
$condition .= " OR (uid='0' AND ip1='{$session['ip1']}' AND ip2='{$session['ip2']}' AND ip3='{$session['ip3']}' AND ip4='{$session['ip4']}' AND lastactivity>$guestspan) ";
$condition .= $session['uid'] ? " OR (uid='{$session['uid']}') " : '';
//DB::delete('common_session', $condition);
//fix by wangxj
$query = DB::query("SELECT sid FROM ".DB::table('common_session')." WHERE $condition");
$sids = array();
while ($row = DB::fetch($query)) {
$sids[] = $row['sid'];
}
// 按主键sid删除
if (!empty($sids)) {
DB::delete('common_session', DB::field('sid', $sids));
}
}
}
我知道答案 回答被采纳将会获得1 贡献 已有0人回答