ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
ILIAS\HTTP\Duration\CallbackDuration Class Reference
+ Inheritance diagram for ILIAS\HTTP\Duration\CallbackDuration:
+ Collaboration diagram for ILIAS\HTTP\Duration\CallbackDuration:

Public Member Functions

 stretch (callable $callback)
 
- Public Member Functions inherited from ILIAS\HTTP\Duration\Duration
 __construct (protected int $duration_in_ms)
 
 withIncrement (IncrementStrategy $increment)
 
 increment ()
 
 withDuration (int $duration_in_ms)
 
 getDuration ()
 

Additional Inherited Members

- Protected Attributes inherited from ILIAS\HTTP\Duration\Duration
const S_TO_US = 1_000_000
 number used for converting seconds (s) into microseconds (us/µ) or vise-versa. More...
 
const MS_TO_US = 1_000
 number used for converting miliseconds (ms) into microseconds (us/µ) or vise-versa. More...
 
IncrementStrategy $increment = null
 

Detailed Description

Author
Thibeau Fuhrer thibe.nosp@m.au@s.nosp@m.r.sol.nosp@m.utio.nosp@m.ns

Definition at line 26 of file CallbackDuration.php.

Member Function Documentation

◆ stretch()

ILIAS\HTTP\Duration\CallbackDuration::stretch ( callable  $callback)
Returns
mixed|null

Definition at line 31 of file CallbackDuration.php.

32  {
33  $start_time = microtime(true);
34  $halted = true;
35 
36  register_shutdown_function(static function () use (&$halted): void {
37  if ($halted) {
38  throw new \LogicException("Callback could not be stretched because it halted the programm.");
39  }
40  });
41 
42  $return = $callback();
43  $halted = false;
44 
45  $elapsed_time_in_us = ((microtime(true) - $start_time) * self::S_TO_US);
46  $duration_in_us = ($this->duration_in_ms * self::MS_TO_US);
47 
48  if ($elapsed_time_in_us > $duration_in_us) {
49  throw new \RuntimeException("Execution of callback exceeded the given duration and could not be stretched.");
50  }
51 
52  if ($elapsed_time_in_us < $duration_in_us) {
53  usleep((int) round($duration_in_us - $elapsed_time_in_us));
54  }
55 
56  return $return;
57  }

The documentation for this class was generated from the following file: