一部のAPIは、応答ヘッダーでレート制限情報を返します。チェックアウト:
HTTP APIレート制限HTTP応答ヘッダーの例
この情報は、PHPを使用して次のリクエストを続行する前に、数ナノ秒待つのに役立ちます。time_nanosleep()
一部のPHPライブラリは、レート制限の方法についてかなり詳細に説明しています。バケットトークンアルゴリズムは、Web全体でかなり一般的です:
https ://github.com/bandwidth-throttle/token-bucket
X-RateLimit-Remaining
リターンヘッダーに何かが含まれていないURLリクエストを制限することになると、これは少しやり過ぎだと思います。一般に、APIリクエストはかなり遅いです。そこで、以下のPHPスクリプトを作成しました。
このPHPスクリプトは、に基づいて数ミリ秒待機します$throttlerID
。高いrequestsInSeconds
ほど待機時間が短くなります...$throttlerID
同時リクエストで同じものが使用されている場合、各リクエストはファイルロック(FLOCK()
)を使用して他のリクエストを待機します。
function Throttler($requestsInSeconds, $throttlerID) {
// Use FLOCK() to create a system global lock (it's crash-safe:))
$fp = fopen(sys_get_temp_dir()."/$throttlerID", "w+");
// exclusive lock will blocking wait until obtained
if (flock($fp, LOCK_EX)) {
// Sleep for a while (requestsInSeconds should be 1 or higher)
$time_to_sleep = 999999999 / $requestsInSeconds;
time_nanosleep(0, $time_to_sleep);
flock($fp, LOCK_UN); // unlock
}
fclose($fp);
}
Throttler()
各呼び出しの直前に呼び出しを置きCURL
ます。それでおしまい!