Как уменьшить трафик чата?

maxis

Новичок
Как уменьшить трафик чата?

Коротко о проблеме: есть чат, кушает слишком много трафика. Текстовое поле обновляется раз в 10 секунд при минимальной активности юзверя и содержит 60 последних фраз. Процесс вывода сообщений выглядит примерно так:
PHP:
$ath=mysql_query("select * from reports ORDER BY id_report limit $limit, 60");
while($texts=@mysql_fetch_array($ath))
{
echo"<tr><td>
<font color=#$texts[color] size=3>$texts[report]</font>
</td></tr>";
}
Вопрос 1) возможно ли кэшировать каждую фразу на стороне клиента?
Вопрос 2) возможно ли создать на стороне клиента некий "Буфер" в который будут добавляться только новые сообщения, а посредствам явы скрипт или др. клиентского языка выводить сообщения из этого буфера?
Вопрос 3) каким образом можно уменьшить трафик от чата???
Помогите чем можете, незнаю уже что делать...
 

bgm

&nbsp;
1) Не "кэшировать", а просто хранить в массиве javascript
2) Можно - хранишь в переменной javascript ID последнего сообщения, через javascript обращаешься к скрипту и получаешь последние 60 сообщений у которых ID больше того, что на стороне клиента (это при условии, что поле ID у сообщений возрастает).
3) Передавать клиенту только новые сообщения.

P.S. В помощь: http://dklab.ru/lib/Subsys_JsHttpRequest/
 

maxis

Новичок
спасибо за информацию.

-~{}~ 11.07.06 17:56:

использование библиотеки JsHttpRequest оказалось очень заманчивым. но в итоге столкнулся с небольшой пробемой.
итак имеем 2 файла
обработчик:
PHP:
...
while($texts=@mysql_fetch_array($ath))
{
  $login=$login."<!>".$texts[login];
  $text=$text."<!>".$texts[report];
  $color=$color."<!>".$texts[color];
  $atribut=$atribut."<!>".$texts[atribut];
}
$_RESULT = array( 
  "id_ps" => $id,
  "login" => $login,
  "text" => $text,
  "color" => $color,
  "atribut" => $atribut,
);
и сам документ:
PHP:
<script language="JavaScript" 
 src="lib/Subsys/JsHttpRequest/Js.js"></script>
<script>

function doLoad(force) {
var req = new Subsys_JsHttpRequest_Js();
req.onreadystatechange = function() {
	if (req.readyState == 4) {
		if (req.responseJS) { 
		document.getElementById('result').innerHTML =
		"id последнего сообщения: " + req.responseJS.id_ps + "<hr>" +
		"Пользователти: " + req.responseJS.login + "<hr>" +
		"Сощбщения: " + req.responseJS.text + "<hr>" +
		"Цвета сообщений: " + req.responseJS.color + "<hr>" +
		"Атрибуты: " + req.responseJS.atribut + "<hr>";
		document.getElementById('result2').innerHTML = arr;
		}
		document.getElementById('debug').innerHTML = 
		req.responseText;
	}
scroll(0,2000);
}
req.open('POST', 'load.php?test=abc', true);
req.send({ id_ps: "значение req.responseJS.id_ps", test:303 });
}
setInterval("doLoad(true)",2000);
</script>
<div id="result" align="center">... соединение с сервером ...</div>
<div id="result2" align="center"></div>
итак сама пролема: переменные req.responseJS.xxxxx извесны только внутри условия "if (req.responseJS)", а любые другие переменные обьявленные вне условия "if (req.readyState == 4)" внутри этого условия неизвесны.
Короче говоря нужно сделать так, чтоб req.responseJS.xxxxx разбывались на переменные символами "<!>", а те в свою очередь складывались с переменными полученными при предыдущем вызове ф-ции.
 

maxis

Новичок
Автор оригинала: kruglov
maxis
Т.е. gzipить вы уже пробовали и выигрыш минимален?
Насколько я знаю функция ob_start("ob_gzhandler"); кэширует на стороне сервера и трафик от сервера к пользователю нисколько не уменьшает, а лишь уменьшает время создания страницы. Поправте меня если я неправ.
 

maxis

Новичок
хм... тогла не могли бы подсказать как её использовать в данном случае? Желательно поподробнее...
 

SiMM

Новичок
> Как уменьшить трафик чата?
Забить на него и юзать IRC, как все белые люди.
 

maxis

Новичок
Автор оригинала: kruglov
maxis
[m]ob_gzhandler[/m]
Я не спрашивал забить ли мне на чат или нет, и что использовать. Так что если не можешь сказать ничего по теме - молчи.
kruglov
как можно посмотреть размер страницы до и после сжатия?
 

maxis

Новичок
при использовании ob_gzhandler размер страницы нисколько не изменился
 

maxis

