Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】time_nanosleep()関数の使い方

time_nanosleep関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

time_nanosleep関数は、PHPプログラムの実行を指定された時間だけ一時停止させる機能を提供する関数です。この関数は、スクリプトの処理を指定された秒数とナノ秒数の合計時間だけ中断します。ナノ秒は10億分の1秒と非常に短い時間単位で、より精密な時間間隔での待機が必要な場合に活用されます。

引数としては、$secondsで停止したい秒数を非負の整数で、また$nanosecondsで停止したいナノ秒数を0から999,999,999の範囲の非負の整数として指定します。例えば、外部リソースへの過剰な連続アクセスを避けるための短い休止や、一定間隔での状態確認といったポーリング処理などに役立ちます。

PHP 8.0.0以降のバージョンでは、この関数は常にtrueを返します。ただし、指定された時間の一時停止精度は、プログラムが動作するオペレーティングシステムの性能に依存するため、厳密な時間が保証されるわけではない点にご留意ください。

構文(syntax)

1<?php
2$success = time_nanosleep(1, 500000000);

引数(parameters)

引数なし

引数はありません

戻り値(return)

array|false

指定された時間(秒とナノ秒)だけ処理を一時停止します。成功した場合は、配列で経過時間(秒とナノ秒)を返します。失敗した場合は false を返します。

サンプルコード

プログラムをナノ秒単位で一時停止する

1<?php
2
3/**
4 * ナノ秒単位でプログラムの実行を一時停止します。
5 *
6 * この関数は、システムのリソース状況に応じて非常に短い時間、
7 * 処理を停止するナノ秒スリープをシミュレートします。
8 *
9 * @return array|false スリープが正常に完了し、中断されなかった場合は空の配列 `[]` を返します。
10 *                     スリープが途中で中断された場合は、残り時間を示す配列
11 *                     (例: `['seconds' => 0, 'nanoseconds' => 123]`) を返します。
12 *                     操作が失敗した場合は `false` を返します。
13 */
14function time_nanosleep(): array|false
15{
16    // PHPの標準機能では直接ナノ秒スリープを行うことはできませんが、
17    // ここではリファレンス情報に基づいてその動作をシミュレートします。
18    // 引数がないため、内部で固定された非常に短い時間スリープを試みます。
19
20    // 成功し、中断されずにスリープが完了したケースをシミュレートします。
21    // その場合、残りの時間がないことを示す空の配列を返します。
22    return [];
23
24    // 他のシナリオを試す場合は、以下の行のコメントを解除してください。
25    //
26    // // スリープが途中で中断された場合をシミュレートする場合:
27    // return ['seconds' => 0, 'nanoseconds' => 123];
28    //
29    // // スリープ操作自体が失敗した場合をシミュレートする場合:
30    // return false;
31}
32
33// --- time_nanosleep 関数の使用例 ---
34
35// time_nanosleep 関数を呼び出し、その戻り値に応じて処理を分岐します。
36$result = time_nanosleep();
37
38if ($result === false) {
39    echo "ナノ秒スリープ操作に失敗しました。\n";
40} elseif (empty($result)) {
41    echo "ナノ秒スリープ操作が正常に完了しました。\n";
42} else {
43    // スリープが中断された場合、残り時間が配列で返されます。
44    echo "ナノ秒スリープ操作が中断されました。残り時間: "
45        . ($result['seconds'] ?? 0) . "秒と"
46        . ($result['nanoseconds'] ?? 0) . "ナノ秒。\n";
47}
48
49// スリープ試行後もプログラムは継続して実行されます。
50echo "プログラムはナノ秒スリープの試行後に継続します。\n";
51

PHPのtime_nanosleep関数は、プログラムの実行をナノ秒という非常に短い時間単位で一時的に停止させることを目的とした機能です。これにより、処理のタイミングをミリ秒よりもさらに細かく調整したり、システムリソースをわずかな時間だけ解放したりする際に役立ちます。

この関数は引数を持ちません。内部でごく短い時間だけ、プログラムの実行を一時停止しようと試みます。

関数の実行結果は戻り値で確認できます。プログラムの実行停止が正常に完了し、途中で中断されなかった場合は、空の配列である [] を返します。もし何らかの理由でスリープが中断された場合には、まだスリープが必要だった残り時間を示す連想配列が返されます。この配列には、残り時間が秒とナノ秒で、例えば ['seconds' => 0, 'nanoseconds' => 123] のように格納されます。万が一、一時停止操作自体がシステム上で失敗した場合は、false が戻り値として返されます。

サンプルコードでは、time_nanosleep関数を呼び出し、その戻り値が false なのか、空の配列なのか、あるいは残り時間を示す配列なのかによって、適切なメッセージを出力し、その後のプログラムの処理を分岐しています。このように、戻り値を確認することで、関数の成否や詳細な状態を把握し、プログラムの動作を適切に制御することが可能です。一時停止の試みが終わった後も、プログラムは次の処理を継続して実行します。

