GuyChabra
GuyChabra

Reputation: 105

Long polling JQUERY chat using sleep()

The following code makes the web loading for like 10 minutes and I dont know why!

function chatheartbeat(){
    include("config.php");
    $useradn = $_SESSION['displayname'];
    $query = "select * from chat where (userbdn = '".$useradn."' AND isread = 1) order by id ASC";
    $result = mysql_query($query , $link);
    $num_rows = mysql_num_rows($result);
    if ($num_rows >= 1) {
        $items = array();
        $i='1';
        while($chat = mysql_fetch_array($result)){
            $items[$i]['from']=$chat['useradn'];
            $items[$i]['msg']=$chat['msg'];
            $items[$i]['timee']=date("H:i" ,$chat['timee']);
            $i++;
        }
        $query = "update chat set isread = 0 where userbdn = '".$useradn."' and isread = 1";
        mysql_query($query , $link);
        header('Content-type: application/json');
        echo json_encode($items);
        exit;
    }else{
        sleep(2);
        chatheartbeat();
    }
}

Any suggestions?

Upvotes: 0

Views: 553

Answers (3)

jeroen
jeroen

Reputation: 91734

You are calling your function recursively and as the session variable does not change between the function calls, if it goes to the else part the first time, it will go there every time, creating a never ending loop.

By the way, if you want to use polling, you should set a timer in the client part (javascript) and not use a recursive function on the server side.

Upvotes: 2

moranjk
moranjk

Reputation: 151

There are a few things you want to look at when performing any long polling techniques.

  1. You need to exit after some predefined time period. Waiting on the server until you have something to respond with will lead you to execution timeouts.

  2. Know what is going on with your SESSION data. PHP by default will use file based sessions and locks the file during the course of the request (unless you intervine)

Upvotes: 1

SteveP
SteveP

Reputation: 19093

The function will never return until there are some results from the first select.

I would suggest that you return after n runs through (e.g. 5), even if there are no results. The client can then re-issue the ajax call to poll again.

Also, it's not a great idea to do this in a recursive manner. I would suggest doing this in a for loop instead.

Upvotes: 2

Related Questions