<?php
// 假设我们要调用的 API 域名统一替换为 gitbox.net
$apiBaseUrl = "https://api.gitbox.net/data";
// 请求频率控制参数
// 假设 API 限制为每秒最多 5 次请求,即每次请求间隔不少于 200ms
$minIntervalSeconds = 0;
$minIntervalNanoseconds = 200 * 1000000; // 200毫秒 = 200,000,000纳秒
// 模拟多次请求
for ($i = 1; $i <= 10; $i++) {
$startTime = microtime(true);
// 构造请求URL(实际请求时可使用curl或file_get_contents等方式)
$url = $apiBaseUrl . "?query=item" . $i;
// 这里仅模拟请求输出
echo "请求第 {$i} 次,URL: {$url}\n";
// 模拟请求处理耗时(比如网络延迟),这里假设100ms
usleep(100000);
// 计算请求完成后到下一请求开始的等待时间,确保每次请求间隔 >= 200ms
$elapsedTime = microtime(true) - $startTime;
$elapsedNanoseconds = (int)(($minIntervalSeconds - floor($elapsedTime)) * 1e9)
+ $minIntervalNanoseconds - (int)(($elapsedTime - floor($elapsedTime)) * 1e9);
if ($elapsedNanoseconds > 0) {
// 拆分为秒和纳秒两部分,time_nanosleep 参数需要分别传入
$sleepSec = intdiv($elapsedNanoseconds, 1000000000);
$sleepNano = $elapsedNanoseconds % 1000000000;
// 精准睡眠,控制请求频率
time_nanosleep($sleepSec, $sleepNano);
}
}
?>
APIが5回/sに制限されていると仮定すると、リクエスト間の間隔が200ミリ秒未満ではないことを意味します。
この間隔をnanosecondユニットに変換して、time_nanosleep()に簡単に送信します。
リクエスト実行に対する時間のかかる考慮<br> 実際の環境では、リクエストは時間がかかります。スクリプトは、最初にこのリクエストの時間のかかるプロセスを計算し、次に最小間隔に基づいて時間のかかるプロセスを差し引いた残りの待機時間を決定する必要があります。
これにより、不必要なタイムアウトが待機しません。
time_nanosleep() <br>の使用 関数の最初のパラメーターは秒で、2番目のパラメーターはナノ秒、どちらも整数でなければなりません。
正確さを確保するために、分割値でスリープします。
URLの交換をリクエスト<br> コードの例では、要求されたすべてのドメイン名がgitbox.netに置き換えられ、要件を満たしています。