= 2) {
$status = 'RUNNING';
}
}
?>
PID 파일 경로:
PID 파일 존재:
PID 값:
[]
DAEMON RUNNING
🔴
DAEMON STOPPED
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Throwable $e) {}
// API
$api = require '/home/www/DB/upbit_api_url.php';
$API_TICKER = $api['ticker'] . '?markets=';
function http_get_json($url){
$ctx = stream_context_create([
'http'=>[
'timeout'=>6,
'header'=>"User-Agent: upbit-daemon\r\n",
]
]);
$raw = @file_get_contents($url,false,$ctx);
if ($raw === false) return null;
$j = json_decode($raw,true);
return is_array($j) ? $j : null;
}
// ===============================
// FIXED KRW MARKETS (7종목 고정)
// ===============================
$krw = [
'KRW-BTC',
'KRW-ETH',
'KRW-XRP',
'KRW-DOGE',
'KRW-ADA',
'KRW-SOL',
'KRW-BCH',
];
// ===============================
// SQL (기존 그대로)
// ===============================
$stmt = $pdo->prepare("
INSERT INTO daemon_upbit_Ticker (
market,
trade_date, trade_time, trade_date_kst, trade_time_kst,
opening_price, high_price, low_price, trade_price,
prev_closing_price,
`change`, change_price, change_rate,
signed_change_price, signed_change_rate,
trade_volume, acc_trade_volume, acc_trade_volume_24h,
acc_trade_price, acc_trade_price_24h,
highest_52_week_price, highest_52_week_date,
lowest_52_week_price, lowest_52_week_date,
collected_at, collected_ms,
day_of_week,
daemon_id,
daemon_pid,
daemon_heartbeat
) VALUES (
:market,
:trade_date, :trade_time, :trade_date_kst, :trade_time_kst,
:opening_price, :high_price, :low_price, :trade_price,
:prev_closing_price,
:change, :change_price, :change_rate,
:signed_change_price, :signed_change_rate,
:trade_volume, :acc_trade_volume, :acc_trade_volume_24h,
:acc_trade_price, :acc_trade_price_24h,
:highest_52_week_price, :highest_52_week_date,
:lowest_52_week_price, :lowest_52_week_date,
:collected_at, :collected_ms,
:day_of_week,
:daemon_id,
:daemon_pid,
:daemon_heartbeat
)
ON DUPLICATE KEY UPDATE
trade_price=VALUES(trade_price),
change_rate=VALUES(change_rate),
daemon_pid=VALUES(daemon_pid),
daemon_heartbeat=VALUES(daemon_heartbeat),
collected_at=VALUES(collected_at),
collected_ms=VALUES(collected_ms)
");
// ===============================
// LOOP
// ===============================
while (true) {
$ms = (int)(microtime(true) * 1000);
$at = date('Y-m-d H:i:s');
$tks = http_get_json($API_TICKER . implode(',', $krw));
if (!$tks) {
usleep(200000);
continue;
}
foreach ($tks as $t) {
$stmt->execute([
':market'=>$t['market'] ?? '',
':trade_date'=>$t['trade_date'] ?? '',
':trade_time'=>$t['trade_time'] ?? '',
':trade_date_kst'=>$t['trade_date_kst'] ?? '',
':trade_time_kst'=>$t['trade_time_kst'] ?? '',
':opening_price'=>$t['opening_price'] ?? 0,
':high_price'=>$t['high_price'] ?? 0,
':low_price'=>$t['low_price'] ?? 0,
':trade_price'=>$t['trade_price'] ?? 0,
':prev_closing_price'=>$t['prev_closing_price'] ?? 0,
':change'=>$t['change'] ?? '',
':change_price'=>$t['change_price'] ?? 0,
':change_rate'=>$t['change_rate'] ?? 0,
':signed_change_price'=>$t['signed_change_price'] ?? 0,
':signed_change_rate'=>$t['signed_change_rate'] ?? 0,
':trade_volume'=>$t['trade_volume'] ?? 0,
':acc_trade_volume'=>$t['acc_trade_volume'] ?? 0,
':acc_trade_volume_24h'=>$t['acc_trade_volume_24h'] ?? 0,
':acc_trade_price'=>$t['acc_trade_price'] ?? 0,
':acc_trade_price_24h'=>$t['acc_trade_price_24h'] ?? 0,
':highest_52_week_price'=>$t['highest_52_week_price'] ?? 0,
':highest_52_week_date'=>$t['highest_52_week_date'] ?? '',
':lowest_52_week_price'=>$t['lowest_52_week_price'] ?? 0,
':lowest_52_week_date'=>$t['lowest_52_week_date'] ?? '',
':collected_at'=>$at,
':collected_ms'=>$ms,
':day_of_week'=>(int)date('w'),
':daemon_id'=>$DAEMON_ID,
':daemon_pid'=>getmypid(),
':daemon_heartbeat'=>$ms,
]);
}
usleep(200000);
}
}
// ===============================
// 웹 영역
// ===============================
extract($_GET, EXTR_SKIP);
// 실행
if (isset($start) && $start === 'yes') {
$cmd = 'nohup php ' . escapeshellarg(__FILE__) . ' --daemon > /dev/null 2>&1 &';
@exec($cmd);
?>
베스트 코인 데몬 실행 요청 완료
베스트 코인 유령데몬 삭제 페이지 : 무당 부적 부착 -> 데몬 실행
데몬 삭제 완료";
}
?>
베스트 코인 유령데몬 관리 페이지 : 플렛폼 0S 테이블 추가