постоянное соединение в чате

Статус
В этой теме нельзя размещать новые ответы.

Moby

Guest
постоянное соединение в чате

Я делаю свой чат. вроде бы всё красиво и замечательно, но вот спать не даёт меня следующая проблема: увидел чат Бородина и удивился - как быстро там приходят сообщения. почитал описание чата где было написано, что для получения новых сообщений там используется постоянное соединение со скриптом (не PHP, хотя наверное это не принципиально) и что при появлении в чате нового сообщение оно тут же раслыается всем клиентам.
вот у меня и возникли вопросы. что значит постоянное соединение? между кем и кем? я так понял по логике вещей между браузером (клиент) и серверным скриптом. но тут же себя обломал утверждением о том что HTTP протокол не годится для этих целей. обьясните пожалуйста этот момент и принцип реализации такой связи?
 

Vasya

Guest
Есть такой способ. Скрипт не заканчивает работу -- соединение браузера и сервера не завершается. При этом браузер постоянно докачивает данные, ибо сервер ему постоянно говорит "ещё не всё... ещё чуть-чуть..." :)
Данная технология имеет плюсы:
- минимизируется трафик
- новые сообщения рассылаются без задержки
- в браузере может быть выключена поддержка куков и джаваскрипта;
И минусы:
- на каждого клиента чата запускается свой процесс, который постоянно висит в памяти и жрёт ресурсы. (Например, стандартный апач не может поддерживать более 254 соединений одновременно.)
- на сервере не должно быть ограничений на время работы скрипта

Вот на это
http://dklab.ru/chicken/nablas/41.html
я бы посоветовал ещё посмотреть.
 

Moby

Guest
хмм.... это весьма интересно...

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

теперь по поводу "не заканчивает работу"... я так понимаю что это достигается путём выставление лимита на работу скрипта в 0 (т.е. неограничено), а в самом скрипте мы организовываем цикл (замкнутый) внутри которого и проверяем наличие новых данных.. если таковые имеются, то производим их выгрузку и так до бесконечности... я верно понял принцип? если да, то сопряжённый вопрос - в случае, когда пользователь закрывает бразуер, сервер как то это узнаёт? в смысле закрывает ли он приложение???
и ещё один вопрос - по поводу ограничения по количествую соединений - с чем связано это ограничение и можно ли его обойти? если нет, то я так понимаю что мой чат будет ограничен по количеству человек в нём где то примерно в 100-150??
 

Vasya

Guest
Ограничение на 254 одновременных соединения -- это особенность апача. Там прям в коде есть такая константа типа
#define HARD_LIMIT 254
что-то в этом роде. Это описано по-русски где-то в недрах
http://apache.lexa.ru/

Скрипт заканчивает работу по обрыву соединения. Апач прибивает дочерний процесс (трид). Вот что будет, если сказать ignore_user_abort(true), я не проверял :)

В остальном все вроде правильно.

Вот, кстати, ещё один минус этого подхода. Что будет если злобный Вася Пупкин запустит злобного робота, который откроет 254 (и более) злобных соединения на такой скрипт? :)
 

neko

tеam neko
я так думаю это неверно для mpm=worker
насчет соединений
и вообще для таких вещей юзать апач это крайне неоптимально

а для чайлда на запрос.... 255 чайлдов с пхп
сожрут гм...
гигабайта полтора памяти :)

и это для чата??
 

Moby

Guest
резюмируем...

1. защиту от васи пупки прикрутить в общем то не составляет труда (по идее скрипт будет шемиться по одному логину, паролю - это можно заблочить различными путями, расматривать их не буду, по-скольку в этом труда не вижу.

2. оставлять рабочие скрипты не целесобразно с точки зрения оптимальности.

3. ограничение по количеству соединений снять нельзя.

4. вопрос о постоянном коннекте остаётся открытым ;о)

но тогда как это сделал Бородин??? насколько я понял из описания - на сервере крутится одна (!) версия скрипта с которой работают все клиенты.
 

neko

tеam neko
только она не на пхп написана и не под апач

как именно там сделанно я если честно незнаю
думаю что poll/select
т.к. afaik никаких иных, третьих способов нет
либо поллить, либо процесс/тред на соединение
 

Moby

Guest
заранее извиняюсь за большое цитирование, но...

