😴

LaravelのSleepクラスって何者だ!?

2023/11/12に公開

はじめに

Laravel 10.31.0のリリースノートを眺めていたらSleep::until()なるものが書いてあって、Sleepクラスって何者だ!?ってことで少し調べてみた。
https://laravel-news.com/laravel-10-31-0

環境

  • Laravel 10.31.0

Sleepクラスって何??

Laravel 10.10.0で追加されたクラスで、PHPネイティブのsleep関数とusleep関数のラッパークラスみたいです。

https://laravel-news.com/laravel-10-10-0

追加時のプルリクエストを見ると最初はSiestaって名前だったけど、途中で変わったんですね。

https://github.com/laravel/framework/pull/46904

何ができる??

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(),
]);

そのほか、マニュアルに色々書いてあります。
https://laravel.com/docs/10.x/helpers#sleep

まとめ

個人的にsleep関数とusleep関数を使う機会があまりないのでどこまで実用的かは不明です。。。
ただ、テストの書きやすさを考えるとSleepクラスを使う方良いかもしれないですね。

参考

https://qiita.com/craig-sen/items/57c33e145d76f91ce6ea

GitHubで編集を提案

Discussion