public static function spin($callable, $timeout = 0, $delay = 100000)
{
if (!is_callable($callable)) {
throw new InvalidArgumentException();
}
$closure = function () use($callable, $timeout, $delay) {
$timeout = (double) $timeout;
$result = false;
$start = microtime(true);
do {
if ($result = $callable()) {
return $result;
}
usleep($delay);
$current = microtime(true);
} while ($current - $start < $timeout);
throw new TimeoutException("Timeout reached, execution aborted after {$timeout} second(s).");
};
if (!function_exists('pcntl_signal')) {
return $closure();
}
return static::run($closure, $timeout);
}