ckratelimit.php 1.5 KB

123456789101112131415161718192021222324252627282930313233343536
  1. <?php
  2. function ckratelimit($headers,$echofun,$onlyret=false,$verbose=false) {//$echofun has to be the name of a defined function to pass messages to
  3. $ret=null;
  4. if (is_array($headers)) {
  5. //echo "ckratelimit: {$headers}: ".print_r($headers,true));
  6. $buff=[];
  7. array_shift($headers);
  8. foreach ($headers as $header)
  9. if (preg_match('/^([^:]+):(.*)$/Uu',$header,$matches)===1)
  10. $buff[$matches[1]]=trim($matches[2]);
  11. $headers=$buff;
  12. //print_r($headers);
  13. if (isset($headers['Date']) && isset($headers['X-RateLimit-Reset']) && isset($headers['X-RateLimit-Remaining'])) {
  14. //Wed, 30 Mar 2022 21:27:22 GMT
  15. $srvnow=strtotime($headers['Date']);
  16. //2022-03-31T04:05:00.058705Z
  17. $srvrlreset=strtotime($headers['X-RateLimit-Reset']);
  18. $srvrlremain=$headers['X-RateLimit-Remaining'];
  19. $secstoreset=$srvrlreset-$srvnow;
  20. $ret=['remaining'=>$srvrlremain,'secstoreset'=>$secstoreset];
  21. if ($onlyret)
  22. return $ret;
  23. if ($verbose) $echofun("ckratelimit: X-RateLimit-Remaining: {$srvrlremain}; server time: {$srvnow}: ".gmdate('c',$srvnow).'; X-RateLimit-Reset: '.gmdate('c',$srvrlreset).'; current seconds before reset: '.$secstoreset.".\n");
  24. if ($srvrlremain==0) {
  25. $echofun("Reached rate limit, waiting {$secstoreset} seconds for rate limit reset ...\n");
  26. sleep($secstoreset);
  27. }
  28. } else {
  29. if ($verbose) $echofun("ckratelimit: no «Date» / «X-RateLimit-Reset» / «X-RateLimit-Remaining» header(s)!\n");
  30. }
  31. } else {
  32. if ($verbose) $echofun("ckratelimit: headers is not an array!\n");
  33. }
  34. return $ret;
  35. }
  36. ?>