Sookamordiy
Новичок
Всем здравствуйте. При написании модуля обмена сообщениями между пользователями чата по типу "диалоги вконтакте", т.е. сообщения приходят без обновления страницы, и почти сразу после отправки(задержка около секунды), у меня возникла такая проблема: если открыто несколько вкладок с этим чатом, то сообщения доходят не во все вкладки, т.е. если открыты 3 одинаковые вкладки в браузере то: может придти во все 3, или в 2, или в 1. Такого что бы не сообщения не приходили, я пока не встречал, но мне кажется может и такое быть. Фрэймворк: yii. Использую denwer. Использую технологию Comet
Еще один диагноз: denwer долго открывает страницу, около 5-10 секунд, что очень странно. Может в нем дело? Читал в тырнете, что у меня может быть открыт доступ для локальной сети, подскажите как узнать открыт ли он, и если открыт как его закрыть.
Вот скрипт MessageController.php - этот код отвечает за своевременную отправку сообщений.
Вот часть кода из create.php - этот модуль отвечает за вывод сообщений на экран.
Буду рад любому совету, зашел в тупик, не знаю что сделать что-бы сообщения приходили во все вкладки. Если кто-то знает другие технологии для реализации чата между зарегистрированными пользователями сайта, делитесь, буду очень рад.
Еще один диагноз: denwer долго открывает страницу, около 5-10 секунд, что очень странно. Может в нем дело? Читал в тырнете, что у меня может быть открыт доступ для локальной сети, подскажите как узнать открыт ли он, и если открыт как его закрыть.
Вот скрипт MessageController.php - этот код отвечает за своевременную отправку сообщений.
Код:
public function actionBackend($id)
{
$myid = Yii::app()->user->id;
$queryUserName = Yii::app()->db->createCommand('SELECT username from users where id='.$id
)->queryAll();
$username=$queryUserName[0]['username'];
$lastmodif=date('Y-m-d H:i:s');
error_reporting(0);
while (($query===null) OR empty($query)) {
$query = Yii::app()->db->createCommand('SELECT *
FROM
messages
WHERE
(
(from_id = '.$id.'
AND to_id = '.$myid.')
OR
(from_id = '.$myid.'
AND to_id = '.$id.'))
AND `date`>STR_TO_DATE("'.$lastmodif.' ", "%Y-%m-%d %H:%i:%s")
ORDER BY
`date` DESC
')->queryAll();
if (!(($query===null) OR empty($query))) break; else sleep(1);
}
//знак комету чтобы начал выводить
echo "%%";
for ($i = 0; $i < count($query); $i++)
echo (($query[$i]['from_id']==$myid)? 'Вы'." ":$username." ").': '.$query[$i]['text'].'<br/>';
}
Вот часть кода из create.php - этот модуль отвечает за вывод сообщений на экран.
Код:
<script type="text/javascript">
var comet = {
connection : false,
iframediv : false,
timestamp : 0,
initialize: function() {
comet.connect();
},
connect: function() {
comet.connection = $.ajax({
type: "GET",
url: "<?php echo Yii::app()->getBaseUrl(true).'/messages/backend?id='. $id ?>",
data: "timestamp="+comet.timestamp,
dataType: "html",
success: function(msg){
msg = msg.split("%%");
if (typeof(msg[0]) != "undefined" && msg[0]!="")
comet.timestamp = parseInt(msg[0]);
if (typeof(msg[1]) != "undefined")
$("#cont").append(msg[1]);
document.getElementById('cont').scrollTop = 100;
//alert(1);
setTimeout(function(){ comet.connect() }, 1);
},
error: function(){
setTimeout(function(){ comet.connect() }, 1);
}
})
},
say: function() {
var text = $("#text").val();
var name = $("#name").val();
$("#text").val("");
$.ajax({
type: "POST",
url: "<?php echo Yii::app()->getBaseUrl(true).'/messages/backend?id='. $id ?>",
data: "text="+text+"&name="+name,
dataType:"html",
success: function(msg){
}
});
}
}
$(window).load(function(){ comet.initialize(); });
</script>