За последние 24 часа нас посетил 48961 программист и 1805 роботов. Сейчас ищут 962 программиста ...

Проблема со вкладками при реализации чата на технологии come

Тема в разделе "JavaScript и AJAX", создана пользователем sookamordiy, 1 окт 2012.

  1. sookamordiy

    sookamordiy Активный пользователь

    С нами с:
    31 авг 2012
    Сообщения:
    3
    Симпатии:
    0
    Всем здравствуйте. При написании модуля обмена сообщениями между пользователями чата по типу "диалоги вконтакте", т.е. сообщения приходят без обновления страницы, и почти сразу после отправки(задержка около секунды), у меня возникла такая проблема: если открыто несколько вкладок с этим чатом, то сообщения доходят не во все вкладки, т.е. если открыты 3 одинаковые вкладки в браузере то: может придти во все 3, или в 2, или в 1. Такого что бы не сообщения не приходили, я пока не встречал, но мне кажется может и такое быть. Фрэймворк: yii. Использую denwer. Использую технологию Comet

    Еще один диагноз: denwer долго открывает страницу, около 5-10 секунд, что очень странно. Может в нем дело? Читал в тырнете, что у меня может быть открыт доступ для локальной сети, подскажите как узнать открыт ли он, и если открыт как его закрыть.

    Вот скрипт MessageController.php - этот код отвечает за своевременную отправку сообщений.
    Код (Text):
    1.  
    2.  public function actionBackend($id)
    3.     {
    4.         $myid = Yii::app()->user->id;
    5.         $queryUserName = Yii::app()->db->createCommand('SELECT username from users where id='.$id
    6.             )->queryAll();
    7.         $username=$queryUserName[0]['username'];
    8.         $lastmodif=date('Y-m-d H:i:s');
    9.         error_reporting(0);
    10.             while (($query===null) OR empty($query)) {
    11.  
    12.                 $query = Yii::app()->db->createCommand('SELECT *
    13.                     FROM
    14.                         messages
    15.                     WHERE
    16.                         (
    17.                         (from_id = '.$id.'
    18.                         AND to_id = '.$myid.')
    19.                         OR
    20.                         (from_id = '.$myid.'
    21.                         AND to_id = '.$id.'))
    22.                               AND `date`>STR_TO_DATE("'.$lastmodif.' ", "%Y-%m-%d %H:%i:%s")
    23.                     ORDER BY
    24.                         `date` DESC
    25.  
    26.                 ')->queryAll();
    27.                 if (!(($query===null) OR empty($query))) break; else sleep(1);
    28.             }
    29.  
    30.  
    31.             //знак комету чтобы начал выводить
    32.             echo "%%";
    33.             for ($i = 0; $i < count($query); $i++)
    34.                 echo (($query[$i]['from_id']==$myid)? 'Вы'."  ":$username."   ").': '.$query[$i]['text'].'<br/>';
    35.     }

    Вот часть кода из create.php - этот модуль отвечает за вывод сообщений на экран.

    Код (Text):
    1.  
    2. <script type="text/javascript">
    3.  var comet = {
    4.   connection   : false,
    5.   iframediv    : false,
    6.   timestamp    : 0,
    7.  
    8.   initialize: function() {
    9.     comet.connect();
    10.   },
    11.  
    12.   connect: function() {
    13.     comet.connection = $.ajax({
    14.        type: "GET",
    15.        url:  "<?php echo Yii::app()->getBaseUrl(true).'/messages/backend?id='. $id ?>",
    16.        data: "timestamp="+comet.timestamp,
    17.        dataType: "html",
    18.        success: function(msg){
    19.          msg = msg.split("%%");
    20.          if (typeof(msg[0]) != "undefined" && msg[0]!="")
    21.           comet.timestamp = parseInt(msg[0]);
    22.          if (typeof(msg[1]) != "undefined")
    23.           $("#cont").append(msg[1]);
    24.           document.getElementById('cont').scrollTop = 100;
    25.           //alert(1);
    26.          setTimeout(function(){ comet.connect() }, 1);
    27.        },
    28.        error: function(){
    29.          setTimeout(function(){ comet.connect() }, 1);
    30.        }
    31.       })
    32.  
    33.   },
    34.  
    35.   say: function() {
    36.     var text = $("#text").val();
    37.     var name = $("#name").val();
    38.     $("#text").val("");
    39.  
    40.     $.ajax({
    41.      type: "POST",
    42.      url:  "<?php echo Yii::app()->getBaseUrl(true).'/messages/backend?id='. $id ?>",
    43.      data: "text="+text+"&name="+name,
    44.      dataType:"html",
    45.      success: function(msg){
    46.      }
    47.     });
    48.   }
    49. }
    50.  
    51. $(window).load(function(){ comet.initialize(); });
    52.  
    53. </script>
    Буду рад любому совету, зашел в тупик, не знаю что сделать что-бы сообщения приходили во все вкладки. Если кто-то знает другие технологии для реализации чата между зарегистрированными пользователями сайта, делитесь, буду очень рад.