使用PHP,websockets和MySQL聊天

时间:2016-11-13 17:20:08

标签: javascript php mysql websocket chat

我正在尝试使用此https://github.com/ghedipunk/PHP-Websockets PHP类编写聊天。现在看起来,在客户端JS开始连接到服务器时,它会在3秒后发送一次请求,并且每次请求上的服务器都会检查数据库中的消息,并向客户端发送消息。我认为这不好,客户端每3秒发送一次请求,我想知道该怎么做,该服务器只有在数据库中有新消息时才向客户端发送消息? 这是我的扩展过程功能:

protected function process($user, $message) {
    $databaseHandler = mysqli_connect('blahblah');  
    $decoded = json_decode($message, true);
    $chat_id = $decoded['chatid'];
    $limit = $decoded['limit'];
    $user_id = filterString($decoded['userid'], $databaseHandler);
    $SQLQuery = "SELECT chat_messages.message, users.name FROM chat_messages JOIN users ON chat_messages.user_id=users.user_id WHERE chat_messages.chat_id = '$chat_id' ORDER BY chat_messages.message_id DESC LIMIT $limit,5;";
    $SQLResult = mysqli_query($databaseHandler, $SQLQuery);
    $i = 0;
    $arr = array();
    while ($row = mysqli_fetch_assoc($SQLResult)) {
        $i++;
        $arr[$i] = $row['name'] . ': ' . $row['message'];
    }


    $this->send($user, json_encode($arr));

}

这是JS函数:

function refreshchat() {

try {
    socket.send('{"token":"' + token + '","userid":'+ userid +'"chatid":' + chatid + ',"limit":' + limit + '}');

} catch (ex) {
    console.log(ex);
}
setTimeout(refreshchat, 3000);

}

我在php中跳过授权内容以进行清除。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

您正在使用setTimeout JavaScript函数。它只运行一次。您可以使用setInterval函数。它反复运行。 (http://www.w3schools.com/jsref/met_win_setinterval.asp

您似乎想要一种允许服务器通知客户端有新聊天消息的功能。我认为在Javascript中使用计时器是一个不错的选择。您还可以查看推送通知api:https://developers.google.com/web/updates/2015/03/push-notifications-on-the-open-web