ILIAS  release_8 Revision v8.23
CallbackDuration.php
Go to the documentation of this file.
1 <?php declare(strict_types=1);
2 
19 
20 use Closure;
21 
26 {
30  public function stretch(callable $callback)
31  {
32  $start_time = microtime(true);
33  $halted = true;
34 
35  register_shutdown_function(static function () use (&$halted) {
36  if ($halted) {
37  throw new \LogicException("Callback could not be stretched because it halted the programm.");
38  }
39  });
40 
41  $return = $callback();
42  $halted = false;
43 
44  $elapsed_time_in_us = ((microtime(true) - $start_time) * self::S_TO_US);
45  $duration_in_us = ($this->duration_in_ms * self::MS_TO_US);
46 
47  if ($elapsed_time_in_us > $duration_in_us) {
48  throw new \RuntimeException("Execution of callback exceeded the given duration and could not be stretched.");
49  }
50 
51  if ($elapsed_time_in_us < $duration_in_us) {
52  usleep((int) round($duration_in_us - $elapsed_time_in_us));
53  }
54 
55  return $return;
56  }
57 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...