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を参照してください。