HTML5 простой чат - PullRequest
       34

HTML5 простой чат

2 голосов
/ 15 января 2012

То, что я хотел бы сделать, - это простой чат HTML5, ничего особенного, когда кто-то что-то говорит, он отправляет это всем, кто в данный момент подключен к серверу, и все. Нет хранения, ничего сложного. Это должно быть гибким, хотя мой сайт должен иметь возможность автоматически создавать отдельные чаты по мере необходимости. Я видел много демонстраций и примеров, но все они требуют, чтобы я установил node.js или что-то подобное, что требует терминального доступа (которого у меня нет). В настоящее время я работаю на одном из тех бесплатных хостингов веб-сайтов, которые предоставляют вам ftp-клиент, базу данных mysql, некоторую поддержку php и все. Есть ли способ сделать это? Или, может быть, я что-то упустил, есть ли способ установить пакеты на таких серверах? Возможно, кто-то знает способ получения терминального доступа? Спасибо за любую помощь, спасибо.

Ответы [ 5 ]

9 голосов
/ 11 февраля 2012

Там было сделано это.Это не тривиально, чтобы получить право.

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

Если задержки в порядке, вы можете просто опросить сервер каждые 2 секунды, чтобы узнать, доступны ли новые сообщения.Никто не любит задержки, но в зависимости от того, что вы хотите сделать, это может быть не так уж плохо.Сервер будет проверять базу данных / файл при каждом запросе и возвращать обновления.Это очень простое решение, и оно работает.(И если вы думаете, что опрос каждые 2 секунды тратит ресурсы и излишнюю нагрузку на сервер ... читайте дальше, альтернатива может быть хуже.)

Полностью мгновенный чат требует, чтобы сервер мог немедленно отправлять новыеданные для клиентов, не дожидаясь, пока клиенты их запросят.HTTP изначально не поддерживает это, и если вы не хотите использовать какой-либо Flash / Java, единственный способ, которым я знаю, это использовать комет-запросы.Это запросы (обычно AJAX), которые на какое-то время намеренно зависают на сервере, а затем возвращаются точно в тот момент, когда доступны новые данные, которые необходимо отправить клиенту, или по истечении времени ожидания.Каждый раз, когда кометный запрос возвращается, клиент обрабатывает данные и немедленно отправляет другой кометный запрос, который снова зависает, пока не появятся новые данные.Я считаю, что каждый веб-сайт чата в чистом HTML / JS делает это таким образом (Omegle, Facebook, многие другие).

Теперь, это была простая часть.Но как вы реализуете это на сервере?Давайте посмотрим на эту ситуацию: у вас есть 10 пользователей в чате, то есть 10 клиентов, у каждого из которых будет зависший кометный запрос, ожидающий новых данных.Один из пользователей пишет что-то в чат, и это вызывает дополнительный запрос к серверу опубликовать текст.Как вы выполняете это одно выполнение скрипта PHP на сервере, чтобы остальные 10 выполнений перестали ждать и возвращали новые данные?(Вы можете заменить PHP на Perl или что-то еще.) Вам понадобится что-то, что позволит нескольким выполнениям сценариев общаться друг с другом.(Или сам код PHP может опрашивать базу данных каждую секунду, но это снова приводит к задержкам.) Любая форма межпроцессного взаимодействия (IPC) затруднена в этих языках сценариев, особенно из-за того, что вы не знаете, какую модельвеб-сервер использует для их выполнения.Например, в Apache может быть процесс для каждого запроса, или поток для каждого запроса, или сочетание обоих.Но, возможно, ваш хостинг использует IIS или что-то еще, поэтому в этой ситуации сложно сделать IPC.В итоге я создал собственный серверный компонент на PHP, который работал все время, и его задачей было передавать сообщения между различными исполнениями PHP-скриптов.И да, это требует доступа к оболочке.Все исполнения PHP будут подключаться к этому компоненту сервера через сокеты, и сообщения могут передаваться.Это было сложно получить право, но в конце это сработало довольно хорошо.

К сожалению, кометные запросы могут быть очень расточительными из-за циклов памяти и процессора. Мой сервер Apache имел модель «процесс на PHP». Поэтому, когда в чате было 100 человек, это означало, что в любой момент было 100 ожидающих комет-запросов, что означало, что запущено 100 процессов Apache. И даже если новый процесс Apache использует только 10 МБ, это составляет всего 1 ГБ! Это много памяти, и эти процессы были ничем иным, как ожиданием того, чтобы что-то произошло. Чат был невероятным занятием памяти. Кроме того, такой чат генерирует очень много запросов: каждый раз, когда кто-то что-то говорит в чате, все 100 запросов возвращаются, и вы сразу после этого получите 100 новых запросов. В два раза больше пользователей в чате обычно означает в четыре раза больше запросов. И вы действительно хотите, чтобы это было быстро. Apache не всегда был настолько эффективен в обращении с этим. Существует некоторое веб-серверное программное обеспечение, специально предназначенное для кометных запросов, которое будет очень хорошо масштабироваться, но для этого снова требуется больше доступа к серверу, чем у вас.

