微盘数字货币火币网api延迟很高,导致k线很卡的问题结局

1.换高配服务器 
2.换币安接口
3.火币网api接口代理镜像


# K线数据接口
https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1d&limit=200
 
# 优点:
- 响应速度快
- 完全免费
- 稳定可靠
- 数据格式类似

# K线数据接口
https://www.okx.com/api/v5/market/candles?instId=BTC-USDT&bar=1D
 
# 优点:
- 国内访问快
- 免费使用
- 数据实时性好

# 市场数据接口
https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usdt&days=200&interval=daily
 
# 优点:
- 无需注册
- 免费额度大
- 数据全面

# 历史K线数据
https://min-api.cryptocompare.com/data/v2/histoday?fsym=BTC&tsym=USDT&limit=200
 
# 优点:
- 响应快
- 基础功能免费
- 数据准确


****************
public function getkdata()
{
    $pid = $this->app->request->param('pid');
    if(!$pid) $this->error('产品id不能为空');
    
    $num = $this->app->request->param('num', 30);
    if(!$num) $this->error('时间不能为空');
    
    $pro = Db::name('LcProduct')->where(['id'=>$pid])->find();
    if(!$pro) $this->error('产品信息异常');
    
    $interval = input('interval','1');
    $klength = ($interval == 'd') ? 24*60*60*$num : $interval*60*$num;
 
    $k_map['pid'] = $pid;
    $k_map['ktime'] = array('between', array(time() - $klength, time()));
 
    $pro['procode'] = $pro['code'];
 
    if(strpos($pro['procode'],"btc")!==false || strpos($pro['procode'],"usdt")!==false) {
        // 转换为Binance的时间间隔格式
        switch ($interval) {
            case '1': $binance_interval = "1m"; break;
            case '5': $binance_interval = "5m"; break;
            case '15': $binance_interval = "15m"; break;
            case '30': $binance_interval = "30m"; break;
            case '60': $binance_interval = "1h"; break;
            case 'd': $binance_interval = "1d"; break;
            default: $this->error('Invalid interval'); break;
        }
 
        try {
            // 构建交易对
            $testacode = explode("_", $pro['procode']);
            $symbol = strtoupper($testacode[0].$testacode[1]);
 
            // 设置CURL选项
            $ch = curl_init();
            $timeout = 5;
            $url = "https://api.binance.com/api/v3/klines?symbol={$symbol}&interval={$binance_interval}&limit={$num}";
            
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            
            $data = curl_exec($ch);
            
            if(curl_errno($ch)) {
                // 如果Binance API失败,尝试使用备用API(OKX)
                $backup_url = "https://www.okx.com/api/v5/market/candles?instId={$testacode[0]}-{$testacode[1]}&bar={$binance_interval}";
                curl_setopt($ch, CURLOPT_URL, $backup_url);
                $data = curl_exec($ch);
                
                if(curl_errno($ch)) {
                    $this->error('API request failed');
                }
            }
            
            curl_close($ch);
            
            $_data_arr = json_decode($data, true);
            
            // Binance数据处理
            if(isset($_data_arr) && is_array($_data_arr)) {
                $res_arr = [];
                foreach($_data_arr as $v) {
                    // Binance K线数据格式:
                    // [0]开盘时间 [1]开盘价 [2]最高价 [3]最低价 [4]收盘价
                    $res_arr[] = [
                        intval($v[0]/1000), // 转换为秒级时间戳
                        floatval($v[1]),    // 开盘价
                        floatval($v[4]),    // 收盘价
                        floatval($v[3]),    // 最低价
                        floatval($v[2])     // 最高价
                    ];
                }
                
                // 缓存结果(可选)
                cache('kline_'.$symbol.'_'.$interval, $res_arr, 60); // 缓存1分钟
                
                return $res_arr;
            }
            
        } catch(\Exception $e) {
            $this->error('Data fetch error: ' . $e->getMessage());
        }
    }
    
    $this->error('Unsupported trading pair');
}
*********************

镜像代理 火币网api 


<?php
header('Access-Control-Allow-Origin: *');  // 允许跨域访问
header('Content-Type: application/json; charset=utf-8');
 
class KlineProxy {
    private $cache_dir = './cache/';  // 缓存目录
    private $cache_time = 5;          // 缓存时间(秒)
    private $api_timeout = 5;         // API超时时间(秒)
    
