情况如下。我有一个管理面板(多个管理员同时使用)和员工面板(多个员工同时使用)。管理员可以同时与多个员工聊天,但员工只能与管理员聊天。所有聊天记录都保存在数据库(mysql)中,其中包含各自的“from,to,msg,time”字段,根据这些字段,双方都根据其活动聊天会话匹配消息。
现在我正在使用
setInterval(function(){ $.ajax(...); },3000);
并且返回服务器将所有消息返回给管理员但仅返回请求员工的特定消息。但这不是一个实用的解决方案,因为如果它不正确,过度使用我的服务器资源也会过多地使用数据库查询。
可以进行很多改进。从将最后一条消息的时间传递给服务器开始,然后只返回晚于该时间到达的消息。仍然是ajax每隔3秒调用一次,数据库查询也保持不变。然后我可以使它成为一个具有30秒延迟的自调用函数,如下例所示。
waitformsg(){
$.ajax({ url: "server", success: function(data){
// Do whatever I wish with the data...
}, dataType: "json", complete: waitformsg, timeout: 30000 });
}
但即使我使用这种技术,如何在服务器端等待,而不是等待什么? 请记住,我还想减少数据库查询的数量,但我唯一需要的是在发送的时间值之后收到的一堆消息。像下面这样的东西会做但仍然需要等待什么?
<?php
if ( isset($_GET['update']) ){
$time = $_GET['timestamp'];
while (...do what here...){
usleep(10000);
clearstatcache();
}
}
$response = array();
$response['msg'] = "get the message from the database";
$response['timestamp'] = time();
echo json_encode($response);
flush();
}
?>
请帮助我解决这个问题。如何在多个用户同时聊天的环境中设置可以在服务器中循环的触发器。
我已经实现了轮询技术,到目前为止它看起来不错,但由于数据库查询过多,我仍然不太高兴。我仍然愿意接受建议。
以下是服务器代码。
<?php
require('database.class.php');
$database = new database('****','****','****','****');
if ( isset($_POST['update']) ){
$lasttime = isset($_POST['timestamp']) ? $_POST['timestamp'] : 0;
while (1){
$msgs = $database->executeObjectList("SELECT * FROM tblchatdummy WHERE timestamp > $lasttime");
if (!empty($msgs)){
break;
}
sleep(2);
clearstatcache();
}
echo json_encode($msgs);
flush();
}elseif ( isset($_POST['save']) ){
$msg = isset($_POST['msg']) ? $_POST['msg'] : '';
if ($msg != ''){
$from = $_POST["from"];
$to = $_POST["to"];
$timestamp = time();
$message = filter_var(trim($msg),FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
$database->executeNonQuery("INSERT INTO tblchatdummy(msg_to, msg_from, msg, timestamp) VALUE('".$to."','".$from."','".$message."','".$timestamp."')");
$response = array();
$response['success'] = "1";
$response['timestamp'] = $timestamp;
echo json_encode($response);
flush();
}
}
?>
以下是客户端。它简单有效,这就是我喜欢客户端的原因。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</head>
<body>
<p>
<input type="text" name="word" id="word" value="" />
<input type="button" name="send" value="Send" id="mybutton"/>
</p>
<div id="content"></div>
<script type="text/javascript">
var lastime = 0;
$("#mybutton").click(function(){
$.post("backend.php", {save:"1",from:"1",to:"5",msg:$("#word").val()}, function(data){
$("#word").val("");
}, "json");
});
(function update(){
$.ajax({ type: "POST", url: "backend.php", data: {update:"1",timestamp:lastime}, success: function(data1){
lastime = handleDATA(data1);
}, dataType: "json", complete: update, timeout: 30000 });
})();
function handleDATA (data){
for(i=0;i<data.length;i++){
$("#content").append(data[i].msg+"</br>");
}
return data[data.length-1].timestamp;
}
</script>
</body>
</html>
再一次,我仍然愿意接受建议/建议。