High-precision NTP time synchronization package with powerful CLI tools
A professional-grade PHP package for querying NTP servers and synchronizing system time with network time servers. Built with Hixbe's primary server time.hixbe.com for ultra-reliable time synchronization.
✨ Rich Feature Set
- 🚀 High-performance NTP client
- 📊 Raw packet inspection & analysis
- ⏱️ Precise timestamp conversion (NTP to Unix)
- 🔄 Continuous sync mode with configurable intervals
- 📡 Multiple server support (Hixbe, pool.ntp.org, etc.)
- 📋 Detailed verbose reporting
- 🎨 Beautiful CLI with multiple output formats
- 🔐 Type-safe implementation with readonly properties
- ⚡ Minimal dependencies (requires sockets extension)
- PHP 8.1 or higher
- sockets extension enabled
composer require hixbe/time# Get current time from Hixbe server
./vendor/bin/hixbe-time
# Verbose mode with raw packet details
./vendor/bin/hixbe-time --verbose
# Output as JSON
./vendor/bin/hixbe-time --json
# Get time offset (useful for scripts)
./vendor/bin/hixbe-time --offset
# Continuous synchronization (every 5 seconds)
./vendor/bin/hixbe-time --continuous
# Custom interval (every 2 seconds)
./vendor/bin/hixbe-time --continuous --interval 2000
# Query different server
./vendor/bin/hixbe-time --server pool.ntp.org --verbose
# Show only the offset
./vendor/bin/hixbe-time --offset<?php
use Hixbe\Time\Core\NTPClient;
use Hixbe\Time\Core\NTPClientConfig;
// Basic usage
$client = new NTPClient();
$result = $client->query();
echo $result->parsed->timestamps->transmit->date->format('Y-m-d H:i:s');
// Get current time
$time = $client->getTime();
echo $time->format('Y-m-d H:i:s');
// Get offset between local and server time
$offsetMs = $client->getOffset();
echo sprintf('System is %s by %.0fms', $offsetMs > 0 ? 'slow' : 'fast', abs($offsetMs));
// Custom server
$config = new NTPClientConfig(
host: 'time.google.com',
timeout: 3.0
);
$customClient = new NTPClient($config);
$time = $customClient->getTime();Main class for NTP queries.
class NTPClient
{
public function __construct(?NTPClientConfig $config = null);
/**
* Query NTP server
* @throws Exception
*/
public function query(): NTPQueryResult;
/**
* Get current time from NTP server
* @throws Exception
*/
public function getTime(): DateTime;
/**
* Get offset between local and server time
* @return float Offset in milliseconds (positive = local is slow)
* @throws Exception
*/
public function getOffset(): float;
}Configuration options for NTP client.
class NTPClientConfig
{
public function __construct(
public readonly string $host = 'time.hixbe.com',
public readonly int $port = 123,
public readonly float $timeout = 5.0,
public readonly array $fallbackServers = ['time.google.com', 'pool.ntp.org']
);
}Result from NTP query containing all response data.
class NTPQueryResult
{
public readonly string $buffer; // Raw response buffer
public readonly string $hexDump; // Hexadecimal dump
public readonly ParsedNTPPacket $parsed; // Parsed packet data
public readonly string $serverAddress; // Server IP address
public readonly DateTime $clientReceiveTime; // Client receive timestamp
public readonly DateTime $clientOriginateTime; // Client send timestamp
public readonly ?string $usedServer; // Server hostname used
}Usage: hixbe-time [OPTIONS]
High-precision NTP time synchronization
Options:
-s, --server <server> NTP server to query (default: time.hixbe.com)
-j, --json Output in JSON format
-v, --verbose Verbose output with packet details
-o, --offset Show only time offset in milliseconds
-c, --continuous Continuous synchronization mode
-i, --interval <ms> Interval for continuous mode in milliseconds (default: 5000)
-h, --help Show this help message
--version Show version information
<?php
use Hixbe\Time\Core\NTPClient;
$client = new NTPClient();
$serverTime = $client->getTime();
echo "Server time: " . $serverTime->format('Y-m-d H:i:s.v');<?php
use Hixbe\Time\Core\NTPClient;
$client = new NTPClient();
$offset = $client->getOffset();
if (abs($offset) > 1000) {
echo "⚠️ WARNING: System clock is off by {$offset}ms\n";
} else {
echo "✅ System clock is synchronized (offset: {$offset}ms)\n";
}<?php
use Hixbe\Time\Core\NTPClient;
use Hixbe\Time\Core\NTPClientConfig;
$servers = ['time.hixbe.com', 'time.google.com', 'pool.ntp.org'];
foreach ($servers as $server) {
$config = new NTPClientConfig(host: $server);
$client = new NTPClient($config);
try {
$result = $client->query();
echo "{$server}: {$result->parsed->timestamps->transmit->iso}\n";
} catch (Exception $e) {
echo "{$server}: Error - {$e->getMessage()}\n";
}
}<?php
use Hixbe\Time\Core\NTPClient;
$client = new NTPClient();
while (true) {
try {
$result = $client->query();
$serverTime = $result->parsed->timestamps->transmit->date;
$offset = $client->getOffset();
echo sprintf(
"%s | Offset: %+.0fms\n",
$serverTime->format('Y-m-d\TH:i:s.v\Z'),
$offset
);
} catch (Exception $e) {
echo "Error: {$e->getMessage()}\n";
}
sleep(5); // Wait 5 seconds
}======================================================================
🕐 HIXBE TIME SYNC
======================================================================
Server: 154.26.137.94 (time.hixbe.com)
UTC Time: 2025-12-16T04:27:07.341Z
Local Time: 2025-12-16 04:27:07.341 +00:00
Offset: +0.480 seconds
Precision: ±231 (2^x sec)
Stratum: 2
======================================================================
{
"timestamp": 1765859251781,
"iso": "2025-12-16T04:27:31.781Z",
"server": {
"address": "154.26.137.94",
"stratum": 2,
"referenceId": "0xD8EF230C"
},
"offset": 524,
"precision": 231,
"version": 4
}Shows detailed packet analysis including:
- All timestamps (reference, originate, receive, transmit)
- Raw NTP timestamp data in hexadecimal
- Complete packet header information
- Full hex dump of the response packet
# Run tests
composer test
# Run tests with coverage
composer test-coverageMIT License - see LICENSE file for details.
Hixbe - https://hixbe.com
Contributions are welcome! Please feel free to submit a Pull Request.
- Homepage: https://github.com/hixbehq/php-time
- Packagist: https://packagist.org/packages/hixbe/time
- Issues: https://github.com/hixbehq/php-time/issues