現在の位置: ホーム> 最新記事一覧> time_nanos睡眠割り込み信号によって中断された場合はどうすればよいですか?

time_nanos睡眠割り込み信号によって中断された場合はどうすればよいですか?

gitbox 2025-05-27

PHPでは、 Time_nanos Sleep()関数を使用して、プログラムをナノ秒精度で指定した時間の間睡眠にします。たとえば、使用は非常に簡単です。

 time_nanosleep(1, 500000000); // 寝る1.52番

ただし、実際に使用すると、 Time_nanos Sleep()はシステム信号(割り込み信号など)によって中断され、睡眠が早期に終了する可能性があります。この場合、関数は、ブールのではなく、残りの秒とナノ秒を含む配列を返します。

なぜ信号によって中断されるのですか?

LinuxまたはUNIXシステムでは、プロセスはさまざまな信号(Sigint、Sigtermなど)を受け取り、睡眠状態を中断し、 Time_nanos Sleep()が戻ってきます。 PHP自体は睡眠を自動的に再試行しないため、睡眠時間が不正確になります。

判断して回復する方法は?

time_nanosleep()が信号によって中断されると、それはtrueを返さず、配列を返します。

 [
    'seconds' => 剩余2番数,
    'nanoseconds' => 剩余纳2番数,
]

これに基づいて、完全な睡眠時間を確保するためにループを作成できます。

 function reliable_nanosleep(int $seconds, int $nanoseconds): void {
    while (true) {
        $result = time_nanosleep($seconds, $nanoseconds);
        if ($result === true) {
            // 睡眠は正常に完了しました
            break;
        }
        // 信号によって中断されます,$result 残りの時間が含まれています
        $seconds = $result['seconds'];
        $nanoseconds = $result['nanoseconds'];
    }
}

この関数は、完全な睡眠が完了するまで、残りの睡眠時間を再試行し続けます。

完全なサンプルコード

<?php
function reliable_nanosleep(int $seconds, int $nanoseconds): void {
    while (true) {
        $result = time_nanosleep($seconds, $nanoseconds);
        if ($result === true) {
            break;
        }
        $seconds = $result['seconds'];
        $nanoseconds = $result['nanoseconds'];
    }
}

// 例:寝る2.32番
echo "开始寝る\n";
reliable_nanosleep(2, 300000000);
echo "寝る结束\n";
?>

追加のアドバイス

  • 信号処理:プログラムが信号を処理する必要がある場合は、 PCNTL_SIGNAL()と組み合わせて信号処理機能を設定して、割り込み動作をより合理的に管理することをお勧めします。

  • 代替:システム環境がUSLoop()またはSleep()をサポートしている場合、それらも使用できますが、精度が低くなります。


詳細なPHP関連情報については、詳細なドキュメントと例については、 gitbox.net/php -docsを参照してください。