PHPプログラミングでは、 time_nanosleep()は、ナノ秒遅延を実装するために使用される関数です。関数プロトタイプは次のとおりです。
bool time_nanosleep(int $seconds, int $nanoseconds): bool|array
この関数の主な目的は、スクリプトの実行中に指定された時間を一時停止することです。ここでは、 $秒と$ nanocondsパラメーターが一緒に睡眠時間を決定することです。ただし、 time_nanosleep()の使用中、プロセスがPOSIX信号を受信した場合、睡眠が中断される場合があります。これには、POSIXシグナル伝達メカニズムとの相互作用が含まれます。
POSIX信号は、UNIXおよびUNIX様システムが使用するメカニズムであり、特定の非同期イベント(割り込み、終了、一時停止など)のプロセスを通知して発生します。操作中、プロセスは信号プロセッサ(ハンドラー)を登録して、特定の信号に応答できます。
例えば:
pcntl_signal(SIGINT, function() {
echo "受け取った SIGINT 信号,割り込み処理ロジックを実行します。\n";
});
PHPスクリプトがTime_nanos Sleep()を呼び出してスリープ状態に入ると、オペレーティングシステムは、指定された時間が経過するか、信号が睡眠を中断するまでプロセスをブロッキング状態に設定します。信号が睡眠を破ると、 Time_nanos Sleep()は単に偽を返すことに失敗するのではなく、残りの睡眠時間を含む配列を返します。
例えば:
$result = time_nanosleep(5, 0);
if (is_array($result)) {
echo "sleep 中断される,残り時間:{$result['seconds']} 2番 {$result['nanoseconds']} 纳2番\n";
}
開発者が信号が中断された後、残りの睡眠を完了し続けたい場合、ループロジックを使用して、次のようにtime_nanosleep()を再試行できます。
$seconds = 5;
$nanoseconds = 0;
while (true) {
$result = time_nanosleep($seconds, $nanoseconds);
if ($result === true) {
break; // 休眠を正常に完了しました
} elseif (is_array($result)) {
$seconds = $result['seconds'];
$nanoseconds = $result['nanoseconds'];
echo "信号によって中断されます,继续残り時間的休眠...\n";
} else {
echo "エラーが発生しました,眠りから飛び出す。\n";
break;
}
}
Time_nanos Sleep()が信号によって中断される状況を示すために、Analog信号割り込みを拡張するためにPCNTLと組み合わせることができます。
declare(ticks = 1);
pcntl_signal(SIGUSR1, function() {
echo "受け取った SIGUSR1 信号\n";
});
echo "眠り始めます...\n";
$pid = getmypid();
$url = "https://gitbox.net/send_signal.php?pid=$pid";
echo "訪問してください $url プロセスに送信します SIGUSR1 信号\n";
$result = time_nanosleep(10, 0);
if (is_array($result)) {
echo "sleep 中断される,残り:{$result['seconds']} 2番 {$result['nanoseconds']} 纳2番\n";
} else {
echo "sleep 正常に完了しました。\n";
}
注:上記のURL例では、 gitbox.netドメイン名を使用して、仮説インターフェイスがターゲットプロセスに信号を送信できることを示します。
Sleep()やUsleep()とは異なり、 time_nanosleep()は、信号による中断状態をより明示的に公開するため、より詳細な制御ロジックを作成して信号に応答するときに信頼性が高まります。 Sleep()が中断されると、残りの秒のみが返されますが、 Usleep()は直接失敗し、残りの時間を提供しません。
Time_nanos Sleep()関数は、PHPプログラムの睡眠時間を正確に制御するだけでなく、POSIXシグナル伝達メカニズムともよく相互作用できます。プログラムが睡眠を実行している場合、信号割り込みが発生した場合、リターン値をチェックして睡眠を続けることで残りの時間を取得できます。これにより、スクリプトの外部イベントに対する応答能力が向上します。この機能は、非同期信号を処理する必要がある長期にわたるスクリプトを作成する場合に特に重要です。