1212use Patchlevel \Worker \Listener \StopWorkerOnMemoryLimitListener ;
1313use Patchlevel \Worker \Listener \StopWorkerOnSignalListener ;
1414use Patchlevel \Worker \Listener \StopWorkerOnTimeLimitListener ;
15+ use Psr \Clock \ClockInterface ;
1516use Psr \Log \LoggerInterface ;
1617use Psr \Log \NullLogger ;
1718use Symfony \Component \EventDispatcher \EventDispatcher ;
1819use Symfony \Component \EventDispatcher \EventDispatcherInterface ;
1920
2021use function max ;
21- use function microtime ;
22- use function round ;
2322use function usleep ;
2423
2524final class DefaultWorker implements Worker
2625{
2726 private bool $ shouldStop = false ;
2827
29- /** @var Closure():int */
30- private Closure $ timeMeasure ;
28+ private readonly ClockInterface $ clock ;
3129
3230 /** @param Closure(Closure):void $job */
3331 public function __construct (
3432 private readonly Closure $ job ,
3533 private readonly EventDispatcherInterface $ eventDispatcher ,
3634 private readonly LoggerInterface |null $ logger = null ,
35+ ClockInterface |null $ clock = null ,
3736 ) {
38- $ this ->timeMeasure = static fn () => ( int ) round ( microtime ( true ) * 1000 );
37+ $ this ->clock = $ clock ?? new SystemClock ( );
3938 }
4039
4140 /** @param positive-int|0 $sleepTimer in milliseconds */
@@ -48,11 +47,11 @@ public function run(int $sleepTimer = 1000): void
4847 while (!$ this ->shouldStop ) {
4948 $ this ->logger ?->debug('Worker starting job run ' );
5049
51- $ startTime = ( $ this ->timeMeasure ) ();
50+ $ startTime = $ this ->milliseconds ();
5251
5352 ($ this ->job )($ this ->stop (...));
5453
55- $ endTime = ( $ this ->timeMeasure ) ();
54+ $ endTime = $ this ->milliseconds ();
5655 $ ranTime = $ endTime - $ startTime ;
5756
5857 $ this ->logger ?->debug('Worker finished job run ({ranTime}ms) ' , ['ranTime ' => $ ranTime ]);
@@ -97,6 +96,7 @@ public static function create(
9796 array $ options = [],
9897 LoggerInterface $ logger = new NullLogger (),
9998 EventDispatcherInterface |null $ eventDispatcher = null ,
99+ ClockInterface |null $ clock = null ,
100100 ): self {
101101 if ($ eventDispatcher === null ) {
102102 $ eventDispatcher = new EventDispatcher ();
@@ -118,14 +118,20 @@ public static function create(
118118
119119 if (isset ($ options ['timeLimit ' ])) {
120120 $ eventDispatcher ->addSubscriber (
121- new StopWorkerOnTimeLimitListener ($ options ['timeLimit ' ], $ logger ),
121+ new StopWorkerOnTimeLimitListener ($ options ['timeLimit ' ], $ logger, $ clock ),
122122 );
123123 }
124124
125125 return new self (
126126 $ job ,
127127 $ eventDispatcher ,
128128 $ logger ,
129+ $ clock ,
129130 );
130131 }
132+
133+ private function milliseconds (): int
134+ {
135+ return (int )$ this ->clock ->now ()->format ('Uv ' );
136+ }
131137}
0 commit comments