我有一个最多有2个用户的聊天室,当一个用户向另一个用户发送消息时,应该通知第二个用户,就像Facebook一样收到新消息
我已经使用像
这样的Ajax请求完成了它 $(document).ready(
function() {
setInterval(function() {
$.ajax({
url: 'incs/check_new_msg.php' ,
cache: false,
success: function(data)
{
$('#message').html(data);
},
});
}, 1000);
});
<div id="message"></div>
在check_new_msg.php
中,我使用以下代码:
$new_msg = mysql_query("select * from inbox where status = '0' ");
echo mysql_num_rows($new_msg);
上面的代码工作正常,但问题是它每秒检查收件箱和新邮件,但它似乎对处理器有害,因为它每秒运行一次MySQL查询,请帮助我如何只在新的时候执行检查查询收到消息。
答案 0 :(得分:3)
我会给你一个概念然后你应该尝试实施它 从另一台计算机插入内容时创建外部文本文件,并在客户端每秒检查一次相同的文件,而不是检查数据库。如果文件存在则检查数据库,否则继续检查文本文件
答案 1 :(得分:0)
所以你唯一关心的是它每隔一秒运行一次查询吗?
这是我的解决方案:
$(document).ready(
function() {
function check_message()
{
$.ajax({
url: 'incs/check_new_msg.php' ,
cache: false,
success: function(data)
{
$('#message').html(data);
},
complete: function(data)
{
check_message();
},
});
}
check_message();
});
<div id="message"></div>
这样做会在最后一个ajax请求完成后递归调用ajax。
答案 2 :(得分:0)
实现您讨论的功能的方法之一是长轮询方法。在此方法中,您将连接保持打开一段时间,如果在该时间内发生更改,则会将响应返回给用户。并打开另一个连接,依此类推。
你应该谷歌关于longpolling,因为有很多教程可用。祝你好运
答案 3 :(得分:0)
我找到了一个很好的解决方案,为此,我在脚本所在的同一目录中使用了一个记事本文件。
从任何计算机插入新记录时,您必须使用插入创建记事本文件。
$insert = mysql_query("insert into inbox .....");
if(insert)
{
if(!file_exists(notepad_file_path))
{
fopen(notepad_file_path);
}
}
然后我调用ajax请求请求
$(document).ready(
function() {
function check_message()
{
$.ajax({
url: 'incs/check_new_msg.php' ,
cache: false,
success: function(data)
{
$('#message').html(data);
},
complete: function(data)
{
check_message();
},
});
}
check_message();
});
<div id="message"></div>
之后在外部ajax文件中检查是否存在记事本文件,如果文件存在则提供对数据库的访问权,这样就不会对处理器造成伤害。
if(file_exists(notepad_file_path))
{
$new_msg = mysql_query("select * from inbox where status = '0' ");
echo mysql_num_rows($new_msg);
if(mysql_num_rows($new_msg) == 0)
{
unlink(notepad_file_path);
}
}