ReactPHP - 使用 Laravel 和计时器
ReactPHP - Working with Laravel and Timers
所以这是我遇到的一个非常有趣的问题。我一心想弄清楚如何将 websocket 客户端集成到 Laravel 5.5 中,以允许我的应用程序和 Discord Gateway. I spooled up a new Laravel app and required this library, via composer, which is built on top of Ratchet PHP.
通过 websocket 进行通信
我正在尝试构建一个 PHP Discord Bot,因为它使用的 bot that i use to use but was abandon after a major dependency 也已停产。
我已经想出如何添加一个计时器以便像这样发送 heartbeats
$app->addTimer(x, function ($thing) use ($etc) {});
在我的应用程序收到来自 Discord 的事件之前,这一切都完美无缺。然后同步丢失,我的应用程序开始每 3 - 9 秒发送一次心跳,有时一次发送 2 或 3 次,而不是从 hello event 确定的时间间隔发送心跳。这是控制台出于调试原因的一些输出,但它显示了我的问题:
"Sending Heartbeat - 41 - 2017-12-31 05:26:42"
"Sending Heartbeat - 41 - 2017-12-31 05:26:42"
Illuminate\Support\Collection {#679
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
Illuminate\Support\Collection {#679
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:26:51"
Illuminate\Support\Collection {#602
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:26:55"
Illuminate\Support\Collection {#695
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:26:56"
Illuminate\Support\Collection {#688
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
Illuminate\Support\Collection {#688
#items: array:4 [
"t" => "TYPING_START"
"s" => 7
"op" => 0
"d" => array:3 [
"user_id" => "277968564827324416"
"timestamp" => 1514698064
"channel_id" => "394991263344230411"
]
]
}
Illuminate\Support\Collection {#688
#items: array:4 [
"t" => "MESSAGE_CREATE"
"s" => 8
"op" => 0
"d" => array:15 [
"type" => 0
"tts" => false
"timestamp" => "2017-12-31T05:27:47.057000+00:00"
"pinned" => false
"nonce" => "396897209817235456"
"mentions" => []
"mention_roles" => []
"mention_everyone" => false
"id" => "396897202448105494"
"embeds" => []
"edited_timestamp" => null
"content" => "!about"
"channel_id" => "394991263344230411"
"author" => array:4 [
"username" => "David Davaham"
"id" => "277968564827324416"
"discriminator" => "2471"
"avatar" => "0c27e1bed49121e8aaf3f284d6b74e55"
]
"attachments" => []
]
]
}
Illuminate\Support\Collection {#688
#items: array:4 [
"t" => "MESSAGE_CREATE"
"s" => 9
"op" => 0
"d" => array:15 [
"type" => 0
"tts" => false
"timestamp" => "2017-12-31T05:27:49.382000+00:00"
"pinned" => false
"nonce" => null
"mentions" => array:1 [
0 => array:4 [
"username" => "David Davaham"
"id" => "277968564827324416"
"discriminator" => "2471"
"avatar" => "0c27e1bed49121e8aaf3f284d6b74e55"
]
]
"mention_roles" => []
"mention_everyone" => false
"id" => "396897212199862276"
"embeds" => []
"edited_timestamp" => null
"content" => "<@!277968564827324416> Unfortunately That is not a command I recognize. Please try again. Reply with `!help` for a list of commands"
"channel_id" => "394991263344230411"
"author" => array:5 [
"username" => "Claire Underwood (Dev)"
"id" => "394988052360986635"
"discriminator" => "8397"
"bot" => true
"avatar" => null
]
"attachments" => []
]
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:12"
Illuminate\Support\Collection {#616
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:23"
"Sending Heartbeat - 41 - 2017-12-31 05:27:23"
Illuminate\Support\Collection {#622
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
Illuminate\Support\Collection {#622
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:32"
Illuminate\Support\Collection {#652
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:36"
Illuminate\Support\Collection {#667
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:37"
Illuminate\Support\Collection {#661
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:46"
Illuminate\Support\Collection {#663
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:49"
Illuminate\Support\Collection {#660
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:51"
Illuminate\Support\Collection {#656
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:53"
Illuminate\Support\Collection {#698
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:28:04"
"Sending Heartbeat - 41 - 2017-12-31 05:28:04"
Illuminate\Support\Collection {#701
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
Illuminate\Support\Collection {#701
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:28:13"
Illuminate\Support\Collection {#706
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:28:17"
Illuminate\Support\Collection {#707
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:28:18"
Illuminate\Support\Collection {#709
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
代码如下:
$conn->on('message', function(MessageInterface $msg) use ($conn, $socket, $loop) {
$message = collect(json_decode($msg, true));
dump($message);
if ($message->has('s') && $message->get('s') !== null) {
$this->seq = $message->get('s');
}
if (!$this->is_ready) {
if (!$message->has('op')) {
$conn->close();
}
if ($message->get('op') == 0) {
if ($message->get('t') === "READY" || $message->get('t') === "GUILD_CREATE") {
$this->is_ready = true;
$this->seq = $message->get('s');
}
}
if ($message->get('op') == 10) {
$this->connOpened = Carbon::now();
$this->heartbeat = (int)floor($message->get('d')['heartbeat_interval'] / 1000);
$socket->sendIdentify();
sleep(1);
}
if ($message->get('op') == 11) {
$now = Carbon::now()->timestamp;
if (!$this->heartbeatACK) {
$this->heartbeatACK = true;
}
}
}
if ($this->is_ready) {
if ($message->get('op') == 0) {
if ($message->get('t') === "MESSAGE_CREATE") {
$trigger = config('discord.message.trigger');
$data = $message->get('d');
$msgContent = $data['content'];
if (starts_with($msgContent, $trigger)) {
ProcessMessage::dispatch($data);
}
}
}
$now = Carbon::now();
$loop->addTimer($this->heartbeat, function ($x) use ($now, $conn, $socket) {
dump("Sending Heartbeat - " . $this->heartbeat . " - " .$now->toDateTimeString());
$payload = collect([
'op' => 1,
'd' => (int)$this->seq,
]);
$conn->send($payload->toJson());
});
}
});
有没有人知道可以更好地管理心跳的方法,或者这只是我需要容忍的事情吗?
另外,有没有人对我这样做有什么建议或批评?我找不到关于如何执行此操作的任何可靠文档,所以我正在将它拼凑在一起。
所以这个问题已经解决了。这是我发现的:
根据代码概述,当执行以下代码块时:
if (!$this->is_ready) {
...
if ($message->get('op') == 0) {
if ($message->get('t') === "READY" || $message->get('t') === "GUILD_CREATE") {
$this->is_ready = true;
$this->seq = $message->get('s');
}
}
...
}
由于 $this->is_ready
被设置为 true
,此代码段跟进,这将导致添加两个计时器。除此之外,因为我有这样的 is_ready
代码:
if ($this->is_ready) {
if ($message->get('op') == 0) {
if ($message->get('t') === "MESSAGE_CREATE") {
$trigger = config('discord.message.trigger');
$data = $message->get('d');
$msgContent = $data['content'];
if (starts_with($msgContent, $trigger)) {
ProcessMessage::dispatch($data);
}
}
}
$now = Carbon::now();
$loop->addTimer($this->heartbeat, function ($x) use ($now, $conn, $socket) {
dump("Sending Heartbeat - " . $this->heartbeat . " - " .$now->toDateTimeString());
$payload = collect([
'op' => 1,
'd' => (int)$this->seq,
]);
$conn->send($payload->toJson());
});
}
每次我收到一个新事件时,都会安排另一个计时器,导致计时器累加,并在这些计时器到期时发送心跳。这导致计时器最终每秒发送多次,如果我不想这样的话。以下是我所做的更改:
我在这里的第一个块中添加了一个计时器,如下所示:
if ($message->get('op') == 0) {
if ($message->get('t') === "READY" || $message->get('t') === "GUILD_CREATE") {
$this->is_ready = true;
$loop->addTimer(20, function ($x) use ($conn,$loop) {
dump("Sending Heartbeat - " . $this->heartbeat . " - " .Carbon::now()->toDateTimeString());
$payload = collect([
'op' => 1,
'd' => (int)$this->seq,
]);
$conn->send($payload->toJson());
$loop->cancelTimer($x);
});
}
}
这导致循环停止处理这个计时器,但在底部,我在发送心跳后取消了计时器。我不确定这是否重要,因为它只是一个 timer
而不是 periodicTimer
,但我认为这没有什么坏处。
接下来我重构了 is_ready
if 语句,如下所示:
if ($this->is_ready) {
if ($message->get('op') == 0) {
if ($message->get('t') === "MESSAGE_CREATE") {
$trigger = config('discord.message.trigger');
$data = $message->get('d');
$msgContent = $data['content'];
if (starts_with($msgContent, $trigger)) {
ProcessMessage::dispatch($data);
}
}
} else {
$now = Carbon::now();
$loop->addTimer(20, function ($x) use ($conn,$loop) {
dump("Sending Heartbeat - " . $this->heartbeat . " - " .Carbon::now()->toDateTimeString());
$payload = collect([
'op' => 1,
'd' => (int)$this->seq,
]);
$conn->send($payload->toJson());
$loop->cancelTimer($x);
});
}
}
请注意,如果 op
代码不等于 0,我只会安排一个计时器。我依赖于这样一个事实,即之前的 heartbeat
已经被安排并且将 运行 .这几乎是一个保证,只要在服务器启动时执行第一个。
这是到目前为止控制台的输出,运行 这个配置已经持续了大约五到十分钟,没有双心跳或任何东西。
"Sending Heartbeat - 41.25 - 2017-12-31 08:41:18"
Illuminate\Support\Collection {#702
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:41:38"
Illuminate\Support\Collection {#704
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:41:58"
Illuminate\Support\Collection {#706
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:42:18"
Illuminate\Support\Collection {#708
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:42:39"
Illuminate\Support\Collection {#710
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
Illuminate\Support\Collection {#712
#items: array:4 [
"t" => "PRESENCE_UPDATE"
"s" => 7
"op" => 0
"d" => array:6 [
"user" => array:1 [
"id" => "277968564827324416"
]
"status" => "idle"
"roles" => []
"nick" => null
"guild_id" => "394991263344230409"
"game" => null
]
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:42:59"
Illuminate\Support\Collection {#712
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:43:19"
Illuminate\Support\Collection {#717
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
如果您有任何问题,请随时与我联系。如果您想查看此代码,最终将提交到我的 Github 上的 public 存储库。目前,回购是私有的。检查我的个人资料 link 到 GitHub.
所以这是我遇到的一个非常有趣的问题。我一心想弄清楚如何将 websocket 客户端集成到 Laravel 5.5 中,以允许我的应用程序和 Discord Gateway. I spooled up a new Laravel app and required this library, via composer, which is built on top of Ratchet PHP.
通过 websocket 进行通信我正在尝试构建一个 PHP Discord Bot,因为它使用的 bot that i use to use but was abandon after a major dependency 也已停产。
我已经想出如何添加一个计时器以便像这样发送 heartbeats
$app->addTimer(x, function ($thing) use ($etc) {});
在我的应用程序收到来自 Discord 的事件之前,这一切都完美无缺。然后同步丢失,我的应用程序开始每 3 - 9 秒发送一次心跳,有时一次发送 2 或 3 次,而不是从 hello event 确定的时间间隔发送心跳。这是控制台出于调试原因的一些输出,但它显示了我的问题:
"Sending Heartbeat - 41 - 2017-12-31 05:26:42"
"Sending Heartbeat - 41 - 2017-12-31 05:26:42"
Illuminate\Support\Collection {#679
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
Illuminate\Support\Collection {#679
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:26:51"
Illuminate\Support\Collection {#602
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:26:55"
Illuminate\Support\Collection {#695
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:26:56"
Illuminate\Support\Collection {#688
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
Illuminate\Support\Collection {#688
#items: array:4 [
"t" => "TYPING_START"
"s" => 7
"op" => 0
"d" => array:3 [
"user_id" => "277968564827324416"
"timestamp" => 1514698064
"channel_id" => "394991263344230411"
]
]
}
Illuminate\Support\Collection {#688
#items: array:4 [
"t" => "MESSAGE_CREATE"
"s" => 8
"op" => 0
"d" => array:15 [
"type" => 0
"tts" => false
"timestamp" => "2017-12-31T05:27:47.057000+00:00"
"pinned" => false
"nonce" => "396897209817235456"
"mentions" => []
"mention_roles" => []
"mention_everyone" => false
"id" => "396897202448105494"
"embeds" => []
"edited_timestamp" => null
"content" => "!about"
"channel_id" => "394991263344230411"
"author" => array:4 [
"username" => "David Davaham"
"id" => "277968564827324416"
"discriminator" => "2471"
"avatar" => "0c27e1bed49121e8aaf3f284d6b74e55"
]
"attachments" => []
]
]
}
Illuminate\Support\Collection {#688
#items: array:4 [
"t" => "MESSAGE_CREATE"
"s" => 9
"op" => 0
"d" => array:15 [
"type" => 0
"tts" => false
"timestamp" => "2017-12-31T05:27:49.382000+00:00"
"pinned" => false
"nonce" => null
"mentions" => array:1 [
0 => array:4 [
"username" => "David Davaham"
"id" => "277968564827324416"
"discriminator" => "2471"
"avatar" => "0c27e1bed49121e8aaf3f284d6b74e55"
]
]
"mention_roles" => []
"mention_everyone" => false
"id" => "396897212199862276"
"embeds" => []
"edited_timestamp" => null
"content" => "<@!277968564827324416> Unfortunately That is not a command I recognize. Please try again. Reply with `!help` for a list of commands"
"channel_id" => "394991263344230411"
"author" => array:5 [
"username" => "Claire Underwood (Dev)"
"id" => "394988052360986635"
"discriminator" => "8397"
"bot" => true
"avatar" => null
]
"attachments" => []
]
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:12"
Illuminate\Support\Collection {#616
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:23"
"Sending Heartbeat - 41 - 2017-12-31 05:27:23"
Illuminate\Support\Collection {#622
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
Illuminate\Support\Collection {#622
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:32"
Illuminate\Support\Collection {#652
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:36"
Illuminate\Support\Collection {#667
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:37"
Illuminate\Support\Collection {#661
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:46"
Illuminate\Support\Collection {#663
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:49"
Illuminate\Support\Collection {#660
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:51"
Illuminate\Support\Collection {#656
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:27:53"
Illuminate\Support\Collection {#698
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:28:04"
"Sending Heartbeat - 41 - 2017-12-31 05:28:04"
Illuminate\Support\Collection {#701
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
Illuminate\Support\Collection {#701
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:28:13"
Illuminate\Support\Collection {#706
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:28:17"
Illuminate\Support\Collection {#707
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41 - 2017-12-31 05:28:18"
Illuminate\Support\Collection {#709
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
代码如下:
$conn->on('message', function(MessageInterface $msg) use ($conn, $socket, $loop) {
$message = collect(json_decode($msg, true));
dump($message);
if ($message->has('s') && $message->get('s') !== null) {
$this->seq = $message->get('s');
}
if (!$this->is_ready) {
if (!$message->has('op')) {
$conn->close();
}
if ($message->get('op') == 0) {
if ($message->get('t') === "READY" || $message->get('t') === "GUILD_CREATE") {
$this->is_ready = true;
$this->seq = $message->get('s');
}
}
if ($message->get('op') == 10) {
$this->connOpened = Carbon::now();
$this->heartbeat = (int)floor($message->get('d')['heartbeat_interval'] / 1000);
$socket->sendIdentify();
sleep(1);
}
if ($message->get('op') == 11) {
$now = Carbon::now()->timestamp;
if (!$this->heartbeatACK) {
$this->heartbeatACK = true;
}
}
}
if ($this->is_ready) {
if ($message->get('op') == 0) {
if ($message->get('t') === "MESSAGE_CREATE") {
$trigger = config('discord.message.trigger');
$data = $message->get('d');
$msgContent = $data['content'];
if (starts_with($msgContent, $trigger)) {
ProcessMessage::dispatch($data);
}
}
}
$now = Carbon::now();
$loop->addTimer($this->heartbeat, function ($x) use ($now, $conn, $socket) {
dump("Sending Heartbeat - " . $this->heartbeat . " - " .$now->toDateTimeString());
$payload = collect([
'op' => 1,
'd' => (int)$this->seq,
]);
$conn->send($payload->toJson());
});
}
});
有没有人知道可以更好地管理心跳的方法,或者这只是我需要容忍的事情吗?
另外,有没有人对我这样做有什么建议或批评?我找不到关于如何执行此操作的任何可靠文档,所以我正在将它拼凑在一起。
所以这个问题已经解决了。这是我发现的:
根据代码概述,当执行以下代码块时:
if (!$this->is_ready) {
...
if ($message->get('op') == 0) {
if ($message->get('t') === "READY" || $message->get('t') === "GUILD_CREATE") {
$this->is_ready = true;
$this->seq = $message->get('s');
}
}
...
}
由于 $this->is_ready
被设置为 true
,此代码段跟进,这将导致添加两个计时器。除此之外,因为我有这样的 is_ready
代码:
if ($this->is_ready) {
if ($message->get('op') == 0) {
if ($message->get('t') === "MESSAGE_CREATE") {
$trigger = config('discord.message.trigger');
$data = $message->get('d');
$msgContent = $data['content'];
if (starts_with($msgContent, $trigger)) {
ProcessMessage::dispatch($data);
}
}
}
$now = Carbon::now();
$loop->addTimer($this->heartbeat, function ($x) use ($now, $conn, $socket) {
dump("Sending Heartbeat - " . $this->heartbeat . " - " .$now->toDateTimeString());
$payload = collect([
'op' => 1,
'd' => (int)$this->seq,
]);
$conn->send($payload->toJson());
});
}
每次我收到一个新事件时,都会安排另一个计时器,导致计时器累加,并在这些计时器到期时发送心跳。这导致计时器最终每秒发送多次,如果我不想这样的话。以下是我所做的更改:
我在这里的第一个块中添加了一个计时器,如下所示:
if ($message->get('op') == 0) {
if ($message->get('t') === "READY" || $message->get('t') === "GUILD_CREATE") {
$this->is_ready = true;
$loop->addTimer(20, function ($x) use ($conn,$loop) {
dump("Sending Heartbeat - " . $this->heartbeat . " - " .Carbon::now()->toDateTimeString());
$payload = collect([
'op' => 1,
'd' => (int)$this->seq,
]);
$conn->send($payload->toJson());
$loop->cancelTimer($x);
});
}
}
这导致循环停止处理这个计时器,但在底部,我在发送心跳后取消了计时器。我不确定这是否重要,因为它只是一个 timer
而不是 periodicTimer
,但我认为这没有什么坏处。
接下来我重构了 is_ready
if 语句,如下所示:
if ($this->is_ready) {
if ($message->get('op') == 0) {
if ($message->get('t') === "MESSAGE_CREATE") {
$trigger = config('discord.message.trigger');
$data = $message->get('d');
$msgContent = $data['content'];
if (starts_with($msgContent, $trigger)) {
ProcessMessage::dispatch($data);
}
}
} else {
$now = Carbon::now();
$loop->addTimer(20, function ($x) use ($conn,$loop) {
dump("Sending Heartbeat - " . $this->heartbeat . " - " .Carbon::now()->toDateTimeString());
$payload = collect([
'op' => 1,
'd' => (int)$this->seq,
]);
$conn->send($payload->toJson());
$loop->cancelTimer($x);
});
}
}
请注意,如果 op
代码不等于 0,我只会安排一个计时器。我依赖于这样一个事实,即之前的 heartbeat
已经被安排并且将 运行 .这几乎是一个保证,只要在服务器启动时执行第一个。
这是到目前为止控制台的输出,运行 这个配置已经持续了大约五到十分钟,没有双心跳或任何东西。
"Sending Heartbeat - 41.25 - 2017-12-31 08:41:18"
Illuminate\Support\Collection {#702
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:41:38"
Illuminate\Support\Collection {#704
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:41:58"
Illuminate\Support\Collection {#706
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:42:18"
Illuminate\Support\Collection {#708
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:42:39"
Illuminate\Support\Collection {#710
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
Illuminate\Support\Collection {#712
#items: array:4 [
"t" => "PRESENCE_UPDATE"
"s" => 7
"op" => 0
"d" => array:6 [
"user" => array:1 [
"id" => "277968564827324416"
]
"status" => "idle"
"roles" => []
"nick" => null
"guild_id" => "394991263344230409"
"game" => null
]
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:42:59"
Illuminate\Support\Collection {#712
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
"Sending Heartbeat - 41.25 - 2017-12-31 08:43:19"
Illuminate\Support\Collection {#717
#items: array:4 [
"t" => null
"s" => null
"op" => 11
"d" => null
]
}
如果您有任何问题,请随时与我联系。如果您想查看此代码,最终将提交到我的 Github 上的 public 存储库。目前,回购是私有的。检查我的个人资料 link 到 GitHub.