gpt4 book ai didi

使用 Ratchet Websockets 进行 PHP 实时聊天

转载 作者:行者123 更新时间:2023-12-04 16:14:25 26 4
gpt4 key购买 nike

我是 PHP Websockets 的初学者,我正在尝试使用数据库存储创建实时聊天。我做得很好,但现在我遇到了一个问题。有问题,当用户 1 向用户 2 发送消息并且用户 2 首先来到站点时(首先在 localhoste 上重新加载),它不会是“实时的”。

让我进一步解释一下。

这是我的 server.php .它与 Ratchet 教程几乎相同:

$loop = React\EventLoop\Factory::create();    
$pusher = new \Pusher();
$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5555'); // Binding to 127.0.0.1 means the only client that can connect is itself
$pull->on('message', array($pusher, 'onBlogEntry'));
$webSock = new React\Socket\Server($loop);
$webSock->listen(8080, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect
$webServer = new Ratchet\Server\IoServer(
new Ratchet\Http\HttpServer(
new Ratchet\WebSocket\WsServer(
new Ratchet\Wamp\WampServer($pusher ))), $webSock);
$loop->run();

pusher.php 这些方法是最重要的(我省略了其他不重要的东西):
protected $subscribedTopics = array();
protected $myID = array();

public function onSubscribe(ConnectionInterface $conn, $data) {
$this->subscribedTopics[json_decode($data)->teamID] = $data;
$this->myID[json_decode($data)->userID] = $data;
}

public function onBlogEntry($entry) {
$entryData = json_decode($entry, true);

if ((!array_key_exists($entryData['team_id'], $this->subscribedTopics)) ||
(!array_key_exists($entryData['to_user_id'], $this->myID))
) {
return;
}

$teamID = $this->subscribedTopics[$entryData['team_id']];
$teamID->broadcast($entryData);
}

在我的 主持人类我有简单的形式。当用户提交此表单时,此代码如下:
$this->chatPartner = $values['to_user_id'];       //this I get from the form
$this->redrawControl('msg'); //here I redraw my layout
$this->messages_model->addMessage($values); //here I send data to database
$context = new \ZMQContext();
$socket = $context->getSocket(\ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:5555");
$socket->send(json_encode($values));

然后,在 查看 我有这个 JavaScript 代码:
var myJSON = '{'
+ '"teamID" : {$teamId},' //this I get from the presenter
+ '"userID" : {$userId}' //this I get from the presenter
+ '}';
var conn = new ab.Session('ws://localhost:8080',
function() {
conn.subscribe(myJSON, function(topic, data) {
if (data.from_user_id == mypartnerIdA) {
//here I edit the DOM
}
});
},
function() {
console.warn('WebSocket connection closed');
},
{'skipSubprotocolCheck': true}
);

所以,回到我的问题 .我模拟了 2 个用户。 User1 重新加载此页面,首先是 javascript 连接。 User2 在他之后重新加载此页面。当用户 1 向用户 2 发送消息时,消息会立即(实时)出现。但是,当用户 2 向用户 1 发送消息时,该消息不会立即出现 - 只有在下次重新加载页面后才会出现。

我的问题是 - 如何解决这个问题?如何使 user2 的消息也实时?我怎样才能解决这个我的代码?

最佳答案

您可能对最终订阅的数据有误解。
它旨在用于聊天 session 的 ID。

例如:

  • A 与 B 聊天(chatId = 1)
  • B 和 C 聊天(chatId = 2)
  • C 与 A 聊天(chatId = 3)
  • A、B 和 C 在一个聊天中 (chatId = 4)
    var chatId = 2; //this chat is only between users B and C
    conn.subscribe( chatId , function(topic, data) {
    ...
    }

  • 我理解它的最简单方法是将它与 Twitter 上的主题标签进行比较。
    在您的情况下,每个主题标签都是一个 chatId。
    并且对于每个订阅主题标签/chatId。您将拥有一个 WebSocket 连接,以便接收它的所有更新。

    从长远来看,这将是一种更简单的方法,然后通过为 userId 参数分割连接。
    它还可以轻松地存储在数据库中,以便您知道向谁发送消息,向谁发送消息。

    关于使用 Ratchet Websockets 进行 PHP 实时聊天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36991507/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com