<?php
class ApiMonitor {
private $apiEndpoint;
private $apiKey;
private $rateLimitPerMinute;
private $requestQueue = [];
private $lastRequestTime = 0;
public function __construct(string $apiEndpoint, string $apiKey, int $rateLimitPerMinute) {
$this->apiEndpoint = $apiEndpoint;
$this->apiKey = $apiKey;
$this->rateLimitPerMinute = $rateLimitPerMinute;
}
private function isRateLimited(): bool {
if (time() - $this->lastRequestTime < 60 / $this->rateLimitPerMinute) {
return true;
}
return false;
}
private function waitToRateLimit(): void {
$timeToWait = 60 / $this->rateLimitPerMinute - (time() - $this->lastRequestTime);
if ($timeToWait > 0) {
sleep($timeToWait);
}
}
public function enqueueRequest(array $data): void {
$this->requestQueue[] = $data;
}
public function processRequests(): array {
$results = [];
$this->lastRequestTime = time();
while (!empty($this->requestQueue)) {
$request = array_shift($this->requestQueue);
if ($this->isRateLimited()) {
$this->waitToRateLimit();
continue;
}
try {
$response = $this->makeApiRequest($request);
$results[] = $response;
} catch (Exception $e) {
$results[] = ['error' => $e->getMessage()];
}
}
return $results;
}
private function makeApiRequest(array $request): array {
$ch = curl_init($this->apiEndpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $this->apiKey,
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($request));
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$response = json_decode($response, true);
if ($httpCode >= 200 && $httpCode < 300) {
return $response;
} else {
throw new Exception("API request failed with code: " . $httpCode . ". Response: " . $response);
}
}
}
?>
Add your comment