- Notifications
You must be signed in to change notification settings - Fork821
Open
Description
The current function is not precise and is complicated by a bug that existed before.
private function waitUntilRequestQuotaAvailable(){ $sleep_until = (float)($this->currentStartTime + $this->intervalSeconds); $sleep_seconds = $sleep_until - microtime(true); // Avoid using time_sleep_until() as it appears to be less precise and not sleep long enough. usleep((int) $sleep_seconds * 1000000); // Ensure that enough time has passed as usleep() may not have waited long enough. $this->currentStartTime = microtime(true); if ($this->currentStartTime < $sleep_until) { do { usleep(1000000 / 4); $this->currentStartTime = microtime(true); } while ($this->currentStartTime < $sleep_until); } $this->currentRequestCount = 0;}
The bug is in this lineusleep((int) $sleep_seconds * 1000000);
casting is performed on $sleep_seconds not on the product.
The new change does not really solve the problem.
private function waitUntilRequestQuotaAvailable(){ $sleep_until = (float)($this->currentStartTime + $this->intervalSeconds); $sleep_seconds = $sleep_until - microtime(true); // Avoid using time_sleep_until() as it appears to be less precise and not sleep long enough. // Avoid using usleep(): "Values larger than 1000000 (i.e. sleeping for // more than a second) may not be supported by the operating system. // Use sleep() instead." $sleep_seconds_int = (int)$sleep_seconds; if ($sleep_seconds_int >= 1) { sleep($sleep_seconds_int); } // Ensure that enough time has passed as usleep() may not have waited long enough. $this->currentStartTime = microtime(true); if ($this->currentStartTime < $sleep_until) { do { usleep(1000000 / 4); $this->currentStartTime = microtime(true); } while ($this->currentStartTime < $sleep_until); } $this->currentRequestCount = 0;}
Тhe real solution is this function
private function waitUntilRequestQuotaAvailable(){ $sleep_until = (float) ($this->currentStartTime + $this->intervalSeconds); $sleep_seconds = $sleep_until - microtime(true); usleep((int) ($sleep_seconds * 1000000)); $this->currentStartTime = microtime(true); $this->currentRequestCount = 0;}
Metadata
Metadata
Assignees
Labels
No labels