【PHP8.x】usleep関数の使い方

作成日: 更新日:

usleep関数は、プログラムの実行を一時的に停止(スリープ)させる関数です。この関数は、指定された時間だけプログラムの処理を中断し、その後、中断した時点から処理を再開させます。停止時間はマイクロ秒(100万分の1秒)単位で指定します。具体的には、usleep(microseconds)のように、停止させたいマイクロ秒数を整数値で引数として渡します。たとえば、usleep(100000)と記述すると、プログラムは0.1秒間一時停止します。

この関数は、特定の処理の間に短い間隔を設けたい場合や、リソースへのアクセス頻度を調整したい場合などに利用されます。ただし、usleep関数による一時停止は、指定された時間に厳密に従うことを保証するものではありません。オペレーティングシステムや環境によっては、指定した時間よりも長く停止する可能性があり、高精度な時間制御には適さない場合があります。また、この関数が実行されている間、プログラム全体の処理は完全にブロックされますので、他の並行処理が必要な場合には注意が必要です。usleep関数は戻り値を返しません。プログラムの流れを一時的に調整するシンプルな手段としてご活用ください。

基本的な使い方

構文(syntax)

<?php

usleep(int $microseconds): void;

?>

引数(parameters)

int $microseconds

  • int $microseconds: 処理を停止させるマイクロ秒数を指定する整数

戻り値(return)

void

指定されたマイクロ秒数だけプログラムの実行を一時停止させます。戻り値はありません。

サンプルコード

PHP usleep で半秒間一時停止する

<?php

// プログラムの実行を指定されたマイクロ秒数だけ一時停止します。
// 1秒は1,000,000マイクロ秒です。
// キーワード「half second (0.5秒)」に対応するため、500,000マイクロ秒を指定します。

echo "0.5秒間、プログラムの実行を一時停止します...\n";

// usleep(マイクロ秒) を使って、500,000マイクロ秒 (0.5秒) 待機します。
// PHP 7.4以降では、数値を読みやすくするためにアンダースコアを区切り文字として使用できます。
usleep(500_000);

echo "0.5秒が経過しました。\n";

?>

PHPのusleep関数は、プログラムの実行を指定されたマイクロ秒数だけ一時停止させるために使用します。この関数は、特定の処理のタイミングを調整したい場合などに役立ちます。

引数 $microseconds には、プログラムを一時停止させたい時間をマイクロ秒単位の整数で指定します。1秒は1,000,000マイクロ秒であるため、例えばキーワードである「half second(0.5秒)」一時停止させたい場合は、500,000を指定することになります。戻り値は void であり、この関数は処理結果として値を返しません。

サンプルコードでは、最初に「0.5秒間、プログラムの実行を一時停止します...」というメッセージを表示します。次に、usleep(500_000)が実行され、500,000マイクロ秒(つまり0.5秒)の間、プログラムの実行が一時停止します。PHP 7.4以降では、このような大きな数値を読みやすくするために、アンダースコアを区切り文字として使用できます。一時停止期間が終了すると、「0.5秒が経過しました。」というメッセージが表示され、プログラムの実行が再開されます。

usleep関数は、引数で指定した「マイクロ秒」の間、プログラムの実行を一時停止します。1秒は1,000,000マイクロ秒なので、単位の扱いに注意が必要です。この関数は戻り値を返さないため、実行の成功・失敗を直接確認することはできません。指定された待機時間はOSのスケジューリングに依存し、厳密な精度は保証されず、わずかに長く待機する場合があります。特にWebサーバー環境では、長時間の一時停止はリクエストのタイムアウトを引き起こす可能性があるので、利用には注意が必要です。サンプルコードの500_000のように数値をアンダースコアで区切る記法は、PHP 7.4以降で読みやすさのために導入された機能です。

PHP usleepによる処理負荷軽減デモ

<?php

/**
 * usleep関数を使用して、指定されたマイクロ秒数だけプログラムの実行を一時停止し、
 * 処理の遅延が全体の実行時間にどう影響するかを示します。
 * これは、システムへの負荷を軽減したり、APIのレート制限に対応したりする際に役立ちます。
 *
 * @param int $iterations 繰り返す処理の回数。
 * @param int $sleepMicroseconds 各処理の後に一時停止するマイクロ秒数 (1秒 = 1,000,000マイクロ秒)。
 */
function demonstrateUsleepEffect(int $iterations, int $sleepMicroseconds = 0): void
{
    $startTime = microtime(true); // 処理開始時刻を記録

    echo "--- usleepデモンストレーション (繰り返し回数: {$iterations}, 遅延: "
        . ($sleepMicroseconds > 0 ? "{$sleepMicroseconds}μs" : "なし") . ") ---\n";

    for ($i = 1; $i <= $iterations; $i++) {
        echo "  作業項目 {$i} を処理中...\n";
        if ($sleepMicroseconds > 0) {
            usleep($sleepMicroseconds); // 指定されたマイクロ秒数だけ実行を一時停止
        }
    }

    $endTime = microtime(true); // 処理終了時刻を記録
    $totalTime = $endTime - $startTime; // 合計実行時間を計算

    echo "--- デモンストレーション終了。合計時間: " . round($totalTime, 4) . "秒 ---\n\n";
}

// 例1: usleepを使用しない場合(遅延なし)
// 短時間で多くの処理が実行され、システムへの瞬間的な負荷が高まる可能性があります。
demonstrateUsleepEffect(5);

// 例2: 各処理の間に100,000マイクロ秒 (0.1秒) の遅延を入れる場合
// これにより、処理が分散され、短期間でのシステム負荷を抑制できます。
demonstrateUsleepEffect(5, 100000);

?>

PHPのusleep関数は、プログラムを指定のマイクロ秒数だけ一時停止させます。引数$microsecondsで一時停止時間をマイクロ秒単位(1秒=1,000,000μs)で整数指定し、戻り値はvoidです。この関数は処理後、特に値を返しません。

サンプルコードは、usleepの有無が繰り返し処理の実行時間に与える影響を示しています。usleepを使わない場合、処理は連続して高速に実行されるため、短時間でシステムに高い負荷がかかる恐れがあります。一方、usleepで各処理の間に意図的な遅延(例えば0.1秒)を挿入すると、処理が時間的に分散されます。これにより、サーバーやデータベースなど、システムへの瞬間的な負荷集中を緩和し、安定稼働に貢献します。具体的には、システム全体の負荷軽減や、外部APIの呼び出し回数に制限がある「レート制限」への対応などに活用できます。

usleep関数は引数で指定されたマイクロ秒数(1秒の100万分の1)だけプログラムの実行を一時停止します。引数の単位をミリ秒や秒と混同しないよう注意が必要です。この関数は、APIのレート制限への対応や瞬間的なシステム負荷の軽減には効果的ですが、その分プログラム全体の実行時間は長くなります。特にWebアプリケーションでは、長時間usleepを使用すると、サーバーのリソースを占有し続け、タイムアウトや同時処理可能リクエスト数に影響を与える可能性があります。また、実際の停止時間はOSのスケジューリングに依存するため、指定した時間とわずかな誤差が生じることがあります。これは同期的な処理であり、待機中はPHPスクリプトが他の処理を行えない点も理解しておくことが重要です。

【PHP8.x】usleep関数の使い方 | いっしー@Webエンジニア