1. <?php
  2. /**
  3. * Throttles JSON request responses for dry-run scenarios.
  4. *
  5. * @param callable $callback The function to execute for each request. Should return the JSON response.
  6. * @param int $requestsPerSecond The maximum number of requests allowed per second.
  7. * @return callable A throttled version of the callback function.
  8. */
  9. function throttleJsonRequests(callable $callback, int $requestsPerSecond): callable
  10. {
  11. $lastExecutionTime = 0;
  12. $requestQueue = [];
  13. return function () use ($callback, $lastExecutionTime, $requestsPerSecond, &$requestQueue) {
  14. $now = time();
  15. // Calculate time since last execution
  16. $timeSinceLastExecution = $now - $lastExecutionTime;
  17. // Check if enough time has passed to allow a new request
  18. if ($timeSinceLastExecution < (1 / $requestsPerSecond)) {
  19. // Wait until enough time has passed
  20. $sleepTime = (1 / $requestsPerSecond) - $timeSinceLastExecution;
  21. usleep($sleepTime * 1000000); // Convert seconds to microseconds
  22. }
  23. // Execute the callback
  24. $result = call_user_func($callback);
  25. // Update the last execution time
  26. $lastExecutionTime = $now;
  27. // Optionally, process the result here (e.g. log, validate)
  28. // echo "Request processed. Result: " . json_encode($result) . "\n";
  29. return $result;
  30. };
  31. }

Add your comment