Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP Comet. How to do it better?

I have a simple comet chat. JavaScript send ajax request with long polling. When server find new messages in the database, it answers and gives JSON. Next, JavaScript send the request again.

Javascript:

function cometConnect(){
$.ajax({
      cache:false,
      type:"get",
      data:'ts='+ts,
      url: urlBack,
      async: true,
      success: function (arr1) {
      //work with JSON
      //.....
      },
      complete:function(){
        cometConnect(true);
        nerr=false;
      },
      dataType: "text"
    }); 
}

PHP

$flag=true;
$lastmodif = isset($_GET['ts']) ? $_GET['ts'] : 0;
while($flag){
  $q=mysql_query("SELECT text, posterId,modified, fromUserId,toUserId, login FROM commonMessage WHERE modified>$lastmodif");

      while($r=mysql_fetch_row($q)){
        $flag=false;
        //Prepare JSON... variable $resp
            //.........
      }

  usleep(5000); 
}
echo $resp;

the problem is following: this "while($flag)" can execute for a long time (if nobody posts messages). So, Apache can throw the exeptions (max execution time, sometimes 502 Bad Gateway or Gateway Timeout).

How to solve it?

use .htaccess and "php_value max_execution_time 0"?

or simple send new request from JavaScript, when server returns error (it makes getting messages more slow)?

May be, there is some other way?

like image 804
Sir Hally Avatar asked Dec 28 '22 01:12

Sir Hally


1 Answers

You should check out APE Project. It's an Ajax Push Engine, it might help for realtime communication: www.ape-project.org

like image 148
Hirvesh Avatar answered Dec 30 '22 13:12

Hirvesh