【问题标题】:Notifications of new messages. Long polling新消息的通知。长轮询
【发布时间】:2014-04-14 15:34:37
【问题描述】:

请帮我实现用户的新消息通知。

现在我有了这个客户端代码:

function getmess(){
$.ajax({
    url:"notif.php",
    data:{"id":id},
    type:"GET",
    success:function(result){
        $("#count").html(result);
        setTimeout('getmess',10000);
    }
  });
}

还有这个服务器代码:

    $mysqli = new mysqli('localhost', 'root', '', 'test');
if (mysqli_connect_errno()) { 
    printf("error: %s\n", mysqli_connect_error()); 
    exit; 
}  

session_start();

$MY_ID = $_SESSION['id'];

while (true) {
$result = $mysqli->query("SELECT COUNT(*) FROM messages WHERE user_get='$MY_ID'");
if (mysqli_num_rows($result)) {
while ($row = mysqli_fetch_array($result)) {
echo $row[0]."";
 }
flush();
exit;
}
sleep(5);
}

我的问题是,当新消息添加到数据库时,此脚本没有实时更新。但是,如果我按下带有 onclick="getmess();" 的按钮它有效。

【问题讨论】:

  • 所以你已经发布了一个 SQL 请求。那么,您的代码在哪里?你的问题呢?
  • 我已经更新了我的代码。

标签: php mysql ajax long-polling


【解决方案1】:

首先,您每 5 秒检查一次数据库,因此无法实现实时 - 您至少有 5 秒延迟。

其次,你无法通过轮询来实现实时。

几乎实时传递通知的方法是通过插入数据库的相同代码发送消息,例如您不应该在数据库中查询新记录,而是在有新记录时将数据发送到客户端。即使使用长轮询作为传输协议。

如何做到这一点?不幸的是,PHP 不是一个好的选择。您需要一个非阻塞服务器来保持连接,您需要知道哪个连接等待什么数据,并且您需要一种来自 PHP(您的后端)的方法来通知此连接。

您可以使用 tornado-web 服务器、node.js 或 nginx 来处理连接。您为每个连接分配一个标识符(可能您已经有一个 - 用户 ID),并且当添加了新记录时 - PHP 脚本向通知服务器(tornado、node.js、nginx)执行 HTTP 请求,说明要发送哪些数据哪个用户这样做。

对于nginx,请看nginx push stream

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2014-02-01
    • 2013-07-28
    • 2015-09-05
    相关资源
    最近更新 更多