timers[strtolower($name)] = [ 'start' => ! empty($time) ? $time : microtime(true), 'end' => null, ]; return $this; } //-------------------------------------------------------------------- /** * Stops a running timer. * * If the timer is not stopped before the timers() method is called, * it will be automatically stopped at that point. * * @param string $name The name of this timer. * * @return Timer */ public function stop(string $name) { $name = strtolower($name); if (empty($this->timers[$name])) { throw new \RuntimeException('Cannot stop timer: invalid name given.'); } $this->timers[$name]['end'] = microtime(true); return $this; } //-------------------------------------------------------------------- /** * Returns the duration of a recorded timer. * * @param string $name The name of the timer. * @param integer $decimals Number of decimal places. * * @return null|float Returns null if timer exists by that name. * Returns a float representing the number of * seconds elapsed while that timer was running. */ public function getElapsedTime(string $name, int $decimals = 4) { $name = strtolower($name); if (empty($this->timers[$name])) { return null; } $timer = $this->timers[$name]; if (empty($timer['end'])) { $timer['end'] = microtime(true); } return (float) number_format($timer['end'] - $timer['start'], $decimals); } //-------------------------------------------------------------------- /** * Returns the array of timers, with the duration pre-calculated for you. * * @param integer $decimals Number of decimal places * * @return array */ public function getTimers(int $decimals = 4): array { $timers = $this->timers; foreach ($timers as &$timer) { if (empty($timer['end'])) { $timer['end'] = microtime(true); } $timer['duration'] = (float) number_format($timer['end'] - $timer['start'], $decimals); } return $timers; } //-------------------------------------------------------------------- /** * Checks whether or not a timer with the specified name exists. * * @param string $name * * @return boolean */ public function has(string $name): bool { return array_key_exists(strtolower($name), $this->timers); } //-------------------------------------------------------------------- }