Новичок
Автор оригинала: kruglov
Возможно, неправильно использовали...
Нету теста онлайн?
К сожалению нет. Да и отказался я от этой идеи. Дело в том что каждые n секунд страница с сообщениями перезагружается. Причём содержание страницы почти не меняется ( &plusmn; m сообщений). Намного логичнее сделать догрузку этих m сообщений к уже выведеным, хранящихся в переменых JavaScript. В таком случаее трафик будет минимален. Да и больно соблазнителен вывод сообщений без постоянных рефрешей. Вот только как вставить обработчик на php(отдельный файл ,который в свою очередь создаёт JavaScript код с переменными, содержащими новые сообщения) в JavaScript функцию, которая выполняется каждые n секунд?
 

ioleg

Новичок
Объединяя варианты от "bgm" и "maxis" мы получаем самый экономный чат, который можно только придумать. Т.е.:

1. Храни в "ХИДЕНЕ" время последнего обращения к базе данных, желательно держать в милисекундах для предотвращения потерь сообщений.
2. innerHTML - это прекрасный способ забивать страницу новыми данными, дополнять или изменять полностью часть страницы.
3. AJAX - хорошая технология, и пременить ее здесь можно на УРА!!! Нужен краткий, понятный пример, простой и полностью рабочий - могу выложить. Т.к. в нэте есть куча примеров половина из них очень капризна и приспособлены для работы с определенным браузером, либо работает со многими но сделано через одно место.

Применяя все это одновременно, получаем прекрасный чат, без щелчков и без миганий при обновлении страницы. Сам не могу нарадоваться своим скриптом чата.

-~{}~ 14.07.06 03:59:

Автор оригинала: maxis
Вот только как вставить обработчик на php(отдельный файл ,который в свою очередь создаёт JavaScript код с переменными, содержащими новые сообщения) в JavaScript функцию, которая выполняется каждые n секунд?
1. Это самый простой способ.

Если у тебя используеются фрэймы, то создай один фрэйм и в ХЭДЭРЕ напиши: <meta http-equiv="refresh" content="10">. Где "10" - это период обновления страницы в секундах. А эта страничка и должна являться твоим основным обработчиком. В этом случаи можно обойтись без AJAX. Нет большого смысла в нем.

2. Чуть сложнее.

Если у тебя НЕ используются фрэймы, то тут без AJAX не обойтись. Тут тебе уже нужен скрип который заставит заработать функцию. Вот тебе пример такого скрипта:

<SCRIPT language=JavaScript>
var intLeft=10; //период обновления страницы в секундах

function leavePage()
{
if (0==intLeft) //Время закончено и вызов функции
{
<имя твоей функции для работы с AJAX>;
intLeft=10; //ставим счетчик на начало
setTimeout("leavePage()", 1000); //и поехали по следующему кругу
}
else
{
intLeft -= 1; //уменьшаем на секунду
setTimeout("leavePage()", 1000); //вызывает функцию с новым временем
}
}

function leavePage();
</SCRIPT>

ПЫСЫ: идея, я думаю, понятна. Развивай.
 

LiveKillers

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

Это дело вкуса. Мне, например, щелчок ничуть не мешает, по той причине, что я вообще все звуки в системе отключил. И в рунете есть немало посетителей обычных фреймовых чатов, которые не собираются их менять на крутейшие флэш (упаси Господи) или Аяксовые примочки.

Кстати, а щелчок программно можно отключить? :)

Поэтому я бы посоветовал как пользователь, сделать чат на Аяксе, но чтобы читать можно было сверху вниз и перекручивать страницу.

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

EugeneVC

Новичок
>>Кстати, а щелчок программно можно отключить?
На уровне Web насколько я знаю нет!
 

ioleg

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

Я, например, вообще не могу читать снизу вверх, притом что страницу ничерта наверх перекрутить нельзя. Это дело вкуса.
И здесь ни кто не спорит. В чатах, где хоть немного подумали о пользователях имеется возможность выбора режима добавления, а также период обновления страницы.

Мне, например, щелчок ничуть не мешает, по той причине, что я вообще все звуки в системе отключил. И в рунете есть немало посетителей обычных фреймовых чатов, которые не собираются их менять на крутейшие флэш (упаси Господи) или Аяксовые примочки.
Это не выход, отключение звука! Нужно устранять проблему, а не уходить от нее. С каких это пор AJAX - это крутейшая примочка? Это на самом деле простая, быстрая, удобная технология. Которую всем советую использовать. Я уже говорил, что есть супер сложные готовые скрипты AJAXа, но есть простое и понятное решение этого.

Поэтому я бы посоветовал как пользователь, сделать чат на Аяксе, но чтобы читать можно было сверху вниз и перекручивать страницу.
А я бы советовал продумать 2-а режима - это элементарно все.

Кстати, а можно и без Аякса сделать экономию трафика:
скрытый фрейм обновляется, а новый текст добавляется к старому с помощью innerHTML - вот вам и архив сообщений без нагрузки на канал.
Можно, если использовать фрэймовую систему (это я описывал), а если без фрэймов? Попробубуй реализовать без AJAX!
 
Сверху