Обратный AJAX PHP Многопользовательский чат

Здесь ситуация. У меня есть панель администратора (которую используют несколько администраторов одновременно) и панель сотрудников (которую используют несколько сотрудников одновременно). Администратор может общаться с несколькими сотрудниками одновременно, но сотрудник может общаться только с администратором. Все чаты сохраняются в базе данных (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>

Еще раз, я все еще открыт для предложений / советов.

0 ответов

Другие вопросы по тегам