DATA/BYBIT/daemon/collection/bybit_total_env.php
<?php
// ============================================================
// 환경기 : bybit_total_env.php
// 루프 밖 단발 실행 - 심볼 배열 구성해서 타격기에 던지기
// ============================================================

function get_db_connection() {
    try {
        $db_upbit = null;
        @include '/home/www/DB/db_upbit.php';
        if (!($db_upbit instanceof PDO)) return null;
        $pdo = $db_upbit;
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
    } catch (Throwable $e) {
        return null;
    }
}

function get_gnu_connection() {
    try {
        $db_gnu  = null;
        $pdo_gnu = null;
        $pdo     = null;
        @include '/home/www/DB/db_gnu.php';
        if ($db_gnu instanceof PDO) {
            $db_gnu->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $db_gnu;
        }
        if ($pdo_gnu instanceof PDO) {
            $pdo_gnu->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $pdo_gnu;
        }
        if ($pdo instanceof PDO) {
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $pdo;
        }
        return null;
    } catch (Throwable $e) {
        return null;
    }
}

// DB 연결
$pdo     = get_db_connection();
$pdo_gnu = get_gnu_connection();

// 그누보드에서 활성 심볼 읽기 (단발)
$stmt = $pdo_gnu->prepare("
    SELECT wr_subject FROM g5_write_daemon_total_bybit
    WHERE (x2_run = 1 OR x2_run = '1')
");
$stmt->execute();
$all_symbols = $stmt->fetchAll(PDO::FETCH_COLUMN);

// 심볼 정규화
$clean_symbols = [];
foreach ($all_symbols as $sym) {
    $sym = strtoupper(trim((string)$sym));
    if ($sym === '') continue;
    if (strpos($sym, 'USDT') === false && strpos($sym, '-') === false) {
        $sym .= 'USDT';
    }
    if (!in_array($sym, $clean_symbols, true)) $clean_symbols[] = $sym;
}

// 60개씩 청크로 포장
$symbol_chunks = array_chunk($clean_symbols, 60);

// API 주소 정의 (단발)
$API_TICKERS       = 'https://api.bybit.com/v5/market/tickers?category=linear&symbol=';
$API_KLINE         = 'https://api.bybit.com/v5/market/kline?category=linear&interval=1&limit=1&symbol=';
$API_ACCOUNT_RATIO = 'https://api.bybit.com/v5/market/account-ratio?category=linear&period=1d&limit=1&symbol=';
$API_INDEX_KLINE   = 'https://api.bybit.com/v5/market/index-price-kline?category=linear&interval=1&limit=1&symbol=';

// → $pdo, $symbol_chunks, $API_* 타격기에서 사용