startedAt) { return; } // Get time in seconds as a float, accurate to the microsecond. $this->startedAt = microtime(true); } public function stop() { $this->finishedAt = microtime(true); } /** * @return float|null */ public function elapsed() { $finished = $this->finishedAt ? $this->finishedAt : microtime(true); if ($finished - $this->startedAt <= 0) { return null; } return $finished - $this->startedAt; } /** * Format a duration into a human-readable time * * @param float $duration Duration in seconds, with fractional component * * @return string */ public static function formatDuration($duration) { if ($duration >= self::DAY * 2) { return gmdate('z \d\a\y\s H:i:s', $duration); } if ($duration > self::DAY) { return gmdate('\1 \d\a\y H:i:s', $duration); } if ($duration > self::HOUR) { return gmdate("H:i:s", $duration); } if ($duration > self::MINUTE) { return gmdate("i:s", $duration); } return round($duration, 3).'s'; } }