请帮助我实现用户的新消息通知。
现在我有了这个客户端代码:
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();"它有效。
答案 0 :(得分:0)
首先,您每5秒检查一次数据库,这样您就无法实现实时 - 您至少有5秒的延迟。
其次,你无法通过民意调查实现实时性。
几乎实时地发送通知的方式是通过插入数据库的相同代码发送消息,例如,您不应该在数据库中查询新记录,而是在有新记录将数据发送到客户端时。即使使用长轮询作为传输协议。
如何实现这一目标?不幸的是,PHP不是一个好选择。您需要一个非阻塞服务器来保持连接,您需要知道哪个连接等待哪些数据,您需要从PHP(您的后端)通知此连接。
您可以使用tornado-web服务器,node.js或nginx来处理连接。您为每个连接分配一个标识符(可能您已经有一个 - 用户ID),并且当添加了新记录时 - PHP脚本会对通知服务器(tornado,node.js,nginx)执行HTTP请求,说明要将哪些数据添加到哪个用户这样做。
对于nginx,请查看nginx push stream