PHP Comet.Как сделать это лучше? - PullRequest
4 голосов
/ 18 февраля 2011

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

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 18 февраля 2011

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

4 голосов
/ 18 февраля 2011

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

...