Bitfinex API请求控制:PHP脚本每90次查询暂停60秒
实现Bitfinex API请求限流:每90次查询后暂停60秒
看起来你已经在处理Bitfinex API的数据拉取和入库操作了,现在需要加上限流逻辑来避免触发IP封禁。根据Bitfinex的规则,每分钟最多允许90次REST请求,否则IP会被临时封禁10-60秒,所以我们可以通过维护请求计数器+阈值暂停的方式解决这个问题。
核心实现思路
- 用计数器跟踪已发起的请求次数
- 每次发起API请求前做检查:
- 若计数达到90次,先让脚本暂停60秒,再重置计数器
- 若未达阈值,直接发起请求,请求完成后计数器加1
修改后的完整代码示例
<?php // 用静态变量保持脚本执行期间的请求计数状态 static $requestCount = 0; // 触发限流逻辑:达到90次请求后暂停60秒 if ($requestCount >= 90) { echo "已达请求上限,暂停60秒规避封禁...\n"; sleep(60); $requestCount = 0; // 重置计数 } // 发起Bitfinex API请求 $json = file_get_contents('https://api.bitfinex.com/v1/symbols'); // 处理请求失败的情况 if ($json === false) { die("API请求失败,请检查网络连接或API状态"); } // 解析JSON数据 $bitfinex = json_decode($json, true); if (json_last_error() !== JSON_ERROR_NONE) { die("JSON解析失败:" . json_last_error_msg()); } // 补全你的入库逻辑(这里假设你需要拆分交易对存入数据库) $insertBitfinex = $this->conn->prepare("INSERT INTO exchange_bitfinex (`first_coin`,`second_coin`) VALUES (?, ?)"); foreach ($bitfinex as $symbol) { // 拆分Bitfinex的交易对格式(比如btcusd拆为BTC和USD) $firstCoin = strtoupper(substr($symbol, 0, 3)); $secondCoin = strtoupper(substr($symbol, 3)); $insertBitfinex->bind_param("ss", $firstCoin, $secondCoin); $insertBitfinex->execute(); } // 请求完成后计数加1 $requestCount++; ?>
额外注意事项
- 如果你的脚本是定时重复执行的(比如 cron 任务),静态变量的计数会在每次脚本启动时重置,这种情况可以用文件、数据库或缓存(如Redis)来持久化计数器,确保跨执行周期的计数准确。
file_get_contents依赖PHP的allow_url_fopen配置,若环境限制无法开启,建议改用cURL实现请求,更稳定且方便设置超时、请求头等参数。- 实际使用时可以把暂停时间调整为61秒,完全覆盖每分钟的限制窗口,进一步降低封禁风险。
内容的提问来源于stack exchange,提问作者major697
相关产品推荐
相关产品推荐

