[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Чат
Slays
Думаю многие из вас делали чат. Я вот тоже накидал. Все по стандарту:
- есть поле ввода
- есть поле для отображения сообщений

Записываем сообщения через ajax. Также интервально запрашиваем новые сообщения, передавая последнее полученное.

Примерно так:

<script type="text/javascript">
$(document).ready(function(){

var last_id = <?=$lastId?>,
process = false;

setInterval( answer , 2000);

function answer(){
if( process ) return null;

process = true;
$.post( '/chat/answer', { 'last_id': last_id }, function( answer ){
if( answer ) $(".lenta").prepend( answer );
last_id = $('.lenta .data_block').attr('id');
process = false;
});
}

}
);
</
script>


Проблема в том, что какой интервал я бы не ставил, до появления новых сообщений проходит много времени, обработка скрипта все дела. Как можно ускорить это время, чтобы сообщения появлялись более регулярно. А то когда отправил свое сообщение, долго ждешь когда они обновляются. Какие вообще решения и фишки есть для чата.

_____________
если помог, не скупись на карму =)
inpost
nodejs+socket.io , глянь на эту вещь)

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Slays
а на php и js получше никак не сделать ?

_____________
если помог, не скупись на карму =)
chee
Slays, http://socketo.me/

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
johniek_comp
inpost
что ж теперь человеку ради чата изучать новую технологию, и переписывать весь backend?

_____________
user posted image
sergeiss
Мне кажется, что setInterval тут не годится. Лучше в обработчике принятых данных использовать setTimeout. Иначе может получиться так, что предыдущая обработка в силу каких-то причин еще не завершилась, а ты уже следующий запрос отправил.
И даже если node.js использовать, то все равно на это же надо обратить внимание.

Цитата (johniek_comp @ 16.02.2015 - 15:16)
что ж теперь человеку ради чата изучать новую технологию, и переписывать весь backend?

А почему бы и нет? smile.gif Ежели он учится, то изучение дополнительных возможностей только на пользу ему же будет. И не только ради текущего чата, а для того, чтобы в будущем знать, как и что можно сделать.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Slays
sergeiss переменная process как раз следит, чтобы не повторять запрос до завершения процесса.


chee гляну


_____________
если помог, не скупись на карму =)
sergeiss
Цитата (Slays @ 16.02.2015 - 15:50)
переменная process как раз следит, чтобы не повторять запрос до завершения процесса.

Из-за этого у тебя может получиться большой интервал между запросами.

Например... Вот ты установил интервал 2 сек. ОК. Ты получил данные, обрабатываешь. Суммарно набежало 2.0001 сек (запрос к серверу, подготовка данных, отправка назад, обработка в браузере). Была попытка запуска еще одного запроса, ты ее предотвратил. Следующий запрос уйдет через 2 сек. Но между двумя запросами на сервер пройдет 4 секунды!!! А если бы ты запустил следующий запрос по окончании обработки данных от предыдущего запроса, то прошло бы не 4, а всего 2.0001 сек.
Ну и, естественно, тут надо контролировать, чтобы не было слишком частых запросов; сделать это не сложно.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
inpost
Slays
nodejs - это и есть JS, который висит на сервере, а socket.io позволяет запросы слать сервера клиенту, а не клиенту запрашивать информацию у сервера.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
chee
Slays

<script type="text/javascript">
$(document).ready(function(){
var interval = setInterval( answer , 500);
var last_id;
var answer = function () {
clearInterval(interval);
$.post( '/chat/answer', { 'last_id': last_id }, function( answer ){
if( answer ) $(".lenta").prepend( answer );
last_id = $('.lenta .data_block').attr('id');
setInterval(answer , 500);
});
}


}
);
</
script>

можно еще так. Должно работать быстрее. Код не проверял

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
sergeiss
chee, твой код должен выдать ошибку при втором обращении к функции. Потому что переменная interval уже не будет отвечать за текущий интервал.
Если же убрать clearInterval(), а setInterval() заменить на setTimeout(), то тогда получится как раз то, о чем я говорил чуть ранее в этой теме. Какой смысл каждый раз выключать интервал, если для этого же существует "одноразовая" функция setTimeout()?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Hello
sergeiss и на первом он не сработает
var interval = setInterval( answer , 500);

А answer у нас undefined

_____________
VPS от 5$, первые 2 месяца - бесплатно.
inpost
chee
На хабре читал, что на ПХП значительно меньше производительность в десятки раз. Попробовал загуглить - тоже пишут, что медленнее, чем node.js. Но лично от меня спасибо за информацию, пойду учиться веб-сервера делать на PHP smile.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
johniek_comp
inpost
ну знаешь можно так сделать что и нода будет тормозить и на простой реквест 10 сек. отвечать)) при 5 одновременных подключений...

_____________
user posted image
123456
Цитата
Записываем сообщения через ajax.

При успешной отправке сообщения запускай функцию answer()
или добавляй через .appendTo сообщение в блок.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.