DATA/BYBIT/daemon/stats/daemon_bybit_stats_direction.php
<?php
// 1. 외부 DB 설정 로드 및 핸들러 지정
include_once('/home/www/DB/db_upbit.php');
$db_upbit = $pdo; 

// 2. 환경 설정
set_time_limit(0);
ignore_user_abort(true);
ob_implicit_flush(true);
while (ob_get_level()) ob_end_clean();

// [추가] 데몬 식별 및 상태 관리 변수
$DAEMON_ID = pathinfo(__FILE__, PATHINFO_FILENAME);
$PID = getmypid();
$last_heartbeat_time = 0;

// [추가] 데몬 상태 갱신 함수
function update_daemon_status($db, $id, $pid, $status) {
    try {
        $sql = "INSERT INTO upbit_data.daemon_record 
                (d_id, d_category, d_pid, d_status, d_heartbeat, d_start_time)
                VALUES (:id, 'STATS_BYBIT_SYNC', :pid, :status, NOW(), NOW())
                ON DUPLICATE KEY UPDATE
                d_pid = :pid2, d_status = :status2, d_heartbeat = NOW()";
        $stmt = $db->prepare($sql);
        $stmt->execute([
            ':id'      => $id, 
            ':pid'     => $pid, 
            ':pid2'    => $pid, 
            ':status'  => $status, 
            ':status2' => $status
        ]);
    } catch (Exception $e) {
        echo "Status Update Fail: " . $e->getMessage() . "\n";
    }
}

echo "Daemon Started: Bybit to Stats Sync (Safe Mode & Status Enabled)\n";

// 3. 메인 루프
while (true) {
    try {
        // [상태 갱신] 1초 주기로 하트비트 업데이트
        if (time() - $last_heartbeat_time >= 1) {
            update_daemon_status($db_upbit, $DAEMON_ID, $PID, 'RUNNING');
            $last_heartbeat_time = time();
        }

        // [Step 1] 대상 심볼 목록 로드
        $stmt_symbols = $db_upbit->query("SELECT symbol FROM stats_direction_01_bybit");
        $symbols = $stmt_symbols->fetchAll(PDO::FETCH_COLUMN);

        if ($symbols) {
            foreach ($symbols as $symbol) {
                // [Step 2] 원장 데이터 추출 (최신 1건)
                $sel_sql = "SELECT lastPrice, price24hPcnt, collected_at 
                            FROM daemon_bybit_coin_1s 
                            WHERE symbol = :symbol 
                            ORDER BY id DESC LIMIT 1";
                
                $sel_stmt = $db_upbit->prepare($sel_sql);
                $sel_stmt->execute([':symbol' => $symbol]);
                $data = $sel_stmt->fetch(PDO::FETCH_ASSOC);

                if ($data) {
                    // [Step 3] 통계 테이블 업데이트 (ID 제외, 심볼 기준)
                    $up_sql = "UPDATE stats_direction_01_bybit 
                               SET lastPrice = :lastPrice, 
                                   price24hPcnt = :price24hPcnt, 
                                   collected_at = :collected_at 
                               WHERE symbol = :symbol";
                    
                    $up_stmt = $db_upbit->prepare($up_sql);
                    $up_stmt->execute([
                        ':lastPrice'    => $data['lastPrice'],
                        ':price24hPcnt' => $data['price24hPcnt'],
                        ':collected_at' => $data['collected_at'],
                        ':symbol'       => $symbol
                    ]);
                }
            }
        }
    } catch (PDOException $e) {
        echo "Error: " . $e->getMessage() . "\n";
    }

    // 0.5초 대기
    usleep(500000);
}