《PHP8上級試験対策》sleep()関数の落とし穴 ─ 0.3秒は止まらない?

  • URLをコピーしました!

はじめに

PHPで「処理を少しだけ止めたい」と思ったときに使う sleep() 関数。
しかし「0.3秒だけ止めたい」と書いても、実際には全く待機しないことをご存じでしょうか?
この記事では、sleep()usleep()time_nanosleep() の違いをわかりやすく解説し、PHP8上級試験でも狙われやすいポイントを整理します。

キーワード: sleep / usleep / time_nanosleep / スリープ関数 / 処理遅延 /

目次

🧩 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()
試験でのポイント小数を渡すとエラーになる!

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次