新消息的通知。长期民意调查

时间:2014-04-14 15:34:38

标签: php mysql ajax long-polling

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

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

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();"它有效。

1 个答案:

答案 0 :(得分:0)

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

其次,你无法通过民意调查实现实时性。

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

如何实现这一目标?不幸的是,PHP不是一个好选择。您需要一个非阻塞服务器来保持连接,您需要知道哪个连接等待哪些数据,您需要从PHP(您的后端)通知此连接。

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

对于nginx,请查看nginx push stream