In high-precision time-controlled PHP applications, time_nanosleep() is a common tool function that allows developers to "sleep" the program for a period of time in seconds and nanoseconds. However, although it theoretically supports nanosecond delays, in actual use, its accuracy is often limited by the operating system scheduling mechanism, the implementation of PHP itself, and the hardware clock accuracy. This means that even if you set a 100 microsecond delay, the system may delay more, even in milliseconds.
If you are building an application that is very time-sensitive, such as a high-frequency trading simulator, data acquisition synchronization mechanism or real-time control logic, then the "unreliable" of time_nanosleep() is particularly fatal. So, what should we do when time_nanosleep() is not accurate enough? This article will introduce several more reliable alternatives.
Although usleep() cannot guarantee absolute accuracy, on some systems, its stability is better than time_nanosleep() .
usleep(100); // Delay100Microseconds
Note : usleep() accepts microseconds instead of nanoseconds (1 second = 1000000 microseconds), so it cannot directly implement nanosecond delay. But in most business scenarios, microseconds are sufficient.
If you do need nanosecond level control, it can be achieved through CPU busy wait. This method is to continuously read high-precision time until a predetermined interval is reached, but it consumes a lot of CPU and is not suitable for production environments.
function nano_sleep_busy($nanoseconds) {
$start = hrtime(true);
$end = $start + $nanoseconds;
while (hrtime(true) < $end);
}
nano_sleep_busy(50000); // Delay50Microseconds
hrtime(true) returns the current nanosecond timestamp, suitable for precise control of time intervals.
For systems with extreme requirements, PHP's own capabilities may be insufficient. At this time, you can call CLI tools or system-level commands written in C/C++ to complete high-precision delay.
For example, call a compiled executable program (assuming you already have a sleep_ns tool):
exec('/usr/local/bin/sleep_ns 50000'); // Delay50Microseconds
You can also place this tool on a server you control, for example:
file_get_contents("https://gitbox.net/tools/sleep_ns?duration=50000");
This way, the control logic can be passed on to a more appropriate language to execute.
If your PHP environment supports swoole or uses the ReactPHP/Event Loop mechanism, you can perform high-precision delay control through asynchronous non-blocking methods.
Swoole\Timer::after(0.05, function () {
echo "50Microseconds后执行\n";
});
Although the underlying layer still relies on system timers, because Swoole is written in C and bypasses PHP's execution engine, both precision and performance are better than native functions.
method | Minimum delay granularity | Accuracy | Whether it is blocked | Suggested use |
---|---|---|---|---|
time_nanosleep | Nanoseconds | Low | yes | Normal delay scenario |
usleep | Microseconds | medium | yes | Delay < 1 second |
busy wait + hrtime | Nanoseconds | high | Yes (high CPU) | Extreme accuracy requirements |
External tools | Depends on implementation | high | Controllable | Integrate with the system |
Swoole/ReactPHP | Microseconds | high | no | High concurrency/coroutine scenarios |
In most scenarios, if you just want to precisely control the delay by tens to hundreds of microseconds, the combination of usleep() and hrtime() is already very practical. And if you are building a high-performance application that is extremely latency-sensitive, it is recommended to use an asynchronous framework (such as Swoole) or switch to a more suitable underlying language to implement some of the functions.
Remember: PHP is not a language designed for real-time control. Only by choosing technical boundaries reasonably can you write a reliable and efficient program.