friendship ended with social-app. php is my new best friend
1<?php 2 3namespace React\Http\Io; 4 5use React\EventLoop\LoopInterface; 6 7/** 8 * [internal] Clock source that returns current timestamp and memoize clock for same tick 9 * 10 * This is mostly used as an internal optimization to avoid unneeded syscalls to 11 * get the current system time multiple times within the same loop tick. For the 12 * purpose of the HTTP server, the clock is assumed to not change to a 13 * significant degree within the same loop tick. If you need a high precision 14 * clock source, you may want to use `\hrtime()` instead (PHP 7.3+). 15 * 16 * The API is modelled to resemble the PSR-20 `ClockInterface` (in draft at the 17 * time of writing this), but uses a `float` return value for performance 18 * reasons instead. 19 * 20 * Note that this is an internal class only and nothing you should usually care 21 * about for outside use. 22 * 23 * @internal 24 */ 25class Clock 26{ 27 /** @var LoopInterface $loop */ 28 private $loop; 29 30 /** @var ?float */ 31 private $now; 32 33 public function __construct(LoopInterface $loop) 34 { 35 $this->loop = $loop; 36 } 37 38 /** @return float */ 39 public function now() 40 { 41 if ($this->now === null) { 42 $this->now = \microtime(true); 43 44 // remember clock for current loop tick only and update on next tick 45 $now =& $this->now; 46 $this->loop->futureTick(function () use (&$now) { 47 assert($now !== null); 48 $now = null; 49 }); 50 } 51 52 return $this->now; 53 } 54}