// 최근 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