22
33namespace rabbit \core ;
44
5+ use Co \Channel ;
56use rabbit \contract \AbstractTimer ;
67
78/**
@@ -17,77 +18,70 @@ class Timer extends AbstractTimer
1718 * @param array $params
1819 * @return int
1920 */
20- public function addAfterTimer (string $ name , float $ time , callable $ callback , array $ params = []): int
21+ public static function addAfterTimer (string $ name , float $ time , callable $ callback , array $ params = []): int
2122 {
22- $ this ->clearTimerByName ($ name );
23- array_unshift ($ params , $ name ?? uniqid (), self ::TYPE_AFTER , $ callback );
24- $ tid = \Swoole \Timer::after ($ time , [$ this , 'afterCallback ' ], $ params );
25- $ this ->timers [$ name ] = ['name ' => $ name , 'tid ' => $ tid , 'type ' => self ::TYPE_AFTER , 'count ' => 0 ];
23+ self ::checkTimer ($ name );
24+ $ channel = new Channel (1 );
25+ $ tid = rgo (function () use ($ channel , $ callback , $ time , $ params ) {
26+ if ($ ret = $ channel ->pop ($ time / 1000 )) {
27+ return ;
28+ }
29+ rgo (function () use ($ callback , $ params ) {
30+ call_user_func ($ callback , ...$ params );
31+ });
32+ });
33+ self ::$ timers [$ name ] = ['name ' => $ name , 'chan ' => $ channel , 'tid ' => $ tid , 'type ' => self ::TYPE_AFTER , 'count ' => 0 ];
2634 return $ tid ;
2735 }
2836
29- /**
30- * 移除一个定时器
31- *
32- * @param string $name 定时器名称
33- *
34- * @return bool
35- */
36- public function clearTimerByName (string $ name ): bool
37- {
38- if (!isset ($ this ->timers [$ name ])) {
39- return true ;
40- }
41- \Swoole \Timer::clear ($ this ->timers [$ name ]['tid ' ]);
42- unset($ this ->timers [$ name ]);
43-
44- return true ;
45- }
46-
4737 /**
4838 * @param string $name
4939 * @param float $time
5040 * @param callable $callback
5141 * @param array $params
5242 * @return int
5343 */
54- public function addTickTimer (string $ name , float $ time , callable $ callback , array $ params = []): int
44+ public static function addTickTimer (string $ name , float $ time , callable $ callback , array $ params = []): int
5545 {
56- $ this ->clearTimerByName ($ name );
57- array_unshift ($ params , $ name ?? uniqid (), self ::TYPE_TICKET , $ callback );
58-
59- $ tid = \Swoole \Timer::tick ($ time , [$ this , 'timerCallback ' ], $ params );
60-
61- $ this ->timers [$ name ] = ['name ' => $ name , 'tid ' => $ tid , 'type ' => self ::TYPE_TICKET , 'count ' => 0 ];
62-
46+ self ::checkTimer ($ name );
47+ $ channel = new Channel (1 );
48+ $ tid = rgo (function () use ($ channel , $ callback , $ time , $ params ) {
49+ while (true ) {
50+ if ($ ret = $ channel ->pop ($ time / 1000 )) {
51+ break ;
52+ }
53+ rgo (function () use ($ callback , $ params ) {
54+ call_user_func ($ callback , ...$ params );
55+ });
56+ }
57+ });
58+ self ::$ timers [$ name ] = ['name ' => $ name , 'chan ' => $ channel , 'tid ' => $ tid , 'type ' => self ::TYPE_TICKET , 'count ' => 0 ];
6359 return $ tid ;
6460 }
6561
6662 /**
63+ * @param string $name
6764 * @return bool
6865 */
69- public function clearTimers ( ): bool
66+ public static function clearTimerByName ( string $ name ): bool
7067 {
71- foreach ( $ this -> timers as $ name => $ timerData ) {
72- $ this -> clearTimerByName ( $ name ) ;
68+ if (! isset ( self :: $ timers[ $ name]) ) {
69+ return true ;
7370 }
74- return true ;
75- }
71+ self :: $ timers [ $ name ][ ' chan ' ]-> push ( true ) ;
72+ unset( self :: $ timers [ $ name ]);
7673
77- /**
78- * @param array|null $params
79- */
80- public function afterCallback (array $ params = null ): void
81- {
82- $ this ->run ($ params );
74+ return true ;
8375 }
8476
8577 /**
86- * @param int $timer_id
87- * @param array|null $params
78+ * @return bool
8879 */
89- public function timerCallback ( int $ timer_id , array $ params = null ): void
80+ public static function clearTimers ( ): bool
9081 {
91- $ this ->run ($ params );
82+ foreach (self ::$ timers as $ name => $ timerData ) {
83+ self ::clearTimerByName ($ name );
84+ }
85+ return true ;
9286 }
9387}
0 commit comments