Чат-сервер - это скрипт на языке TCL. Скрипты на TCL, как и PHP, могут выполняться на всех ОС (Unix/Windows/Macintosh), встраиваться в веб-сервер или запускаться из консоли. Чат-сервер, т.е. скрипт на TCL, при выполнении своей роли запускается из консоли и работает как обычная программа. Если для выполнения PHP-скрипта в консоли нужен php.exe, то для выполенния TCL-скрипта, аналогичный интерпретатор tclsh83.exe. Что такое TCL и как оно работает вам совершенно не нужно, т.е. заниматься каким либо изучением данной технологии не придется. В этом абзаце лишь объясняется, как оно все работает, если вам это интересно. Язык TCL для написания чат-сервера был выбран потому, что для задач подобного рода он намного лучше чем PHP. Например, работает быстрее, система сообщений (как в JavaScript или оконном интерфейсе при программировании в Windows), удобные средства прослушивания портов для приема соединений от браузеров. По результатам тестов видно, что чат-сервер почти не отнимает ресурсов процессора, отъедает 3-4 Мб памяти при пустом чате и до 5 Мб - при 100 пользователях, находящихся одновременно в чате (на всех вместе всего 5 Мб).

мне это ничего не разьяснило, а вам?
 

Vasya

Guest
IMHO, он написал специально заточеный под чат веб-сервер на TCL. Назвал его "Чат-сервер".
О топике в приведенном отрывке нет инфы.
 

Moby

Guest
согласен инфы нет, потому я и задаю этот вопрос тут. веб-сервер под веб-сервером??? т.е. он организовал механизм "рабочий скрипт постоянно и принимающий запросы от браузера без завершения"? написал наверное немного спутанно, но думаю суть понятна.

-~{}~ 21.02.05 17:34:

а ещё очень хотелось бы услышать мнение Фаната, поскольку, я так понял, человек он очень грамотный в программировании в целом.
 

Фанат

oncle terrible
Команда форума
Меня не интересует написание чатов, к сожалению. Не могу ничего сказать по этой, несомненно, жизненно важной теме.
И я разделяю мнение Д.Бородина о том, что чат на пхп писать глупо.
 

Moby

Guest
2Фанат
понятно... ну тада хоть не блочь этот форум ;о)
 

Moby

Guest
2фанат
надеюсь что нет

2алл
хотел бы продолжить дискуссию на данную тему...
 

neko

tеam neko
а о чем тут дискутировать то?
помоему на все уже ответ дан

единственное чего бы мне хотелось, это чтобы кто-нибудь кто в вопросе разбирается прокомментировал мой предпоследний пост
 

Moby

Guest
я это и имел в виду... интересуют конкретные реализации
 

Vasya

Guest
Я скачал чат Бородина. Насколько я понял, он использует два вебсервера. Один -- стандартный, под которым работает ПХП, отдаются картинки и прочее. Второй -- это узкоспециализированный "чат-сервер", написанный им на TCL. Таким образом он обходит ограничения на максимальное число соединений стандартного и минимизирует пожираемые ресурсы. Но за это приходится платить -- нужен хостинг, где разрешат запустить свой демон (сервер) и где смогут обсчитать этот трафик. Это объясняет почему этот чат не сильно распространён :) К тому же, автор, IMHO, несколько помешан на своём авторском праве, поэтому я бы не стал связываться с этой программой вообще. Тем более, как-то серьезно её использовать.
В остальном, там нет ничего для меня нового.
 

Moby

Guest
тэкс... кажись писал тут, да ладно....
2Вася. вот и я любопытства ради хочу написать нечто подобное... с чего посоветуешь начать расковыривать эту тему? если могёжна - ткни на литературу ;о)
 

Vasya

Guest
Литературы именно про "растягивание HTTP соединения до масштабов сессии" не встречал :) Это просто один из приёмов.
Литературы по написанию TCP/IP серверов -- масса. Почти в любом учебнике по Java, Perl, Python, C++, Visual Basic, Logo... :)
Начать можно с понимания вот такого примера:
PHP:
<?
for($i=0;$i<10;$i++) {
	echo "message from $i: Hi!<br>";
	flush();
	sleep(2);
}
?>
Тут, собссно, нечего объяснять. Если возникнут конкретные вопросы -- вэлкам!
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху