public function execute(callable $code)
{
$this->looping = true;
$minWait = 100;
$timeout = microtime(true) + $this->timeout;
for ($i = 0; $this->looping && microtime(true) < $timeout; $i++) {
$result = call_user_func($code);
if (!$this->looping) {
break;
}
$min = $minWait * pow(2, $i);
$max = $min * 2;
$usleep = rand($min, $max);
usleep($usleep);
}
if (microtime(true) >= $timeout) {
throw new TimeoutException("Timeout of {$this->timeout} seconds exceeded.");
}
return $result;
}