😴
LaravelのSleepクラスって何者だ!?
はじめに
Laravel 10.31.0のリリースノートを眺めていたらSleep::until()
なるものが書いてあって、Sleep
クラスって何者だ!?ってことで少し調べてみた。
環境
- Laravel 10.31.0
Sleepクラスって何??
Laravel 10.10.0で追加されたクラスで、PHPネイティブのsleep関数とusleep関数のラッパークラスみたいです。
追加時のプルリクエストを見ると最初はSiesta
って名前だったけど、途中で変わったんですね。
何ができる??
sleep関数とusleep関数のラッパーなので、当たり前だけど同じことができる。
use Illuminate\Support\Sleep;
sleep(2);
usleep(5000);
// Sleepクラスを使うと次のように書く
Sleep::for(2)->seconds(); // 2秒停止
Sleep::sleep(2); // sleep関数のエイリアス
Sleep::for(5000)->microseconds(); // 5000マイクロ秒停止
Sleep::usleep(5000); // usleep関数のエイリアス
その他に分とミリ秒の指定も可能みたいですね。
use Illuminate\Support\Sleep;
Sleep::for(1)->minutes(); // 1分停止
Sleep::for(100)->milliseconds(); // 100ミリ秒停止
ただ止めるだけであればネイティブの関数を使えばいいけど、ラッパーを使う利点としてはテスト可能にすることみたいです。(プルリクエストにも書いてありますね)
sleep(2);
みたいなコードが処理にあるとテストが本当に2秒待ってしまうので、テスト実行がかなり遅くなります。
そこで、Sleepクラスを使うとモックにすることが可能になり、実際に2秒待たずにテストが可能になるわけですね。
Sleep::sleep(2);
use Illuminate\Support\Sleep;
Sleep::fake();
// Sleepクラスが何回実行されたか
Sleep::assertSleptTimes(1);
// Sleepクラスを何秒止めていたか
Sleep::assertSequence([
Sleep::for(3)->seconds(),
]);
そのほか、マニュアルに色々書いてあります。
まとめ
個人的にsleep関数とusleep関数を使う機会があまりないのでどこまで実用的かは不明です。。。
ただ、テストの書きやすさを考えるとSleepクラスを使う方良いかもしれないですね。
参考
Discussion