У меня простой кометный чат. 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