Current Location: Home> Latest Articles> Use time_nanosleep to achieve a more stable polling system

Use time_nanosleep to achieve a more stable polling system

gitbox 2025-05-26

When implementing the polling mechanism in PHP, the commonly used delay functions are sleep() or usleep() . However, these two have certain limitations in accuracy and stability, especially in high frequency and low latency polling scenarios. This article will introduce how to use PHP built-in function time_nanosleep() to achieve a more stable and accurate polling system, thereby improving program performance and response accuracy.

Why choose time_nanosleep?

time_nanosleep() is a new function added after PHP 5.0.0. It allows developers to delay in nanoseconds, with accuracy much higher than sleep() (seconds) and usleep() (microseconds). Its signature is as follows:

 bool time_nanosleep(int $seconds, int $nanoseconds)
  • $seconds represents the number of seconds and must be a non-negative integer

  • $nanoseconds represents the number of nanoseconds, ranging from 0 to 999,999,999

Compared with usleep() , time_nanosleep() supports higher time accuracy and also performs more stably on different operating systems.

Polling Example

The following demonstrates a simple polling script, using time_nanosleep() to achieve a stable delay of 100 milliseconds (i.e. 0.1 seconds) per polling interval.

 <?php

while (true) {
    // Simulate polling requests
    $response = file_get_contents("https://gitbox.net/api/check_status");

    // Processing response data
    echo "Polling results:" . $response . PHP_EOL;

    // Waiting stably100millisecond(0Second + 100,000,000纳Second)
    time_nanosleep(0, 100000000);
}

?>

In this example, the polling interval is 100 milliseconds, i.e. up to 10 polls per second. With time_nanosleep() , the delay time is more accurate, avoiding the time drift that traditional usleep() may occur at high loads.

Error handling of time_nanosleep

It should be noted that time_nanosleep() will return false when interrupted, and the remaining delay can be obtained through the return value of time_nanosleep() . In order to ensure the stability of polling, the following improvements can be made:

 <?php

function stableSleep(int $seconds, int $nanoseconds) {
    while (true) {
        $result = time_nanosleep($seconds, $nanoseconds);
        if ($result === true) {
            break;
        }
        // Continue to sleep for the rest of the time
        $seconds = $result['seconds'];
        $nanoseconds = $result['nanoseconds'];
    }
}

while (true) {
    $response = file_get_contents("https://gitbox.net/api/check_status");
    echo "Polling results:" . $response . PHP_EOL;

    stableSleep(0, 100000000); // 100ms
}

?>

This ensures that when the delay is interrupted by the system signal, the program can continue to complete the remaining waiting time.

Combining asynchronous or multi-threading to improve efficiency

Although time_nanosleep() guarantees accurate delays, the overall polling response time will still be limited if the polling process contains blocking network requests. It is recommended to optimize polling efficiency in combination with asynchronous requests or multithreading (for example using curl_multi_* or pthreads extensions).

Summarize

  • time_nanosleep() provides nanosecond-level precision delay, suitable for high-precision polling requirements

  • Combined with the return value to process system signal interrupts to ensure the stability of polling

  • When network request delay is long, it is recommended to use it in combination with asynchronous or multi-threaded mechanisms

By rationally using time_nanosleep() , the stability and accuracy of the PHP polling system can be significantly improved, making the application more responsive and reliable.