ChangeLog
ChangeLog
All notable changes are documented in this file using the Keep a CHANGELOG principles.
[9.0.0] - 2026-02-06
Removed
* This component is no longer supported on PHP 8.3
[8.0.0] - 2025-02-07
Removed
* This component is no longer supported on PHP 8.2
[7.0.1] - 2024-07-03
Changed
* This project now uses PHPStan instead of Psalm for static analysis
[7.0.0] - 2024-02-02
Removed
* This component is no longer supported on PHP 8.1
[6.0.0] - 2023-02-03
Removed
* This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0
[5.0.3] - 2020-10-26
Fixed
* SebastianBergmann\Timer\Exception now correctly extends \Throwable
[5.0.2] - 2020-09-28
Changed
* Changed PHP version constraint in composer.json from ^7.3 || ^8.0 to >=7.3
[5.0.1] - 2020-06-26
Added
* This component is now supported on PHP 8
[5.0.0] - 2020-06-07
Changed
* Parameter type for SebastianBergmann\Timer\Duration::fromMicroseconds() was changed from int to float
* Parameter type for SebastianBergmann\Timer\Duration::fromNanoseconds() was changed from int to float
* Return type for SebastianBergmann\Timer\Duration::asNanoseconds() was changed from int to float
Fixed
* #31: Type Error on 32-bit systems (where hrtime() returns float instead of int)
[4.0.0] - 2020-06-01
Added
* Introduced Duration value object for encapsulating a duration with nanosecond granularity
* Introduced ResourceUsageFormatter object for formatting resource usage with option to explicitly pass a duration (instead of looking at the unreliable $_SERVER['REQUEST_TIME_FLOAT'] variable)
Changed
* The methods of Timer are no longer static
* Timer::stop() now returns a Duration value object
Removed
* Functionality that is now implemented in Duration and ResourceUsageFormatter has been removed from Timer
[3.1.4] - 2020-04-20
Changed
* Timer::timeSinceStartOfRequest() no longer tries $_SERVER['REQUEST_TIME'] when $_SERVER['REQUEST_TIME_FLOAT'] is not available ($_SERVER['REQUEST_TIME_FLOAT'] was added in PHP 5.4 and this library requires PHP 7.3)
* Improved exception messages when $_SERVER['REQUEST_TIME_FLOAT'] is not set or is not of type float
Changed
[3.1.3] - 2020-04-20
Changed
* Timer::timeSinceStartOfRequest() now raises an exception if $_SERVER['REQUEST_TIME_FLOAT'] does not contain a float (or $_SERVER['REQUEST_TIME'] does not contain an int)
[3.1.2] - 2020-04-17
Changed
* Improved the fix for #30 and restored usage of hrtime()
[3.1.1] - 2020-04-17
Fixed
* #30: Resolution of time returned by Timer::stop() is different than before (this reverts using hrtime() instead of microtime())
[3.1.0] - 2020-04-17
Added
* Timer::secondsToShortTimeString() as alternative to Timer::secondsToTimeString()
Changed
* Timer::start() and Timer::stop() now use hrtime() (high resolution monotonic timer) instead of microtime()
* Timer::timeSinceStartOfRequest() now uses Timer::secondsToShortTimeString() for time formatting
* Improved formatting of Timer::secondsToTimeString() result
[3.0.0] - 2020-02-07
Removed
* This component is no longer supported on PHP 7.1 and PHP 7.2
[2.1.2] - 2019-06-07
Fixed
* #21: Formatting of memory consumption does not work on 32bit systems
[2.1.1] - 2019-02-20
Changed
* Improved formatting of memory consumption for resourceUsage()
[2.1.0] - 2019-02-20
Changed
* Improved formatting of memory consumption for resourceUsage()
[2.0.0] - 2018-02-01
Changed
* This component now uses namespaces
Removed
* This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0
[9.0.0]: https://github.com/sebastianbergmann/php-timer/compare/8.0...9.0.0
[8.0.0]: https://github.com/sebastianbergmann/php-timer/compare/7.0...8.0.0
[7.0.1]: https://github.com/sebastianbergmann/php-timer/compare/7.0.0...7.0.1
[7.0.0]: https://github.com/sebastianbergmann/php-timer/compare/6.0...7.0.0
[6.0.0]: https://github.com/sebastianbergmann/php-timer/compare/5.0.3...6.0.0
[5.0.3]: https://github.com/sebastianbergmann/php-timer/compare/5.0.2...5.0.3
[5.0.2]: https://github.com/sebastianbergmann/php-timer/compare/5.0.1...5.0.2
[5.0.1]: https://github.com/sebastianbergmann/php-timer/compare/5.0.0...5.0.1
[5.0.0]: https://github.com/sebastianbergmann/php-timer/compare/4.0.0...5.0.0
[4.0.0]: https://github.com/sebastianbergmann/php-timer/compare/3.1.4...4.0.0
[3.1.4]: https://github.com/sebastianbergmann/php-timer/compare/3.1.3...3.1.4
[3.1.3]: https://github.com/sebastianbergmann/php-timer/compare/3.1.2...3.1.3
[3.1.2]: https://github.com/sebastianbergmann/php-timer/compare/3.1.1...3.1.2
[3.1.1]: https://github.com/sebastianbergmann/php-timer/compare/3.1.0...3.1.1
[3.1.0]: https://github.com/sebastianbergmann/php-timer/compare/3.0.0...3.1.0
[3.0.0]: https://github.com/sebastianbergmann/php-timer/compare/2.1.2...3.0.0
[2.1.2]: https://github.com/sebastianbergmann/php-timer/compare/2.1.1...2.1.2
[2.1.1]: https://github.com/sebastianbergmann/php-timer/compare/2.1.0...2.1.1
[2.1.0]: https://github.com/sebastianbergmann/php-timer/compare/2.0.0...2.1.0
[2.0.0]: https://github.com/sebastianbergmann/php-timer/compare/1.0.9...2.0.0
---
README
phpunit/php-timer
[](https://packagist.org/packages/phpunit/php-timer)
[](https://github.com/sebastianbergmann/php-timer/actions)
[](https://codecov.io/gh/sebastianbergmann/php-timer)
Utility class for timing things, factored out of PHPUnit into a stand-alone component.
Installation
You can add this library as a local, per-project dependency to your project using Composer:
composer require phpunit/php-timerIf you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency:
composer require --dev phpunit/php-timerUsage
Basic Timing
require __DIR__ . '/vendor/autoload.php';use SebastianBergmann\Timer\Timer;
$timer = new Timer;
$timer->start();
foreach (\range(0, 100000) as $i) {
// ...
}
$duration = $timer->stop();
var_dump(get_class($duration));
var_dump($duration->asString());
var_dump($duration->asSeconds());
var_dump($duration->asMilliseconds());
var_dump($duration->asMicroseconds());
var_dump($duration->asNanoseconds());
The code above yields the output below:
string(32) "SebastianBergmann\Timer\Duration"
string(9) "00:00.002"
float(0.002851062)
float(2.851062)
float(2851.062)
int(2851062)Resource Consumption
#### Explicit duration
require __DIR__ . '/vendor/autoload.php';use SebastianBergmann\Timer\ResourceUsageFormatter;
use SebastianBergmann\Timer\Timer;
$timer = new Timer;
$timer->start();
foreach (\range(0, 100000) as $i) {
// ...
}
print (new ResourceUsageFormatter)->resourceUsage($timer->stop());
The code above yields the output below:
Time: 00:00.002, Memory: 6.00 MB#### Duration since PHP Startup (using unreliable $_SERVER['REQUEST_TIME_FLOAT'])
require __DIR__ . '/vendor/autoload.php';use SebastianBergmann\Timer\ResourceUsageFormatter;
foreach (\range(0, 100000) as $i) {
// ...
}
print (new ResourceUsageFormatter)->resourceUsageSinceStartOfRequest();
The code above yields the output below:
Time: 00:00.002, Memory: 6.00 MB---
SECURITY
Security Policy
The library that is developed in this repository is a first-party dependency of PHPUnit.
PHPUnit's Security Policy applies to this library as well.
If you believe you have found a security vulnerability in this library, please report it to me through coordinated disclosure.
Use my PGP key for encrypted email, for example when your report includes proof-of-concept exploits against third-party systems.
Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.
---