Dynamisches Chat



  • Hallo,

    ich habe mir ein Chat programmiert mit PHP, MySQL und AJAX, aber bin mir nicht sicher ob das die beste Vorgehensweise ist. Hab schon oft gesehen das JSON benutzt wird für http Requests zur Datenübertragung u.s.w. und hab mich mal über JSON informiert, doch ist es überhaupt angesagt einen WebChat mit PHP, MySQL und AJAX zu programmieren?

    Und das da jede 2 Sekunden eine HTTP Request durchgeführt wird, würde es doch den Server stark belasten, nach einer bestimmten Anzahl an Usern, oder?

    getChat funktion mit globa

    var receiveReq = getXMLHttpRequest();
    var lastMessage = 0;
    var mTimer;
    
    function getChat() {
      if(receiveReq.readyState == 4 || receiveReq.readyState == 0) {
        receiveReq.open("GET", "getchat.php?id="+document.getElementById('chat_id').value+"&lastmsg="+ lastMessage, true);
        receiveReq.onreadystatechange = handlegetchat;
        receiveReq.send(null);
      }
    }
    
    function handlegetchat() {
      if(receiveReq.readyState == 4) {
        var chat_out_div = document.getElementById('chat_output_layer');
        var response = eval("(" + receiveReq.responseText + ")");
    
        for(var i=0; i < response.chat.message.length; i++) {
          chat_out_div.innerHTML += "<b>"+response.chat.message[i].username+":</b> <span style=\"font-size: 11px; color: #333; font-style: italic\">("+response.chat.message[i].timestamp+")</span> ";
          chat_out_div.innerHTML += response.chat.message[i].message+"<br>";
    
          chat_out_div.scrollTop = chat_out_div.scrollHeight;
          lastMessage = response.chat.message[i].id;
        }
        mTimer = setTimeout("getChat();", 2000);
      }
    }
    

    und hier die getchat.php Datei:

    <?php
    session_start();
    include('mysql_connection.php');
    
    // send chat
    
    if(isset($_POST['message']) && $_POST['message'] != "") {
      $timestamp = time();
      mysql_query("INSERT INTO chat_log (user_id, chat_id, timestamp, message) VALUES ('$_SESSION[user_id]', '$_POST[id]', '$timestamp', '$_POST[message]')");
    }
    
    // get chat
    $lastmsg = $_GET['lastmsg'];
    
    $query_msg = mysql_query("SELECT * FROM chat_log WHERE message_id > '$lastmsg' AND chat_id = '$_GET[id]' ORDER BY message_id");
    
    $json = '{ "chat": {';
    
    $num = mysql_num_rows($query_msg);
    
    if($num > 0) {
      $json .= '"message": [';
      while($object = mysql_fetch_object($query_msg)) {
        //user tabelle
        $user_query = mysql_query("SELECT * FROM user WHERE id = '$object->user_id'");
        $user_object = mysql_fetch_object($user_query);
    
        $getdate = date("H:i", $object->timestamp);
    
        $json .= '{ "id": "'.$object->message_id.'",
        "timestamp": "'.$getdate.'",
          "username": "'.htmlspecialchars($user_object->username).'",
            "message": "'.htmlspecialchars($object->message).'"
            },';
      }
      $json .= ']';
    } else {
      $json .= '"message": []';
    }
    $json .= '}}';
    echo $json;
    ?>
    


  • Hm... jedes Mal das JSON neu zu bauen ist bestimmt nicht so sinnvoll.

    Allgemein ist es nicht hilfreich bei einem Echtzeitchat auf JS Basis SQL zu verwenden. Wenn du eine Datenbank ala MongoDB oder CouchDB verwendest bist du wesentlich besser dran.
    Diese Datenbanken sind dokumentbasiert und werden im JSON (bzw. bei MongoDB BSON - eine Erweiterung zu JSON) gespeichert. Du fügst also JSONs rein und bekommst JSONs raus.


Anmelden zum Antworten