CORE TERMINAL
올드보이 & 마리아 백업
바이비트 API 실시간 플렛폼 수집 데몬 Ver.2.5 - 1차 개선판 완성 버전
DATE: 2026-03-03 23:14
핵심 항목
내용
* 바이비트 API 실시간 플렛폼 수집 데몬 Ver.2.5 - 1차 개선판 완성 버전
1. 만기 선물 컬럼 삭제에 따른 데몬 해당 컬럼 코드 삭제
1. 만기 선물 컬럼 삭제에 따른 데몬 해당 컬럼 코드 삭제
추가 내용
#!/usr/bin/php
<?php
/**
* ============================================================
* 바이비트 무기한 선물(linear) 종목 정보 수집 CLI 데몬
* - curl_multi 병렬 호출 방식 (전체 종목 동시 호출)
* - 그누보드(g5_write_daemon_kind_bybit) x2_run=1 종목만 수집
* - 저장 테이블: daemon_bybit_Ticker
* ============================================================
*/
error_reporting(E_ALL);
ini_set(\\\\\\\\\\\\\\\'display_errors\\\\\\\\\\\\\\\', 1);
date_default_timezone_set(\\\\\\\\\\\\\\\'Asia/Seoul\\\\\\\\\\\\\\\');
$DAEMON_ID = pathinfo(__FILE__, PATHINFO_FILENAME);
if (php_sapi_name() !== \\\\\\\\\\\\\\\'cli\\\\\\\\\\\\\\\') {
echo \\\\\\\\\\\\\\\"CLI 전용 데몬입니다.\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\";
exit;
}
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;
}
}
// ============================================================
// curl_multi 병렬 호출 - URL 배열 한번에 날리고 결과 반환
// ============================================================
function http_multi_get(array $urls): array {
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $key => $url) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 8,
CURLOPT_USERAGENT => \\\\\\\\\\\\\\\'bybit-ghost\\\\\\\\\\\\\\\',
CURLOPT_SSL_VERIFYPEER => false,
]);
curl_multi_add_handle($mh, $ch);
$handles[$key] = $ch;
}
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
$results = [];
foreach ($handles as $key => $ch) {
$raw = curl_multi_getcontent($ch);
$results[$key] = $raw ? json_decode($raw, true) : null;
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
return $results;
}
// ============================================================
// 전체 종목 한번에 병렬 호출 후 데이터 파싱
// ============================================================
function collectAll(array $symbols): array {
$API_INSTRUMENTS = \\\\\\\\\\\\\\\'https://api.bybit.com/v5/market/instruments-info?category=linear&symbol=\\\\\\\\\\\\\\\';
$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_RECENT_TRADE = \\\\\\\\\\\\\\\'https://api.bybit.com/v5/market/recent-trade?category=linear&limit=1&symbol=\\\\\\\\\\\\\\\';
$API_RISK_LIMIT = \\\\\\\\\\\\\\\'https://api.bybit.com/v5/market/risk-limit?category=linear&symbol=\\\\\\\\\\\\\\\';
$API_ACCOUNT_RATIO = \\\\\\\\\\\\\\\'https://api.bybit.com/v5/market/account-ratio?category=linear&period=1d&limit=1&symbol=\\\\\\\\\\\\\\\';
$API_MARK_KLINE = \\\\\\\\\\\\\\\'https://api.bybit.com/v5/market/mark-price-kline?category=linear&interval=1&limit=1&symbol=\\\\\\\\\\\\\\\';
$API_INDEX_KLINE = \\\\\\\\\\\\\\\'https://api.bybit.com/v5/market/index-price-kline?category=linear&interval=1&limit=1&symbol=\\\\\\\\\\\\\\\';
$API_PREMIUM_KLINE = \\\\\\\\\\\\\\\'https://api.bybit.com/v5/market/premium-index-price-kline?category=linear&interval=1&limit=1&symbol=\\\\\\\\\\\\\\\';
// 전체 종목 × 9개 URL 한번에 구성
$urls = [];
foreach ($symbols as $sym) {
$s = urlencode($sym);
$urls[\\\\\\\\\\\\\\\"{$sym}__info\\\\\\\\\\\\\\\"] = $API_INSTRUMENTS . $s;
$urls[\\\\\\\\\\\\\\\"{$sym}__ticker\\\\\\\\\\\\\\\"] = $API_TICKERS . $s;
$urls[\\\\\\\\\\\\\\\"{$sym}__kline\\\\\\\\\\\\\\\"] = $API_KLINE . $s;
$urls[\\\\\\\\\\\\\\\"{$sym}__trade\\\\\\\\\\\\\\\"] = $API_RECENT_TRADE . $s;
$urls[\\\\\\\\\\\\\\\"{$sym}__risk\\\\\\\\\\\\\\\"] = $API_RISK_LIMIT . $s;
$urls[\\\\\\\\\\\\\\\"{$sym}__ratio\\\\\\\\\\\\\\\"] = $API_ACCOUNT_RATIO . $s;
$urls[\\\\\\\\\\\\\\\"{$sym}__mark\\\\\\\\\\\\\\\"] = $API_MARK_KLINE . $s;
$urls[\\\\\\\\\\\\\\\"{$sym}__index\\\\\\\\\\\\\\\"] = $API_INDEX_KLINE . $s;
$urls[\\\\\\\\\\\\\\\"{$sym}__premium\\\\\\\\\\\\\\\"] = $API_PREMIUM_KLINE . $s;
}
// 한방에 병렬 호출
$raw = http_multi_get($urls);
// 종목별 파싱
$result = [];
foreach ($symbols as $sym) {
// instruments-info
$res = $raw[\\\\\\\\\\\\\\\"{$sym}__info\\\\\\\\\\\\\\\"] ?? null;
$item = ($res && ($res[\\\\\\\\\\\\\\\'retCode\\\\\\\\\\\\\\\'] ?? -1) === 0) ? ($res[\\\\\\\\\\\\\\\'result\\\\\\\\\\\\\\\'][\\\\\\\\\\\\\\\'list\\\\\\\\\\\\\\\'][0] ?? []) : [];
$lf = $item[\\\\\\\\\\\\\\\'leverageFilter\\\\\\\\\\\\\\\'] ?? [];
$pf = $item[\\\\\\\\\\\\\\\'priceFilter\\\\\\\\\\\\\\\'] ?? [];
$ls = $item[\\\\\\\\\\\\\\\'lotSizeFilter\\\\\\\\\\\\\\\'] ?? [];
// tickers
$res = $raw[\\\\\\\\\\\\\\\"{$sym}__ticker\\\\\\\\\\\\\\\"] ?? null;
$tk = ($res && ($res[\\\\\\\\\\\\\\\'retCode\\\\\\\\\\\\\\\'] ?? -1) === 0) ? ($res[\\\\\\\\\\\\\\\'result\\\\\\\\\\\\\\\'][\\\\\\\\\\\\\\\'list\\\\\\\\\\\\\\\'][0] ?? null) : null;
// kline
$res = $raw[\\\\\\\\\\\\\\\"{$sym}__kline\\\\\\\\\\\\\\\"] ?? null;
$k = ($res && ($res[\\\\\\\\\\\\\\\'retCode\\\\\\\\\\\\\\\'] ?? -1) === 0) ? ($res[\\\\\\\\\\\\\\\'result\\\\\\\\\\\\\\\'][\\\\\\\\\\\\\\\'list\\\\\\\\\\\\\\\'][0] ?? null) : null;
// recent-trade
$res = $raw[\\\\\\\\\\\\\\\"{$sym}__trade\\\\\\\\\\\\\\\"] ?? null;
$t = ($res && ($res[\\\\\\\\\\\\\\\'retCode\\\\\\\\\\\\\\\'] ?? -1) === 0) ? ($res[\\\\\\\\\\\\\\\'result\\\\\\\\\\\\\\\'][\\\\\\\\\\\\\\\'list\\\\\\\\\\\\\\\'][0] ?? null) : null;
// risk-limit
$res = $raw[\\\\\\\\\\\\\\\"{$sym}__risk\\\\\\\\\\\\\\\"] ?? null;
$r = ($res && ($res[\\\\\\\\\\\\\\\'retCode\\\\\\\\\\\\\\\'] ?? -1) === 0) ? ($res[\\\\\\\\\\\\\\\'result\\\\\\\\\\\\\\\'][\\\\\\\\\\\\\\\'list\\\\\\\\\\\\\\\'][0] ?? null) : null;
// account-ratio
$res = $raw[\\\\\\\\\\\\\\\"{$sym}__ratio\\\\\\\\\\\\\\\"] ?? null;
$a = ($res && ($res[\\\\\\\\\\\\\\\'retCode\\\\\\\\\\\\\\\'] ?? -1) === 0) ? ($res[\\\\\\\\\\\\\\\'result\\\\\\\\\\\\\\\'][\\\\\\\\\\\\\\\'list\\\\\\\\\\\\\\\'][0] ?? null) : null;
// mark-price-kline
$res = $raw[\\\\\\\\\\\\\\\"{$sym}__mark\\\\\\\\\\\\\\\"] ?? null;
$mk = ($res && ($res[\\\\\\\\\\\\\\\'retCode\\\\\\\\\\\\\\\'] ?? -1) === 0) ? ($res[\\\\\\\\\\\\\\\'result\\\\\\\\\\\\\\\'][\\\\\\\\\\\\\\\'list\\\\\\\\\\\\\\\'][0] ?? null) : null;
// index-price-kline
$res = $raw[\\\\\\\\\\\\\\\"{$sym}__index\\\\\\\\\\\\\\\"] ?? null;
$ik = ($res && ($res[\\\\\\\\\\\\\\\'retCode\\\\\\\\\\\\\\\'] ?? -1) === 0) ? ($res[\\\\\\\\\\\\\\\'result\\\\\\\\\\\\\\\'][\\\\\\\\\\\\\\\'list\\\\\\\\\\\\\\\'][0] ?? null) : null;
// premium-index-price-kline
$res = $raw[\\\\\\\\\\\\\\\"{$sym}__premium\\\\\\\\\\\\\\\"] ?? null;
$pk = ($res && ($res[\\\\\\\\\\\\\\\'retCode\\\\\\\\\\\\\\\'] ?? -1) === 0) ? ($res[\\\\\\\\\\\\\\\'result\\\\\\\\\\\\\\\'][\\\\\\\\\\\\\\\'list\\\\\\\\\\\\\\\'][0] ?? null) : null;
$result[$sym] = [
\\\\\\\\\\\\\\\'symbol\\\\\\\\\\\\\\\' => $sym,
\\\\\\\\\\\\\\\'status\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'status\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'baseCoin\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'baseCoin\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'quoteCoin\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'quoteCoin\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'settleCoin\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'settleCoin\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'launchTime\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'launchTime\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'priceScale\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'priceScale\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'minLeverage\\\\\\\\\\\\\\\' => $lf[\\\\\\\\\\\\\\\'minLeverage\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'maxLeverage\\\\\\\\\\\\\\\' => $lf[\\\\\\\\\\\\\\\'maxLeverage\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'leverageStep\\\\\\\\\\\\\\\' => $lf[\\\\\\\\\\\\\\\'leverageStep\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'minPrice\\\\\\\\\\\\\\\' => $pf[\\\\\\\\\\\\\\\'minPrice\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'maxPrice\\\\\\\\\\\\\\\' => $pf[\\\\\\\\\\\\\\\'maxPrice\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'tickSize\\\\\\\\\\\\\\\' => $pf[\\\\\\\\\\\\\\\'tickSize\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'minOrderQty\\\\\\\\\\\\\\\' => $ls[\\\\\\\\\\\\\\\'minOrderQty\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'maxOrderQty\\\\\\\\\\\\\\\' => $ls[\\\\\\\\\\\\\\\'maxOrderQty\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'qtyStep\\\\\\\\\\\\\\\' => $ls[\\\\\\\\\\\\\\\'qtyStep\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'fundingInterval\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'fundingInterval\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'copyTrading\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'copyTrading\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'unifiedMarginTrade\\\\\\\\\\\\\\\' => ($item[\\\\\\\\\\\\\\\'unifiedMarginTrade\\\\\\\\\\\\\\\'] ? 1 : 0),
\\\\\\\\\\\\\\\'postOnlyMaxOrderQty\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'lotSizeFilter\\\\\\\\\\\\\\\'][\\\\\\\\\\\\\\\'postOnlyMaxOrderQty\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'upperLimitPrice\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'upperFundingRate\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'lowerLimitPrice\\\\\\\\\\\\\\\' => $item[\\\\\\\\\\\\\\\'lowerFundingRate\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'time\\\\\\\\\\\\\\\' => (int)(microtime(true) * 1000),
\\\\\\\\\\\\\\\'lastPrice\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'lastPrice\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'prevPrice24h\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'prevPrice24h\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'price24hPcnt\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'price24hPcnt\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'highPrice24h\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'highPrice24h\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'lowPrice24h\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'lowPrice24h\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'openInterest\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'openInterest\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'markPrice\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'markPrice\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'indexPrice\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'indexPrice\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'fundingRate\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'fundingRate\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'prevPrice1h\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'prevPrice1h\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'openInterestValue\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'openInterestValue\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'turnover24h\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'turnover24h\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'volume24h\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'volume24h\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'nextFundingTime\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'nextFundingTime\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'ask1Size\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'ask1Size\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'bid1Price\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'bid1Price\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'ask1Price\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'ask1Price\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'bid1Size\\\\\\\\\\\\\\\' => $tk[\\\\\\\\\\\\\\\'bid1Size\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'start\\\\\\\\\\\\\\\' => $k[0] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'open\\\\\\\\\\\\\\\' => $k[1] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'high\\\\\\\\\\\\\\\' => $k[2] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'low\\\\\\\\\\\\\\\' => $k[3] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'close\\\\\\\\\\\\\\\' => $k[4] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'volume\\\\\\\\\\\\\\\' => $k[5] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'turnover\\\\\\\\\\\\\\\' => $k[6] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'execId\\\\\\\\\\\\\\\' => $t[\\\\\\\\\\\\\\\'execId\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'price\\\\\\\\\\\\\\\' => $t[\\\\\\\\\\\\\\\'price\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'size\\\\\\\\\\\\\\\' => $t[\\\\\\\\\\\\\\\'size\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'side\\\\\\\\\\\\\\\' => $t[\\\\\\\\\\\\\\\'side\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'isBlockTrade\\\\\\\\\\\\\\\' => ($t[\\\\\\\\\\\\\\\'isBlockTrade\\\\\\\\\\\\\\\'] ? 1 : 0),
\\\\\\\\\\\\\\\'isAdlTrade\\\\\\\\\\\\\\\' => ($t[\\\\\\\\\\\\\\\'isBlockTrade\\\\\\\\\\\\\\\'] ? 1 : 0),
\\\\\\\\\\\\\\\'mPnL\\\\\\\\\\\\\\\' => $t[\\\\\\\\\\\\\\\'mPnL\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'riskId\\\\\\\\\\\\\\\' => $r[\\\\\\\\\\\\\\\'id\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'isLowestRisk\\\\\\\\\\\\\\\' => $r[\\\\\\\\\\\\\\\'isLowestRisk\\\\\\\\\\\\\\\'] ?? 0,
\\\\\\\\\\\\\\\'maintenanceMargin\\\\\\\\\\\\\\\' => $r[\\\\\\\\\\\\\\\'maintenanceMargin\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'initialMargin\\\\\\\\\\\\\\\' => $r[\\\\\\\\\\\\\\\'initialMargin\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'limit\\\\\\\\\\\\\\\' => $r[\\\\\\\\\\\\\\\'riskLimitValue\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'buyRatio\\\\\\\\\\\\\\\' => $a[\\\\\\\\\\\\\\\'buyRatio\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'sellRatio\\\\\\\\\\\\\\\' => $a[\\\\\\\\\\\\\\\'sellRatio\\\\\\\\\\\\\\\'] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'period\\\\\\\\\\\\\\\' => 1,
\\\\\\\\\\\\\\\'m_close\\\\\\\\\\\\\\\' => $mk[4] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'i_close\\\\\\\\\\\\\\\' => $ik[4] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
\\\\\\\\\\\\\\\'p_close\\\\\\\\\\\\\\\' => $pk[4] ?? \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\',
];
}
return $result;
}
$pdo = get_db_connection();
$pdo_gnu = get_gnu_connection();
$server_ip = \\\\\\\\\\\\\\\'CLI_DAEMON\\\\\\\\\\\\\\\';
$cycle_count = 0;
$last_market_refresh = 0;
$symbols = [];
$stmt_hb = null;
$stmt_kill = null;
$stmt_stop = null;
$stmt_best = null;
while (true) {
$cycle_count++;
try {
$reconnected = false;
if (!$pdo) {
$pdo = get_db_connection();
$reconnected = true;
} else {
try { $pdo->query(\\\\\\\\\\\\\\\"SELECT 1\\\\\\\\\\\\\\\"); }
catch (Throwable $e) {
$pdo = get_db_connection();
$reconnected = true;
}
}
if ($reconnected) {
$stmt_hb = $stmt_kill = $stmt_stop = $stmt_best = null;
}
if ($pdo) {
if (!$stmt_hb) {
$stmt_hb = $pdo->prepare(\\\\\\\\\\\\\\\"
INSERT INTO daemon_record (
d_id, d_category, d_pid, d_status,
d_heartbeat, d_ip, d_start_time, d_memo, d_kill_flag
)
VALUES (
:id, \\\\\\\\\\\\\\\'BYBIT\\\\\\\\\\\\\\\', :pid, \\\\\\\\\\\\\\\'RUNNING\\\\\\\\\\\\\\\',
NOW(), :ip, NOW(), \\\\\\\\\\\\\\\'BYBIT LINEAR FUTURES GHOST\\\\\\\\\\\\\\\', 0
)
ON DUPLICATE KEY UPDATE
d_pid = VALUES(d_pid),
d_status = \\\\\\\\\\\\\\\'RUNNING\\\\\\\\\\\\\\\',
d_heartbeat = NOW(),
d_ip = VALUES(d_ip),
d_memo = VALUES(d_memo)
\\\\\\\\\\\\\\\");
}
if (!$stmt_kill) {
$stmt_kill = $pdo->prepare(\\\\\\\\\\\\\\\"SELECT d_kill_flag FROM daemon_record WHERE d_id = :id LIMIT 1\\\\\\\\\\\\\\\");
}
if (!$stmt_stop) {
$stmt_stop = $pdo->prepare(\\\\\\\\\\\\\\\"
UPDATE daemon_record
SET d_status=\\\\\\\\\\\\\\\'STOPPED\\\\\\\\\\\\\\\', d_heartbeat=NOW(), d_pid=0
WHERE d_id=:id
\\\\\\\\\\\\\\\");
}
$stmt_hb->execute([\\\\\\\\\\\\\\\':id\\\\\\\\\\\\\\\' => $DAEMON_ID, \\\\\\\\\\\\\\\':pid\\\\\\\\\\\\\\\' => getmypid(), \\\\\\\\\\\\\\\':ip\\\\\\\\\\\\\\\' => $server_ip]);
$stmt_kill->execute([\\\\\\\\\\\\\\\':id\\\\\\\\\\\\\\\' => $DAEMON_ID]);
$kill_flag = (int)($stmt_kill->fetchColumn() ?: 0);
if ($kill_flag === 1) {
$stmt_stop->execute([\\\\\\\\\\\\\\\':id\\\\\\\\\\\\\\\' => $DAEMON_ID]);
exit(0);
}
// 종목 갱신 (1초마다)
if (time() - $last_market_refresh >= 1 || empty($symbols)) {
$tmp = [];
// pdo_gnu 끊겼을 때만 재연결
if (!$pdo_gnu) {
$pdo_gnu = get_gnu_connection();
$stmt_best = null;
} else {
try { $pdo_gnu->query(\\\\\\\\\\\\\\\"SELECT 1\\\\\\\\\\\\\\\"); }
catch (Throwable $e) {
$pdo_gnu = get_gnu_connection();
$stmt_best = null;
}
}
if ($pdo_gnu instanceof PDO) {
if (!$stmt_best) {
$stmt_best = $pdo_gnu->prepare(\\\\\\\\\\\\\\\"
SELECT wr_subject FROM g5_write_daemon_kind_bybit
WHERE (x2_run = 1 OR x2_run = \\\\\\\\\\\\\\\'1\\\\\\\\\\\\\\\')
\\\\\\\\\\\\\\\");
}
$stmt_best->execute();
$best_rows = $stmt_best->fetchAll(PDO::FETCH_COLUMN);
if (is_array($best_rows)) {
foreach ($best_rows as $sym) {
$sym = strtoupper(trim((string)$sym));
if ($sym === \\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\') continue;
if (strpos($sym, \\\\\\\\\\\\\\\'USDT\\\\\\\\\\\\\\\') === false && strpos($sym, \\\\\\\\\\\\\\\'-\\\\\\\\\\\\\\\') === false) {
$sym .= \\\\\\\\\\\\\\\'USDT\\\\\\\\\\\\\\\';
}
if (!in_array($sym, $tmp, true)) $tmp[] = $sym;
}
}
}
if ($tmp) {
$symbols = $tmp;
$last_market_refresh = time();
} else {
$symbols = [];
sleep(10);
continue;
}
}
if (!$symbols) {
sleep(10);
continue;
}
$at = date(\\\\\\\\\\\\\\\'Y-m-d H:i:s\\\\\\\\\\\\\\\');
// 전체 종목 한번에 병렬 호출
$all_data = collectAll($symbols);
$rows = array_values(array_filter($all_data, fn($d) => !empty($d)));
if (empty($rows)) {
// 수집 데이터 없음 - 그냥 통과
} else {
// bulk INSERT - 전체 종목 한방 쿼리
$placeholders = [];
$params = [];
foreach ($rows as $i => $d) {
$placeholders[] = \\\\\\\\\\\\\\\"(
:symbol_{$i}, :status_{$i}, :baseCoin_{$i}, :quoteCoin_{$i}, :settleCoin_{$i},
:launchTime_{$i}, :priceScale_{$i},
:minLeverage_{$i}, :maxLeverage_{$i}, :leverageStep_{$i},
:minPrice_{$i}, :maxPrice_{$i}, :tickSize_{$i},
:minOrderQty_{$i}, :maxOrderQty_{$i}, :qtyStep_{$i},
:fundingInterval_{$i}, :copyTrading_{$i}, :unifiedMarginTrade_{$i},
:postOnlyMaxOrderQty_{$i}, :upperLimitPrice_{$i}, :lowerLimitPrice_{$i},
:time_{$i}, NOW(),
:lastPrice_{$i}, :prevPrice24h_{$i}, :price24hPcnt_{$i},
:highPrice24h_{$i}, :lowPrice24h_{$i}, :openInterest_{$i},
:markPrice_{$i}, :indexPrice_{$i}, :fundingRate_{$i},
:prevPrice1h_{$i}, :openInterestValue_{$i}, :turnover24h_{$i}, :volume24h_{$i},
:nextFundingTime_{$i},
:ask1Size_{$i}, :bid1Price_{$i}, :ask1Price_{$i}, :bid1Size_{$i},
:start_{$i}, :open_{$i}, :high_{$i}, :low_{$i}, :close_{$i}, :volume_{$i}, :turnover_{$i},
:execId_{$i}, :price_{$i}, :size_{$i}, :side_{$i}, :isBlockTrade_{$i}, :isAdlTrade_{$i}, :mPnL_{$i},
:riskId_{$i}, :isLowestRisk_{$i}, :maintenanceMargin_{$i}, :initialMargin_{$i}, :limit_{$i},
:buyRatio_{$i}, :sellRatio_{$i}, :period_{$i},
:m_close_{$i}, :i_close_{$i}, :p_close_{$i}
)\\\\\\\\\\\\\\\";
$params[\\\\\\\\\\\\\\\"symbol_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'symbol\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"status_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'status\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"baseCoin_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'baseCoin\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"quoteCoin_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'quoteCoin\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"settleCoin_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'settleCoin\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"launchTime_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'launchTime\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"priceScale_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'priceScale\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"minLeverage_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'minLeverage\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"maxLeverage_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'maxLeverage\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"leverageStep_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'leverageStep\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"minPrice_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'minPrice\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"maxPrice_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'maxPrice\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"tickSize_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'tickSize\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"minOrderQty_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'minOrderQty\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"maxOrderQty_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'maxOrderQty\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"qtyStep_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'qtyStep\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"fundingInterval_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'fundingInterval\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"copyTrading_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'copyTrading\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"unifiedMarginTrade_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'unifiedMarginTrade\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"postOnlyMaxOrderQty_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'postOnlyMaxOrderQty\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"upperLimitPrice_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'upperLimitPrice\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"lowerLimitPrice_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'lowerLimitPrice\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"time_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'time\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"lastPrice_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'lastPrice\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"prevPrice24h_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'prevPrice24h\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"price24hPcnt_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'price24hPcnt\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"highPrice24h_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'highPrice24h\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"lowPrice24h_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'lowPrice24h\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"openInterest_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'openInterest\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"markPrice_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'markPrice\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"indexPrice_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'indexPrice\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"fundingRate_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'fundingRate\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"prevPrice1h_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'prevPrice1h\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"openInterestValue_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'openInterestValue\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"turnover24h_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'turnover24h\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"volume24h_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'volume24h\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"nextFundingTime_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'nextFundingTime\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"ask1Size_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'ask1Size\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"bid1Price_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'bid1Price\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"ask1Price_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'ask1Price\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"bid1Size_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'bid1Size\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"start_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'start\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"open_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'open\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"high_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'high\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"low_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'low\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"close_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'close\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"volume_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'volume\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"turnover_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'turnover\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"execId_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'execId\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"price_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'price\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"size_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'size\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"side_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'side\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"isBlockTrade_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'isBlockTrade\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"isAdlTrade_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'isAdlTrade\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"mPnL_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'mPnL\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"riskId_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'riskId\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"isLowestRisk_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'isLowestRisk\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"maintenanceMargin_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'maintenanceMargin\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"initialMargin_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'initialMargin\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"limit_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'limit\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"buyRatio_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'buyRatio\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"sellRatio_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'sellRatio\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"period_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'period\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"m_close_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'m_close\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"i_close_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'i_close\\\\\\\\\\\\\\\'];
$params[\\\\\\\\\\\\\\\"p_close_{$i}\\\\\\\\\\\\\\\"] = $d[\\\\\\\\\\\\\\\'p_close\\\\\\\\\\\\\\\'];
}
$sql = \\\\\\\\\\\\\\\"
INSERT INTO daemon_bybit_Ticker (
symbol, status, baseCoin, quoteCoin, settleCoin,
launchTime, priceScale,
minLeverage, maxLeverage, leverageStep,
minPrice, maxPrice, tickSize,
minOrderQty, maxOrderQty, qtyStep,
fundingInterval, copyTrading, unifiedMarginTrade,
postOnlyMaxOrderQty, upperLimitPrice, lowerLimitPrice,
time, updated_at,
lastPrice, prevPrice24h, price24hPcnt,
highPrice24h, lowPrice24h, openInterest,
markPrice, indexPrice, fundingRate,
prevPrice1h, openInterestValue, turnover24h, volume24h,
nextFundingTime,
ask1Size, bid1Price, ask1Price, bid1Size,
`start`, `open`, `high`, `low`, `close`, volume, turnover,
execId, price, size, side, isBlockTrade, isAdlTrade, mPnL,
riskId, isLowestRisk, maintenanceMargin, initialMargin, `limit`,
buyRatio, sellRatio, period,
m_close, i_close, p_close
) VALUES \\\\\\\\\\\\\\\" . implode(\\\\\\\\\\\\\\\',\\\\\\\\\\\\\\\', $placeholders) . \\\\\\\\\\\\\\\"
ON DUPLICATE KEY UPDATE
status = VALUES(status),
baseCoin = VALUES(baseCoin),
quoteCoin = VALUES(quoteCoin),
settleCoin = VALUES(settleCoin),
launchTime = VALUES(launchTime),
priceScale = VALUES(priceScale),
minLeverage = VALUES(minLeverage),
maxLeverage = VALUES(maxLeverage),
leverageStep = VALUES(leverageStep),
minPrice = VALUES(minPrice),
maxPrice = VALUES(maxPrice),
tickSize = VALUES(tickSize),
minOrderQty = VALUES(minOrderQty),
maxOrderQty = VALUES(maxOrderQty),
qtyStep = VALUES(qtyStep),
fundingInterval = VALUES(fundingInterval),
copyTrading = VALUES(copyTrading),
unifiedMarginTrade = VALUES(unifiedMarginTrade),
postOnlyMaxOrderQty = VALUES(postOnlyMaxOrderQty),
upperLimitPrice = VALUES(upperLimitPrice),
lowerLimitPrice = VALUES(lowerLimitPrice),
time = VALUES(time),
updated_at = NOW(),
lastPrice = VALUES(lastPrice),
prevPrice24h = VALUES(prevPrice24h),
price24hPcnt = VALUES(price24hPcnt),
highPrice24h = VALUES(highPrice24h),
lowPrice24h = VALUES(lowPrice24h),
openInterest = VALUES(openInterest),
markPrice = VALUES(markPrice),
indexPrice = VALUES(indexPrice),
fundingRate = VALUES(fundingRate),
prevPrice1h = VALUES(prevPrice1h),
openInterestValue = VALUES(openInterestValue),
turnover24h = VALUES(turnover24h),
volume24h = VALUES(volume24h),
nextFundingTime = VALUES(nextFundingTime),
ask1Size = VALUES(ask1Size),
bid1Price = VALUES(bid1Price),
ask1Price = VALUES(ask1Price),
bid1Size = VALUES(bid1Size),
`start` = VALUES(`start`),
`open` = VALUES(`open`),
`high` = VALUES(`high`),
`low` = VALUES(`low`),
`close` = VALUES(`close`),
volume = VALUES(volume),
turnover = VALUES(turnover),
execId = VALUES(execId),
price = VALUES(price),
size = VALUES(size),
side = VALUES(side),
isBlockTrade = VALUES(isBlockTrade),
isAdlTrade = VALUES(isAdlTrade),
mPnL = VALUES(mPnL),
riskId = VALUES(riskId),
isLowestRisk = VALUES(isLowestRisk),
maintenanceMargin = VALUES(maintenanceMargin),
initialMargin = VALUES(initialMargin),
`limit` = VALUES(`limit`),
buyRatio = VALUES(buyRatio),
sellRatio = VALUES(sellRatio),
period = VALUES(period),
m_close = VALUES(m_close),
i_close = VALUES(i_close),
p_close = VALUES(p_close)
\\\\\\\\\\\\\\\";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
}
} else {
sleep(5);
}
if ($cycle_count % 50 === 0 && function_exists(\\\\\\\\\\\\\\\'gc_collect_cycles\\\\\\\\\\\\\\\')) {
gc_collect_cycles();
}
} catch (Throwable $e) {
sleep(3);
}
sleep(30);
}
최근 "데몬" 데이터