1. <?php
  2. class ApiMonitor {
  3. private $apiEndpoint;
  4. private $apiKey;
  5. private $rateLimitPerMinute;
  6. private $requestQueue = [];
  7. private $lastRequestTime = 0;
  8. public function __construct(string $apiEndpoint, string $apiKey, int $rateLimitPerMinute) {
  9. $this->apiEndpoint = $apiEndpoint;
  10. $this->apiKey = $apiKey;
  11. $this->rateLimitPerMinute = $rateLimitPerMinute;
  12. }
  13. private function isRateLimited(): bool {
  14. if (time() - $this->lastRequestTime < 60 / $this->rateLimitPerMinute) {
  15. return true;
  16. }
  17. return false;
  18. }
  19. private function waitToRateLimit(): void {
  20. $timeToWait = 60 / $this->rateLimitPerMinute - (time() - $this->lastRequestTime);
  21. if ($timeToWait > 0) {
  22. sleep($timeToWait);
  23. }
  24. }
  25. public function enqueueRequest(array $data): void {
  26. $this->requestQueue[] = $data;
  27. }
  28. public function processRequests(): array {
  29. $results = [];
  30. $this->lastRequestTime = time();
  31. while (!empty($this->requestQueue)) {
  32. $request = array_shift($this->requestQueue);
  33. if ($this->isRateLimited()) {
  34. $this->waitToRateLimit();
  35. continue;
  36. }
  37. try {
  38. $response = $this->makeApiRequest($request);
  39. $results[] = $response;
  40. } catch (Exception $e) {
  41. $results[] = ['error' => $e->getMessage()];
  42. }
  43. }
  44. return $results;
  45. }
  46. private function makeApiRequest(array $request): array {
  47. $ch = curl_init($this->apiEndpoint);
  48. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  49. curl_setopt($ch, CURLOPT_HTTPHEADER, [
  50. 'Authorization: Bearer ' . $this->apiKey,
  51. 'Content-Type: application/json',
  52. ]);
  53. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($request));
  54. $response = curl_exec($ch);
  55. $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  56. curl_close($ch);
  57. $response = json_decode($response, true);
  58. if ($httpCode >= 200 && $httpCode < 300) {
  59. return $response;
  60. } else {
  61. throw new Exception("API request failed with code: " . $httpCode . ". Response: " . $response);
  62. }
  63. }
  64. }
  65. ?>

Add your comment