Php ajax long polling chat

Hallo, ich bin gerade dabei ein Chat Script zu Programmieren (in PHP).
Für die User Verständigung möchte ich ein Chat einbauen.
Nun das Problem: Ich möchte, dass per JavaScript (Ajax) die neuen Nachrichten sofort angezeigt werden.
Ich habe schon danach gegoogelt und kein Beispiel mit mysql(i) gefunden.
Dann habe ich selber herumversucht:

index.php:
<?php </pre>

    //----------------Config-----------------//





    include ('../../../config.php');





    //---------------------------------------//





    session\_start();





    $db = connectDb();





    $sqlnachrichten = "SELECT \* FROM `nachrichten` WHERE userid1 = '".$\_SESSION["id"]."' and status = 'ungelesen' ORDER BY id DESC LIMIT 1";





    $result = $db-\>query( $sqlnachrichten );





    //$result = mysql\_query("SELECT id FROM chatpoll ORDER BY id DESC LIMIT 1");





    while($row = $result-\>fetch\_object())





    {





    $old\_msg\_id = $row-\>id; 





    }





    ?\>





    





     





     





     





     function getContent(timestamp)





     {





     var queryString = {'timestamp' : timestamp};





     $.ajax(





     {





     type: 'GET',





     url: 'server.php',





     data: queryString,





     success: function(data){





     // put result data into "obj"





     var obj = jQuery.parseJSON(data);





     // put the data\_from\_file into #response





     $('#response').html(obj.data\_from\_file);





     // call the function again, this time with the timestamp we just got from server.php





     getContent(obj.timestamp);





     }





     }





     );





     }





     // initialize jQuery





     $(function() {





     getContent(<?php echo $old_msg_id; ?>);





     });





     





     





     





     Response from server: 





    





     





    



server.php:


    <?php </pre>
    
        //----------------Config-----------------//
    
    
    
    
    
        include ('../../../config.php');
    
    
    
    
    
        //---------------------------------------//
    
    
    
    
    
        session\_start();
    
    
    
    
    
        $db = connectDb();
    
    
    
    
    
        $old\_msg\_id = $\_GET['old\_msg\_id']; 
    
    
    
    
    
        $sqlnachrichten = "SELECT \* FROM `nachrichten` WHERE userid1 = '".$\_SESSION["id"]."' and status = 'ungelesen' ORDER BY id DESC LIMIT 1";
    
    
    
    
    
        $result = $db-\>query( $sqlnachrichten );
    
    
    
    
    
        while($row = $result-\>fetch\_object())
    
    
    
    
    
        {
    
    
    
    
    
         $last\_msg\_id = $row-\>id; 
    
    
    
    
    
        }
    
    
    
    
    
        // set php runtime to unlimited
    
    
    
    
    
        set\_time\_limit(0);
    
    
    
    
    
        // where does the data come from ? In real world this would be a SQL query or something
    
    
    
    
    
        //$data\_source\_file = 'data.txt';
    
    
    
    
    
        // main loop
    
    
    
    
    
        while (true) {
    
    
    
    
    
         // if ajax request has send a timestamp, then $last\_ajax\_call = timestamp, else $last\_ajax\_call = null
    
    
    
    
    
         $last\_ajax\_call = $\_GET['timestamp'];
    
    
    
    
    
         // PHP caches file data, like requesting the size of a file, by default. clearstatcache() clears that cache
    
    
    
    
    
         clearstatcache();
    
    
    
    
    
         // get timestamp of when file has been changed the last time
    
    
    
    
    
         $last\_change\_in\_data\_file = $last\_msg\_id;
    
    
    
    
    
         // if no timestamp delivered via ajax or data.txt has been changed SINCE last ajax timestamp
    
    
    
    
    
         if ($last\_ajax\_call == null || $last\_change\_in\_data\_file \> $last\_ajax\_call) {
    
    
    
    
    
         // get content of data.txt
    
    
    
    
    
         $data = $last\_msg\_id;
    
    
    
    
    
         // put data.txt's content and timestamp of last data.txt change into array
    
    
    
    
    
         $result = array(
    
    
    
    
    
         'data\_from\_file' =\> $data,
    
    
    
    
    
         'timestamp' =\> $last\_change\_in\_data\_file
    
    
    
    
    
         );
    
    
    
    
    
         // encode to JSON, render the result (for AJAX)
    
    
    
    
    
         $json = json\_encode($result);
    
    
    
    
    
         echo $json;
    
    
    
    
    
         // leave this loop step
    
    
    
    
    
         break;
    
    
    
    
    
         } else {
    
    
    
    
    
         // wait for 1 sec (not very sexy as this blocks the PHP/Apache process, but that's how it goes)
    
    
    
    
    
         sleep( 1 );
    
    
    
    
    
         continue;
    
    
    
    
    
         }
    
    
    
    }
    
    könnt ihr mir bitte eine funktionierende Lösung zeigen?
    
    Simon

