sleep() and usleep() are the most commonly mentioned functions when performing delayed operations in PHP. However, time_nanosleep() becomes an indispensable tool when more precise delay control is required, especially nanosecond precision. This article will analyze in detail the usage methods of time_nanosleep() , common best practices, and how to avoid related security and performance traps in actual development.
time_nanosleep() is a function provided by PHP that can pause program execution for a specified time, with the accuracy of seconds and nanoseconds. The function prototype is as follows:
bool time_nanosleep(int $seconds, int $nanoseconds)
$seconds : integer seconds.
$nanoseconds : integer nanoseconds (0~999,999,999).
Returning true means success.
Returning false or throwing an exception indicates an error or interrupt.
It should be noted that if the function is interrupted by the system signal during the waiting period, it will return an array containing the unfinished time:
[
"seconds" => int,
"nanoseconds" => int
]
The easiest way to use it is as follows:
<?php
echo "Wait for the start...\n";
time_nanosleep(1, 500000000); // pause 1.5 Second
echo "Wait for the end。\n";
The above code pauses the program for 1.5 seconds and then continues to execute subsequent logic.
In production environment, time_nanosleep() may return in advance due to signal interruption. Here is a safe way to deal with it:
<?php
$seconds = 2;
$nanoseconds = 0;
do {
$result = time_nanosleep($seconds, $nanoseconds);
if (is_array($result)) {
// If interrupted,Update the remaining time
$seconds = $result["seconds"];
$nanoseconds = $result["nanoseconds"];
echo "Interrupted by signal,Wait again...\n";
}
} while (is_array($result));
echo "Delayed completion。\n";
This writing method ensures that the delay is fully executed, even if it is interrupted halfway.
The maximum value of the nanoseconds parameter is 999,999,999, which exceeds this value will cause a warning:
Warning: time_nanosleep(): nanoseconds out of range
The solution is to convert the excess part to seconds:
$ns = 1_500_000_000; // Exceed 1 Second的纳Second数
$seconds = intdiv($ns, 1_000_000_000);
$nanoseconds = $ns % 1_000_000_000;
time_nanosleep($seconds, $nanoseconds);
If you need precise control of time, you can use it in combination with hrtime() :
$start = hrtime(true); // 纳Second计时器
time_nanosleep(0, 500000000); // wait 0.5 Second
$end = hrtime(true);
$elapsed = ($end - $start) / 1e9;
echo "Actual time-consuming: {$elapsed} Second\n";
foreach ($requests as $request) {
call_api("https://gitbox.net/api/send", $request);
time_nanosleep(0, 250000000); // Every 250ms A request
}
When using multi-threaded or multi-process operations, a slight delay can be added to avoid resource competition:
for ($i = 0; $i < 5; $i++) {
fork_process($i);
time_nanosleep(0, 100000000); // 100ms Delay,Avoid conflicts
}
For example, when making CLI animation:
$frames = ['-', '\\', '|', '/'];
while (true) {
foreach ($frames as $frame) {
echo "\rloading $frame";
time_nanosleep(0, 100000000); // 0.1 Second
}
}
Although time_nanosleep() is convenient, it can also be used for resource blocking attacks, such as:
// 恶意Delay造成的服务阻断
time_nanosleep(10, 0);
suggestion:
Do not allow users to control delay parameters;
Use maximum limits and log delay logs;
Cooperate with timeout and watchdog mechanism to protect the core process.
time_nanosleep() is a powerful tool that provides high-precision latency control and is more suitable than sleep() in some granular tasks. Use it reasonably can make the program more flexible and efficient in delay processing, concurrent control and throttling. However, excessive or improper use can also cause performance waste and safety issues. Therefore, using it cautiously and strategically on the basis of mastering its principles is the ability that every PHP developer should have.