    public function __construct() {
        if (!is_dir($this->cache_dir)) {
            mkdir($this->cache_dir, 0777, true);
        }
    }
 
    // 主处理方法
    public function handle() {
        try {
            // 获取参数
            $period = $this->getParam('period', '1min');
            $size = $this->getParam('size', '50');
            $symbol = $this->getParam('symbol', 'btcusdt');
            
            // 验证参数
            $this->validateParams($period, $size, $symbol);
            
            // 检查缓存
            $cache_key = "{$symbol}_{$period}_{$size}";
            $cache_data = $this->getCache($cache_key);
            
            if ($cache_data !== false) {
                return $this->success($cache_data);
            }
            
            // 尝试主要API (火币)
            $data = $this->getHuobiData($period, $size, $symbol);
            if ($data) {
                $this->setCache($cache_key, $data);
                return $this->success($data);
            }
            
            // 尝试备用API (币安)
            $data = $this->getBinanceData($period, $size, $symbol);
            if ($data) {
                $this->setCache($cache_key, $data);
                return $this->success($data);
            }
            
            throw new Exception('无法获取数据');
            
        } catch (Exception $e) {
            return $this->error($e->getMessage());
        }
    }
 
    // 从火币获取数据
    private function getHuobiData($period, $size, $symbol) {
        $url = "https://api.huobi.pro/market/history/kline";
        $params = [
            'period' => $period,
            'size' => $size,
            'symbol' => $symbol
        ];
        
        $response = $this->curlRequest($url, $params);
        if (!$response) {
            return false;
        }
        
        $data = json_decode($response, true);
        if ($data['status'] !== 'ok' || empty($data['data'])) {
            return false;
        }
        
        return $data;
    }
 
    // 从币安获取数据(备用)
    private function getBinanceData($period, $size, $symbol) {
        // 转换时间间隔格式
        $interval_map = [
            '1min' => '1m',
            '5min' => '5m',
            '15min' => '15m',
            '30min' => '30m',
            '60min' => '1h',
            '1day' => '1d'
        ];
        
        $interval = $interval_map[$period] ?? '1m';
        
        $url = "https://api.binance.com/api/v3/klines";
        $params = [
            'symbol' => strtoupper($symbol),
            'interval' => $interval,
            'limit' => $size
        ];
        
        $response = $this->curlRequest($url, $params);
        if (!$response) {
            return false;
        }
        
        $data = json_decode($response, true);
        if (empty($data)) {
            return false;
        }
        
        // 转换为火币格式
        return [
            'status' => 'ok',
            'data' => array_map(function($item) {
                return [
                    'id' => intval($item[0] / 1000),
                    'open' => $item[1],
                    'close' => $item[4],
                    'low' => $item[3],
                    'high' => $item[2]
                ];
            }, $data)
        ];
    }
 
    // CURL请求
    private function curlRequest($url, $params = []) {
        $ch = curl_init();
        
        if (!empty($params)) {
            $url .= '?' . http_build_query($params);
        }
        
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => $this->api_timeout,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_HTTPHEADER => [
                'User-Agent: Mozilla/5.0',
                'Accept: application/json'
            ]
        ]);
        
        $response = curl_exec($ch);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        return ($http_code === 200) ? $response : false;
    }
 
    // 缓存操作
    private function getCache($key) {
        $file = $this->cache_dir . md5($key) . '.cache';
        if (file_exists($file) && (time() - filemtime($file) < $this->cache_time)) {
            return json_decode(file_get_contents($file), true);
        }
        return false;
    }
 
    private function setCache($key, $data) {
        $file = $this->cache_dir . md5($key) . '.cache';
        file_put_contents($file, json_encode($data));
    }
 
    // 辅助方法
    private function getParam($key, $default = null) {
        return isset($_GET[$key]) ? trim($_GET[$key]) : $default;
    }
 
    private function validateParams($period, $size, $symbol) {
        if (empty($period) || empty($size) || empty($symbol)) {
            throw new Exception('参数不完整');
        }
        
        if (!is_numeric($size) || $size < 1 || $size > 2000) {
            throw new Exception('size参数无效');
        }
    }
 
    private function success($data) {
        return json_encode([
            'code' => 0,
            'msg' => 'success',
            'data' => $data
        ]);
    }
 
    private function error($msg) {
        return json_encode([
            'code' => 1,
            'msg' => $msg,
            'data' => null
        ]);
    }
}
 
// 执行
$proxy = new KlineProxy();
echo $proxy->handle();