ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
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 (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
 
int $duration_in_ms
 

Detailed Description

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

Definition at line 27 of file CallbackDuration.php.

Member Function Documentation

◆ stretch()

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

Definition at line 32 of file CallbackDuration.php.

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

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