1

这是情况。我有一个管理面板(多个管理员同时使用)和员工面板(多个员工同时使用)。管理员可以同时与多名员工聊天,但员工只能与管理员聊天。所有聊天都保存在数据库(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>

再一次,我仍然愿意接受建议/建议。

4

0 回答 0