<?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);
}