Skip to content

Commit 92c2e79

Browse files
committed
update timer
1 parent 07d1092 commit 92c2e79

File tree

3 files changed

+90
-121
lines changed

3 files changed

+90
-121
lines changed

src/contract/AbstractTimer.php

Lines changed: 23 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
namespace rabbit\contract;
1010

11+
use rabbit\core\Exception;
12+
1113
/**
1214
* Class TimerInterface
1315
* @package rabbit\contract
@@ -25,24 +27,36 @@ abstract class AbstractTimer
2527
/**
2628
* @var array 所有定时器
2729
*/
28-
protected $timers = [];
30+
protected static $timers = [];
2931

3032
/**
3133
* @return array
3234
*/
33-
public function getTimers(): array
35+
public static function getTimers(): array
3436
{
35-
return $this->timers;
37+
return self::$timers;
3638
}
3739

3840
/**
3941
* @param string $name
4042
* @param null $default
4143
* @return array
4244
*/
43-
public function getTimer(string $name, $default = null): array
45+
public static function getTimer(string $name, $default = null): array
46+
{
47+
return isset(self::$timers[$name]) ? self::$timers[$name] : $default;
48+
}
49+
50+
/**
51+
* @param string $name
52+
* @return bool
53+
*/
54+
public static function checkTimer(string $name): bool
4455
{
45-
return isset($this->timers[$name]) ? $this->timers[$name] : $default;
56+
if (isset(self::$timers[$name])) {
57+
throw new Exception("$name timer already exists");
58+
}
59+
return true;
4660
}
4761

4862
/**
@@ -52,7 +66,7 @@ public function getTimer(string $name, $default = null): array
5266
* @param array $params
5367
* @return int
5468
*/
55-
abstract public function addAfterTimer(string $name, float $time, callable $callback, array $params = []): int;
69+
abstract public static function addAfterTimer(string $name, float $time, callable $callback, array $params = []): int;
5670

5771
/**
5872
* @param string $name
@@ -61,40 +75,16 @@ abstract public function addAfterTimer(string $name, float $time, callable $call
6175
* @param array $params
6276
* @return int
6377
*/
64-
abstract public function addTickTimer(string $name, float $time, callable $callback, array $params = []): int;
78+
abstract public static function addTickTimer(string $name, float $time, callable $callback, array $params = []): int;
6579

6680
/**
6781
* @param string $name
6882
* @return bool
6983
*/
70-
abstract public function clearTimerByName(string $name): bool;
84+
abstract public static function clearTimerByName(string $name): bool;
7185

7286
/**
7387
* @return bool
7488
*/
75-
abstract public function clearTimers(): bool;
76-
77-
/**
78-
* @param array $params
79-
*/
80-
protected function run(array $params)
81-
{
82-
if (count($params) < 2) {
83-
return;
84-
}
85-
$name = array_shift($params);
86-
$type = array_shift($params);
87-
$callback = array_shift($params);
88-
89-
$callbackParams = array_values($params);
90-
91-
if (is_array($callback)) {
92-
list($class, $method) = $callback;
93-
$class->$method(...$callbackParams);
94-
} elseif ($callback instanceof \Closure) {
95-
call_user_func($callback, $callbackParams);
96-
} else {
97-
$callback(...$callbackParams);
98-
}
99-
}
89+
abstract public static function clearTimers(): bool;
10090
}

src/core/Timer.php

Lines changed: 40 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace rabbit\core;
44

5+
use Co\Channel;
56
use 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
}

src/core/TimerCo.php

Lines changed: 27 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,73 +18,58 @@ class TimerCo extends AbstractTimer
1818
* @param array $params
1919
* @return int
2020
*/
21-
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
2222
{
23-
$this->clearTimerByName($name);
24-
array_unshift($params, $name ?? uniqid(), self::TYPE_AFTER, $callback);
25-
$this->timers[$name] = ['name' => $name, 'type' => self::TYPE_AFTER];
26-
$tid = rgo(function () use ($time, $params) {
23+
self::checkTimer($name);
24+
$tid = rgo(function () use ($name, $time, $callback, $params) {
2725
System::sleep($time / 1000);
28-
$this->timerCallback($params);
26+
if (isset($this->timers[$name])) {
27+
call_user_func($callback, ...$params);
28+
}
2929
});
30-
$this->timers[$name]['tid'] = $tid;
30+
self::$timers[$name] = ['name' => $name, 'tid' => $tid, 'type' => self::TYPE_AFTER];
3131
return $tid;
3232
}
3333

34-
/**
35-
* 移除一个定时器
36-
*
37-
* @param string $name 定时器名称
38-
*
39-
* @return bool
40-
*/
41-
public function clearTimerByName(string $name): bool
42-
{
43-
if (!isset($this->timers[$name])) {
44-
return true;
45-
}
46-
unset($this->timers[$name]);
47-
return true;
48-
}
49-
50-
/**
51-
* 定时器回调函数
52-
*
53-
* @param array $params 参数传递
54-
*/
55-
public function timerCallback(array $params): void
56-
{
57-
$this->run($params);
58-
}
59-
6034
/**
6135
* @param string $name
6236
* @param float $time
6337
* @param callable $callback
6438
* @param array $params
6539
* @return int
6640
*/
67-
public function addTickTimer(string $name, float $time, callable $callback, array $params = []): int
41+
public static function addTickTimer(string $name, float $time, callable $callback, array $params = []): int
6842
{
69-
$this->clearTimerByName($name);
70-
array_unshift($params, $name ?? uniqid(), self::TYPE_AFTER, $callback);
71-
$this->timers[$name] = ['name' => $name, 'type' => self::TYPE_AFTER];
72-
$tid = rgo(function () use ($name, $time, $params) {
43+
self::checkTimer($name);
44+
$tid = rgo(function () use ($name, $callback, $time, $params) {
7345
while (isset($this->timers[$name])) {
74-
$this->timerCallback($params);
46+
call_user_func($callback, ...$params);
7547
System::sleep($time / 1000);
7648
}
7749
});
78-
$this->timers[$name]['tid'] = $tid;
50+
self::$timers[$name] = ['name' => $name, 'tid' => $tid, 'type' => self::TYPE_AFTER];
7951
return $tid;
8052
}
8153

54+
/**
55+
* @param string $name
56+
* @return bool
57+
*/
58+
public static function clearTimerByName(string $name): bool
59+
{
60+
if (!isset(self::$timers[$name])) {
61+
return true;
62+
}
63+
unset(self::$timers[$name]);
64+
return true;
65+
}
66+
8267
/**
8368
* @return bool
8469
*/
85-
public function clearTimers(): bool
70+
public static function clearTimers(): bool
8671
{
87-
$this->timers = [];
72+
self::$timers = [];
8873
return true;
8974
}
9075
}

0 commit comments

Comments
 (0)