lexide/chronos

提供返回时间戳的类

v2.2.0 2023-07-20 17:11 UTC

README

Chronos提供返回时间戳的类,以抽象对系统时间的依赖。这在进行单元测试时非常有用,因为你可以模拟TimeProviderInterface,而不依赖于获取系统时间的调用

它还包含一个计时器,使用时间提供者生成以秒为单位的时间间隔

安装

composer require lexide/chronos

要使用此库提供的lexide/syringe DI配置,请将以下内容添加到您的composer.json文件中

"extra": {
    "lexide/puzzle-di": {
        "whitelist": {
            "lexide/syringe": [
                "lexide/chronos"
            ]
        }
    }
}

注意:您需要在项目中安装lexide/puzzle-di以利用此功能

时间提供者

此库中包含的时间提供者都返回从给定时间点开始到现在的秒数。每个类都有一个get方法,用于获取当前时间。在模拟这些类时,您可以对get方法设置期望值,以返回模拟时间间隔经过的值。

此库提供了一些提供者类

  • TimeProvider - 返回以秒为单位的Unix时间戳
  • MilliTimeProvider- 返回以毫秒为精度的Unix时间戳
  • MicroTimeProvider- 返回以微秒为精度的Unix时间戳
  • NanoTimeProvider 返回具有纳秒精度的任意时间戳

注意:NanoTimeProvider 返回Unix时间戳。它是基于hrtime函数的,该函数返回从任意时间点(如系统启动时间)开始的纳秒数。由于这个时间点无法事先知道,因此NanoTimeProvider不能用于日期计算,只能用于计时时间间隔

自定义时间提供者

如果您需要使用不同的时间单位,例如毫秒的整数,您可以创建一个实现Lexide\Chronos\TimeProvider\TimeProviderInterface的新类。在它的get方法中,您可以返回任何满足您要求的整数或浮点值。

时间跳过器

时间跳过器通过使用sleep()和相关的函数来延迟PHP处理脚本。每个类都有一个skip方法,该方法需要一个表示要延迟的秒数的参数。请注意,此值始终是秒数;向MicroTimeSkipper传递100将延迟100秒,而不是100微秒

此库中可用的跳过器类有

  • TimeSkipper - 以整秒为单位延迟处理
  • MilliTimeProvider- 以毫秒为单位延迟处理
  • MicroTimeProvider- 以微秒为单位延迟处理
  • NanoTimeProvider 以纳秒为单位延迟处理

计时器

计时器类执行计时任务持续时间的通用功能。它们使用时间提供者捕获起始时间点,并在需要时计算出起始点和第二个时间点之间的差异

计时器类

要使用计时器,您必须调用其上的start()以捕获起始时间。然后您可以调用stop()以停止计时并返回时间差。或者,如果您想继续计时,调用duration()将返回经过的时间,但保持计时器运行,允许多次调用duration()

多计时器

MultiStopWatch在需要记录多个并发持续时间而无需为每个计时器创建一个StopWatch的情况下非常有用。其功能与StopWatch相同,但在每个情况下,使用key参数来区分并发计时。

例如,调用start("foo")然后调用start("bar")将启动两个计时器。如果随后调用stop("foo"),则“bar”计时器将继续运行,直到用该键调用stop

StopWatch模式

两个StopWatch都可以在连续或间隔模式下运行,这会影响从duration()调用返回的值。

在连续模式下,duration()将返回当前时间与初始启动时间之间的差值,即测量自计时器启动以来的总时间。

间隔模式通过在每次调用duration()时将启动时间设置为当前时间而有所不同。这允许测量duration()调用之间的间隔;相当于使用真实计时器时的单独圈数。