PHP Comet. Как это сделать лучше?

У меня простой кометный чат. JavaScript отправляет запрос ajax с длинным опросом. Когда сервер находит новые сообщения в базе данных, он отвечает и дает JSON. Затем JavaScript снова отправит запрос.

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; в $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; в $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; 

проблема следующая: этот «while ($ flag)» может выполняться в течение длительного времени (если никто не пишет сообщения). Таким образом, Apache может выделять исключения (максимальное время выполнения, иногда 502 Bad Gateway или Gateway Timeout).

Как его решить?

использовать .htaccess и "php_value max_execution_time 0"?

или просто отправить новый запрос из JavaScript, когда сервер возвращает ошибку (это делает сообщения медленнее)?

Может быть, есть и другой способ?

если нет сообщений нажимать с сервера за 40 секунд, вы отправляете какой-либо ответ от сервера, на базовом из которых клиент повторно запрашивает.

Вы должны проверить проект APE. Это Ajax Push Engine, это может помочь в режиме реального времени: http://www.ape-project.org