はじめに
PHPで「処理を少しだけ止めたい」と思ったときに使う sleep()
関数。
しかし「0.3秒だけ止めたい」と書いても、実際には全く待機しないことをご存じでしょうか?
この記事では、sleep()
・usleep()
・time_nanosleep()
の違いをわかりやすく解説し、PHP8上級試験でも狙われやすいポイントを整理します。
目次
🧩 sleep()関数の基本仕様
sleep()
は、整数秒単位で実行を停止する関数です。
sleep(int $seconds): int
- 引数
$seconds
は「int(整数)」のみ有効 - 単位は「秒」
- 実行を中断して、その間CPUを解放する
✅ 例
echo "Start\n";
sleep(2);
echo "End\n";
出力(おおよそ2秒後):
Start
End
⚠️ sleep(0.3) はなぜ間違い?
sleep(0.3);
- PHP 8 以降では 引数が float の場合は TypeError が発生します
- 「整数でない秒数は渡せない」という仕様です
❌ 実際の挙動(PHP 8)
Fatal error: Uncaught TypeError: sleep(): Argument #1 ($seconds) must be of type int
つまり「0.3秒スリープ」しようとしても、処理は止まらずエラーになってしまいます。
🕐 0.3秒止めたいならどうする?
✅ 方法①:usleep()
(マイクロ秒単位)
usleep(300000); // 0.3秒 (300,000マイクロ秒)
usleep()
は「マイクロ秒(1秒 = 1,000,000マイクロ秒)」単位で停止できる関数です。より短い待機時間を表現できます。
✅ 方法②:time_nanosleep()
(ナノ秒単位)
time_nanosleep(0, 300000000); // 0秒 + 300,000,000ナノ秒 = 0.3秒
time_nanosleep()
は「秒+ナノ秒」で指定できるため、より正確な制御が可能です。
📘 図解:sleep vs usleep vs time_nanosleep
単位の違い(時間の粒度)
┌────────────┬───────────────┬───────────────────────────────────┐
│ 関数名 │ 単位 │ 例(0.3秒の場合) │
├────────────┼───────────────┼───────────────────────────────────┤
│ sleep() │ 秒(intのみ) │ × sleep(0.3) → TypeError │
│ usleep() │ マイクロ秒 │ ○ usleep(300000) │
│ time_nanosleep() │ ナノ秒 │ ○ time_nanosleep(0, 300000000) │
└────────────┴───────────────┴───────────────────────────────────┘
🧠 まとめ
項目 | 内容 |
---|---|
sleep() の単位 | 秒(整数のみ) |
sleep(0.3) の挙動 | TypeError(PHP8以降) |
ミリ秒未満の待機 | usleep() or time_nanosleep() |
試験でのポイント | 小数を渡すとエラーになる! |