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

作成日: 更新日:

sleep関数は、プログラムの実行を一時停止する関数です。この関数は、PHPスクリプトの処理を指定された秒数だけ中断させることができます。

引数には、プログラムを一時停止させたい秒数を整数値で指定します。例えば、sleep(3);と記述すると、その行でプログラムの実行が3秒間停止します。一時停止の間は、後続の処理は一切行われず、タイマーが終了した後に再開されます。

この関数は、処理が成功した場合には0を返し、エラーが発生した場合には非ゼロの値を返します。ただし、一般的にエラーが発生することは稀です。例えば、秒数に負の値を指定するような不正な引数が渡された場合にエラーとなる可能性があります。

sleep関数は、ウェブAPIへの連続的なリクエスト送信時に、相手サーバーへの負荷を軽減するために一定の間隔を設けたい場合や、ループ処理の間に短い待ち時間を挿入したい場合など、様々な場面で利用されます。これにより、不必要な高速処理を避け、プログラムの動作を調整することができます。

注意点として、sleep関数はスクリプト全体の処理をブロックするため、Webアプリケーションでユーザーへの応答性を損なう可能性がある点には留意が必要です。非同期処理が求められる場面では、他の方法を検討することも重要です。

基本的な使い方

構文(syntax)

<?php
sleep(3); // スクリプトの実行を3秒間停止します
?>

引数(parameters)

int $seconds

  • int $seconds: スクリプトの実行を停止する秒数を指定する整数

戻り値(return)

int

指定された秒数だけプログラムの実行を一時停止し、処理の完了を示す整数値を返します。処理が成功した場合は0が返されます。

サンプルコード

PHPでプログラム実行を一時停止する

<?php

/**
 * プログラムの実行を一定時間一時停止するサンプルコードです。
 * PHPのsleep()関数は秒単位で、usleep()関数はマイクロ秒単位で待機します。
 * キーワード「ミリ秒」に関連して、usleep()でのミリ秒待機方法も示します。
 */

// sleep() 関数を使用した秒単位の待機
// 指定した秒数だけプログラムの実行を一時停止します。
echo "1秒間の待機を開始します...\n";
sleep(1); // 1秒間プログラムを一時停止
echo "1秒間の待機が終了しました。\n";

echo "--------------------\n";

// ミリ秒単位で待機したい場合
// sleep() 関数は秒単位なので、ミリ秒単位の待機には usleep() 関数を使用します。
// usleep() 関数はマイクロ秒(μs)単位で引数を取ります。
// 1ミリ秒 = 1000マイクロ秒 です。

$milliseconds = 500; // 待機したいミリ秒数を指定
echo "{$milliseconds}ミリ秒の待機を開始します...\n";
// ミリ秒をマイクロ秒に変換して usleep() に渡します。
usleep($milliseconds * 1000); // 500ミリ秒 = 500 * 1000 マイクロ秒
echo "{$milliseconds}ミリ秒の待機が終了しました。\n";

echo "--------------------\n";

// 別のミリ秒待機例:250ミリ秒
$milliseconds = 250;
echo "{$milliseconds}ミリ秒の待機を開始します...\n";
usleep($milliseconds * 1000);
echo "{$milliseconds}ミリ秒の待機が終了しました。\n";

?>

PHPのsleep関数は、プログラムの実行を一定時間一時停止させるために使用されます。この関数は、引数にint $secondsという整数型の値を受け取ります。この引数で指定された秒数だけ、プログラムの処理が一時的に止まります。例えば、sleep(1);と記述すると、プログラムは1秒間停止します。関数の戻り値は整数型で、通常は待機が成功したことを示す0が返されますが、この戻り値が直接利用されることは多くありません。

サンプルコードでは、まずsleep(1);でプログラムを1秒間待機させる基本的な使い方を示しています。これは、連続する処理の間に短い間隔を設けたい場合などに役立ちます。

