50 lines
1.1 KiB
PHP
50 lines
1.1 KiB
PHP
|
<?php
|
||
|
|
||
|
declare(strict_types=1);
|
||
|
|
||
|
namespace OpenTelemetry\SDK\Common\Time;
|
||
|
|
||
|
use function hrtime;
|
||
|
use function microtime;
|
||
|
|
||
|
final class SystemClock implements ClockInterface
|
||
|
{
|
||
|
private static int $referenceTime = 0;
|
||
|
|
||
|
public function __construct()
|
||
|
{
|
||
|
self::init();
|
||
|
}
|
||
|
|
||
|
public static function create(): self
|
||
|
{
|
||
|
return new self();
|
||
|
}
|
||
|
|
||
|
/** @inheritDoc */
|
||
|
public function now(): int
|
||
|
{
|
||
|
return self::$referenceTime + hrtime(true);
|
||
|
}
|
||
|
|
||
|
private static function init(): void
|
||
|
{
|
||
|
if (self::$referenceTime > 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
self::$referenceTime = self::calculateReferenceTime(
|
||
|
microtime(true),
|
||
|
hrtime(true)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Calculates the reference time which is later used to calculate the current wall clock time in nanoseconds by adding the current uptime.
|
||
|
*/
|
||
|
private static function calculateReferenceTime(float $wallClockMicroTime, int $upTime): int
|
||
|
{
|
||
|
return ((int) ($wallClockMicroTime * ClockInterface::NANOS_PER_SECOND)) - $upTime;
|
||
|
}
|
||
|
}
|