Итак, для полноты, вот конец моей истории: тем временем я отказался от всего PHP и полностью переписал чат. На мой взгляд, Apache, как и PHP, совершенно не подходит для такого рода задач. Теперь есть один компонент Java-сервера, который интегрирует эффективный многопоточный HTTP-сервер. Я провел стресс-тестирование, и оно работает очень хорошо: при подключении 500 спам-клиентов загрузка ЦП не превышает 15%, а использование памяти остается на уровне 150 МБ. Это намного лучше, чем я ожидал. Его отзывчивость также значительно улучшилась по сравнению с Apache / PHP. Конечный результат можно посмотреть по адресу http://www.dark -chat.info / Хотя чат в настоящее время несколько мертв по различным причинам. Надеюсь, это изменится, когда у меня будет больше времени.

Ну, я знаю, что это вам совсем не поможет, так как вы довольно ограничены вашим хостинг-провайдером. А без доступа к оболочке вы действительно можете сделать очень много. Если у вас все в порядке с задержкой в ​​2 секунды (или составляет 1 секунду) и вы не ожидаете более 20 пользователей одновременно, вы можете просто пойти на опрос. Есть способы немного оптимизировать это, например, активные пользователи могут получать опросы за 1 секунду, а те, которые редко что-то пишут, получают опросы за 5 секунд.

Тем не менее, возможно, вы могли бы также поискать какое-то размещенное решение. Я уверен, что вокруг есть чаты, которые вы можете вставлять с помощью iframes.

Хорошо, это стало намного длиннее, чем я хотел. Но я надеюсь, что это поможет некоторым людям. :)

0 голосов
/ 11 февраля 2012

Как уже упоминали многие, популярный метод для достижения этой цели - использование ajax, кометы (или какого-либо другого механизма длинного опроса) или WebSockets.

Я предлагаю использовать WebSockets, но, как уже упоминалось, ваш хост может не позволить вам настроить сервер сокетов.

Если вы оказались в такой ситуации, я рекомендую использовать Server Sent Events , еще одно решение HTML5, которое было омрачено WebSockets.

Это даст вам возможность отправлять события в браузер и все же упростит реализацию в PHP.

0 голосов
/ 15 января 2012

Я не могу много сказать об этом, но в настоящее время часто используемая технология для таких вещей: комета .
В Comet вы открываете запрос к серверу (например, с чем-то вродеAJAX), но вы не закрываете его.Вы просто оставляете его открытым, но отправляете данные с сервера клиенту только при необходимости.Эта технология также нуждается в некоторых специальных серверах для этого, но я думаю, что если вы немного разберетесь в Google, вы обязательно найдете способ реализовать Comet с PHP (но я думаю, что Python будет лучше для чего-то подобного) ...

Надеюсь, это даст вам некоторое представление о том, как решить вашу проблему:)

0 голосов
/ 25 января 2012

В HTML 5 есть замечательная новая функция, называемая веб-сокетами, которая обеспечивает истинную двустороннюю связь между клиентом и сервером. Тем не менее, вы не найдете дешевых общих хостингов, которые позволят вам разместить собственный сервер веб-сокетов.

Вы можете подделать двустороннюю связь, сделав ее «старомодным» способом: используя AJAX. По сути, клиентский JavaScript каждые несколько секунд отправляет запрос в базу данных, чтобы проверить наличие новых сообщений чата для отображения. Чтобы опубликовать новое сообщение, просто отправьте это сообщение на сервер.

Комета - это просто причудливый (более эффективный, серверный) способ сделать это.

0 голосов
/ 15 января 2012

Единственный способ реализовать чат без использования плагинов (Flash, Java, ...) - это WebSocket . (Подключение сервера на определенный промежуток времени для проверки нового сообщения - это способ реализовать это, но я думаю, что это слишком «грязно» ...) Однако я думаю, что сайт веб-хостинга может не предоставлять сервер WebSocket. Я предлагаю вам сделать IRC-клиент, выполнив соединение с использованием Java / Flash. Если вы хотите использовать HTML / JS для создания пользовательского интерфейса, используйте ExternalInterface во Flash или JSObject в Java для взаимодействия между плагином и JS.

...