Hallo Simolation,

warum so umständlich? Schau dir mal Node.js und Websockets an, damit kannst du einen einfachen Chat in Echtzeit, in ca. 20 min programmieren.

Gruß XXD

Hallo XhoanXoroDaxos,

Mit node.js kenne ich mich nicht gut aus.
Mit ajax müsste des doch gehen.

Simolation

Hi,

Mit node.js kenne ich mich nicht gut aus.

node.js ist doch javascript, wer ajax kann kann auch node.js.

Mit ajax müsste des doch gehen.

Sicherlich. http://www.drweb.de/magazin/ajax-in-der-praxis-ein-e…

Damit du als Vergleich siehst wie einfach das mit node.js ist hier ein simpler chat:

  1. node.js installieren

  2. npm install websockets

  3. den erzeugden npm_modules-Ordner auf deinen Apache kopieren und folgende 2 Dateien chat.js und client.html:

    var WebSocketServer = require(‚websocket‘).server;

    var server = require(‚http‘).createServer(function(req, res) {
    require(‚fs‘).readFile(‚client.html‘, function (e, data) {
    res.end(data.toString());
    console.log(„Connected“);
    });
    }).listen(3060);

    wsServer = new WebSocketServer({
    httpServer: server
    });

    var connections = [];

    wsServer.on(‚request‘, function(request) {
    var connection = request.accept(‚chat‘, request.origin);

    connections.push(connection);
    console.log(request+":"+connection);

    connection.on(‚message‘, function(message) {
    for (var i = 0; i

    Starten mit

     node chat.js
    

    Browser aufrufen mit so einer html z.B.

Send

var socket = new WebSocket(‚ws://localhost:3060/‘, ‚chat‘);
socket.onopen = function(){message(‚Socket Status: ‚+socket.readyState+‘ (open)‘)};

$(’#sendBtn’).on(‚click‘, function (e) {
e.preventDefault();
var name = $(’#name’).val(),
msg = $(’#msg’).val();
socket.send(’{„name“: „’ + name + '“, „msg“: „’ + msg + '“}’);

});

socket.onmessage = function (msg) {
var data = JSON.parse(msg.data),
content = $(’#msgs’).html() + ‚<br />‘;
$(’#msgs’).html(content + data.name + ': ’ + data.msg);
};

…keine weiteren Einstellungen am Apache nötig = simpler Echtzeitchat.

Gruß XXD

1 Like

naja
node.js hin und her
1 . nicht jeder webspace bietet das
2. für nen popeligen chat gleich sowas auffahren ist echt zuviel des guten.

Mal zur Antwort ,
http://www.php-tagebuch.de/long-polling-mit-jquery-u…

hat aber alles einen hacken :smile: Aber für nen simplen chat sollte das gehen.

naja
node.js hin und her
1 . nicht jeder webspace bietet das

Stimmt schon, aber da sieht man mal wie die mit der Zeit gehen, die mir bekannten sind heruko und Redhat, die sowas schon länger anbieten.

  1. für nen popeligen chat gleich sowas auffahren ist echt
    zuviel des guten.

Naja, finde es gerade mit node.js super einfach, auch von der kürze des Programm- Codes, lassen wir node.js bei Seite und legen die Betonung auf websockets (wird mittlerweile von allen gängigen Browser unterstützt, außer IE
log(„Handshaking…“);
list($resource,$host,$origin) = getheaders($buffer);
$upgrade = „HTTP/1.1 101 Web Socket Protocol Handshake\r\n“ .
„Upgrade: WebSocket\r\n“ .
„Connection: Upgrade\r\n“ .
"WebSocket-Origin: " . $origin . „\r\n“ .
„WebSocket-Location: ws://“ . $host . $resource . „\r\n“ .
„\r\n“;
$handshake = true;
socket_write($socket,$upgrade.chr(0),strlen($upgrade.chr(0)));

…tataaa …Websockets = sau cool!

Mal zur Antwort ,
http://www.php-tagebuch.de/long-polling-mit-jquery-u…

Comet…ja so hat man früher und leider noch heute programmiert ;-(