[英]PHP Real Time chat with Ratchet Websockets
我是PHP Websockets的初学者,我正在尝试与数据库存储创建实时聊天。 我的表现还不错,但是现在我遇到了一个问题。 有一个问题, 当用户1向用户2发送消息并且用户2首先到达站点(首先在localhoste上重新加载)时,它将不是“实时”的。
让我进一步解释。
这是我的server.php 。 实际上与棘轮教程相同:
$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发送消息时,消息立即(实时)出现。 但是,当user2向user1发送消息时,该消息不会立即显示-仅在下一次重新加载页面后才显示。
我的问题是 -如何解决这个问题? 如何也使user2的消息实时? 我该如何解决我的代码?
您可能对最终要订阅的数据有误解。 它旨在用于聊天会话的ID。
例如:
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参数细分连接,这将是一种更简便的方法。 还可以轻松地将其存储在数据库中,以便您知道将消息发送给谁,以及不向谁发送消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.