「ミリ秒」というキーワードに関して、sleep関数は秒単位での待機しかできません。ミリ秒単位でプログラムを一時停止したい場合は、usleep関数を使用します。usleep関数は、引数をマイクロ秒(1秒の100万分の1)単位で受け取ります。1ミリ秒は1000マイクロ秒に相当するため、例えば500ミリ秒待機したい場合は、usleep(500 * 1000);のように、待機したいミリ秒数を1000倍してマイクロ秒に変換して引数に渡します。サンプルコードでは、この方法で500ミリ秒や250ミリ秒の待機を実行する具体的な例も紹介しており、秒未満のより細かい時間調整が可能です。

PHPのsleep()関数は、プログラムの実行を引数で指定した秒数だけ一時停止します。ミリ秒単位で待機したい場合は、usleep()関数を使用してください。usleep()はマイクロ秒(1秒の100万分の1)単位で引数を取るため、待機したいミリ秒数に1000を掛けて渡す必要があります。例えば500ミリ秒待機するならusleep(500 * 1000)と記述します。これらの関数はプログラムの実行を完全に停止させるため、Webアプリケーションなどで長時間使用すると、ユーザー体験の低下やサーバーリソースの無駄な消費につながる可能性があります。また、指定した時間が厳密に守られるわけではなく、システムの状態やOSによって多少のずれが生じることがありますのでご注意ください。

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

<?php

/**
 * PHPのsleep関数を使って、スクリプトの実行を一時停止する方法を示します。
 *
 * sleep()関数は、指定された秒数だけ現在のスクリプトの実行をブロック(一時停止)します。
 * これは同期的な処理であり、スクリプトは指定された時間、完全に待機します。
 * 「非同期」というキーワードがありますが、sleep()自体は非同期処理を実現するものではありません。
 * 非同期処理を実現するには、通常、PromiseベースのライブラリやFibersなどのより高度な機能が必要です。
 */
function demonstrateBlockingSleep(): void
{
    echo "処理開始: " . date('H:i:s') . "\n";

    $secondsToSleep = 3;
    echo "{$secondsToSleep}秒間、スクリプトの実行を一時停止します...\n";

    // sleep()関数は、指定された秒数だけスクリプトの実行を停止します。
    // この間、他の処理は行われません。
    sleep($secondsToSleep);

    echo "処理再開: " . date('H:i:s') . "\n";
    echo "一時停止が終了し、処理が続行されました。\n";
}

// 関数を実行して、sleep()の動作を確認します。
demonstrateBlockingSleep();

PHPのsleep関数は、現在実行中のスクリプトを指定された秒数だけ一時停止させるために使用されます。引数int $secondsには、スクリプトを停止させたい秒数を整数で指定します。この関数は、処理が成功した場合には0を返します。

sleep関数は、指定された時間、スクリプトの実行を完全にブロックする「同期的な」処理を行います。そのため、スクリプトが一時停止している間は、他の処理を並行して実行することはできません。提供されたキーワードに「非同期」がありますが、sleep関数自体は非同期処理を実現するものではなく、非同期処理を行うにはPromiseベースのライブラリなどのより高度な機能が必要です。

サンプルコードでは、demonstrateBlockingSleep関数内で処理開始時刻を表示し、sleep関数によって3秒間スクリプトの実行を一時停止しています。その後、処理再開時刻を表示することで、スクリプトが実際に一時停止し、指定された時間が経過した後に実行が再開される様子を確認できます。これにより、sleep関数がスクリプトの実行を一時的に止める働きを理解できます。

sleep()関数は、指定された秒数だけスクリプト全体の実行を一時停止します。この間、他の処理は一切行われず、同期的に待機します。

「非同期」というキーワードがありますが、sleep()関数自体は非同期処理を実現するものではありません。非同期処理を行うには、FibersやPromiseベースのライブラリなど、別の仕組みが必要です。

この関数は、プログラムの処理フローを意図的に遅延させる目的で使用されますが、Webアプリケーションなど、ユーザーの応答性が求められる環境では、サーバーのリソースを無駄に占有し、全体のパフォーマンスに悪影響を与える可能性があるため、利用には注意が必要です。

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