// 최근 X초 내 활동 인원 (기본 60초 창)
function qx_active_count($window_sec = 60){
$w = max(15, (int)$window_sec);
$row = sql_fetch("SELECT COUNT(*) AS c
FROM g5_queue_active
WHERE qa_last_seen >= NOW() - INTERVAL {$w} SECOND");
return (int)$row['c'];
}
// 남는 슬롯만큼 자동 PASS
function qx_auto_release() {
$gate = qx_get_gate();
if ((int)$gate['enabled'] !== 1) return;
// 주기(안전장치) – 너무 잦은 실행 방지
$now = time();
$last = $gate['last_release_at'] ? strtotime($gate['last_release_at']) : 0;
if ($now - $last < max(1,(int)$gate['release_every_sec'])) return;
$active = qx_active_count(60); // 최근 60초 내 활성
$cap = max(0, (int)$gate['max_concurrent'] - (int)$gate['idle_buffer']); // 목표-버퍼
$room = max(0, $cap - $active); // 현재 남는 슬롯
if ($room <= 0) {
// 그래도 타임스탬프는 갱신
sql_query("UPDATE g5_queue_gate SET last_release_at=NOW() WHERE id=1");
return;
}
// 이번에 열어줄 인원: 남는 슬롯, 배치크기, 대기 인원 중 최소
$waiting = (int)sql_fetch_value("SELECT COUNT(*) FROM g5_queue_ticket WHERE qt_status='WAIT'");
$n = min((int)$gate['batch_size'], $room, $waiting);
if ($n <= 0) {
sql_query("UPDATE g5_queue_gate SET last_release_at=NOW() WHERE id=1");
return;
}
$now_str = date('Y-m-d H:i:s');
sql_query("UPDATE g5_queue_ticket
SET qt_status='PASS', qt_activated_at='{$now_str}'
WHERE qt_status='WAIT'
ORDER BY qt_created_at ASC
LIMIT {$n}");
sql_query("UPDATE g5_queue_gate SET last_release_at='{$now_str}' WHERE id=1");
}
Fatal error: Uncaught Error: Call to undefined function qx_get_gate() in C:\xampp\htdocs\common.php:217
Stack trace:
#0 C:\xampp\htdocs\bbs\_common.php(2): include_once()
#1 C:\xampp\htdocs\bbs\board.php(2): include_once('C:\\xampp\\htdocs...')
#2 {main}
thrown in C:\xampp\htdocs\common.php on line 217