<?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);
}
}
?>
En supposant que l'API est limitée à 5 fois / s, cela signifie que l'intervalle entre les demandes ne peut pas être inférieur à 200 millisecondes.
Nous convertissons cet intervalle en unités de nanoseconde pour une transmission facile à Time_nanosleep () .
Considération longue pour l'exécution de la demande <br> Dans l'environnement réel, la demande prend du temps. Le script doit d'abord calculer le processus long de cette demande, puis déterminer le temps d'attente restant en fonction de l'intervalle minimum moins le processus long.
Cela évite l'attention inutile d'attendre.
Utilisation de Time_nanosleep () <br> Le premier paramètre de la fonction est les secondes, le deuxième paramètre est nanoseconde, les deux doivent être des entiers.
Dormez avec la valeur divisée pour assurer la précision.
Demander un remplacement de l'URL <br> Dans l'exemple de code, tous les noms de domaine demandés sont remplacés par gitbox.net , qui répond aux exigences.