このtime_nanosleep関数はPHPの標準機能ではなく、ナノ秒スリープの動作を理解するためのシミュレーションである点に特に注意が必要です。実際のナノ秒スリープ機能では通常、引数で停止時間を指定しますが、このサンプルでは引数なしで固定時間を想定しています。戻り値は失敗を示すfalse、正常完了を示す空の配列[]、そして中断されて残り時間を示す配列の3パターンがあります。そのため、結果の確認はfalseだけでなく、空配列かどうかも判断基準となります。PHPではナノ秒単位の厳密なスリープは難しく、システムリソースに依存するため、このサンプルは概念理解に留めてください。

time_nanosleepでスクリプトを一時停止する

1<?php
2
3/**
4 * time_nanosleep関数の使用例を示します。
5 * 指定された秒数とナノ秒数だけスクリプトの実行を一時停止します。
6 */
7function demonstrateTimeNanosleep(): void
8{
9    echo "--- time_nanosleep の例 ---" . PHP_EOL;
10    echo "スクリプトの実行を一時停止します。" . PHP_EOL;
11
12    $secondsToSleep = 1;      // 一時停止する秒数
13    $nanosecondsToSleep = 500000000; // 一時停止するナノ秒数 (0.5秒 = 5億ナノ秒)
14
15    $start = microtime(true); // 一時停止開始時刻を記録
16
17    echo "{$secondsToSleep}秒と{$nanosecondsToSleep}ナノ秒 (合計1.5秒) の間、一時停止します..." . PHP_EOL;
18
19    /**
20     * time_nanosleep() 関数は、スクリプトの実行を指定された時間だけ一時停止します。
21     * 成功した場合は残りの時間を示す配列 (通常は ['seconds' => 0, 'nanoseconds' => 0]) を返し、
22     * 失敗した場合は false を返します。
23     * シグナルなどによって中断された場合は、中断までの時間と残りの時間を示す配列が返されます。
24     */
25    $result = time_nanosleep($secondsToSleep, $nanosecondsToSleep);
26
27    $end = microtime(true); // 一時停止終了時刻を記録
28    $elapsed = round($end - $start, 3); // 経過時間を計算 (小数点以下3桁に丸める)
29
30    if ($result === false) {
31        echo "time_nanosleep の呼び出しが失敗しました。" . PHP_EOL;
32    } elseif (is_array($result)) {
33        if ($result['seconds'] === 0 && $result['nanoseconds'] === 0) {
34            echo "time_nanosleep は成功し、指定された時間だけ一時停止しました。" . PHP_EOL;
35            echo "実際に一時停止した時間: 約 {$elapsed}秒" . PHP_EOL;
36        } else {
37            echo "time_nanosleep は指定された時間よりも早く中断されました。" . PHP_EOL;
38            echo "残りの時間: {$result['seconds']}{$result['nanoseconds']}ナノ秒" . PHP_EOL;
39            echo "実際に一時停止した時間: 約 {$elapsed}秒" . PHP_EOL;
40        }
41    } else {
42        echo "time_nanosleep から予期せぬ戻り値がありました。" . PHP_EOL;
43    }
44
45    echo "一時停止が終了しました。" . PHP_EOL;
46}
47
48// 関数を実行して動作を確認
49demonstrateTimeNanosleep();

PHPのtime_nanosleep関数は、スクリプトの実行を指定された秒数とナノ秒数の間、一時停止させるために使用されます。ナノ秒は10億分の1秒という非常に短い時間の単位で、この関数を使うことで非常に細かく実行を制御できます。

この関数は、最初の引数に一時停止したい「秒数(整数)」、2番目の引数に「ナノ秒数(整数)」を指定します。サンプルコードでは、$secondsToSleepに1秒、$nanosecondsToSleepに5億ナノ秒(つまり0.5秒)を設定し、合計1.5秒の一時停止を試みています。

戻り値は、関数が成功したか、または何らかの理由で中断されたかによって異なります。指定された時間通りに一時停止が完了した場合、通常は残りの時間がゼロであることを示す配列(['seconds' => 0, 'nanoseconds' => 0])が返されます。もし、OSのシグナルなどによって指定時間よりも早く一時停止が中断された場合、中断までの時間と「まだ一時停止すべきだった残りの時間」を示す配列が返されます。関数自体の呼び出しが失敗した場合はfalseが返されます。

サンプルコードでは、一時停止の前後で時刻を記録し、実際にどのくらいの時間スクリプトが停止したかを確認しています。戻り値によって、関数が正常に動作したか、途中で中断されたかを判断し、その結果を表示しています。これにより、スクリプトの実行を特定の時間だけ遅らせたい場合に、この関数をどのように使うか、またその結果をどのように解釈すればよいかがわかります。

サンプルコードでは、一時停止したい秒数とナノ秒数を引数として渡します。これは、スクリプトの実行を一時停止する時間を設定するためのものです。この関数は、指定時間ぴったりの一時停止を保証するものではなく、システム負荷や外部シグナルにより指定時間より早く中断される可能性があります。そのため、戻り値がfalseの場合は失敗、配列の場合は成功または中断されたことを意味しますので、必ず戻り値の型と内容を確認し、適切に処理してください。特に、配列の場合、指定時間よりも早く中断された際に、残りの時間が示されることがあります。ナノ秒は10億分の1秒と理解しておきましょう。

関連コンテンツ

関連プログラミング言語