Там было сделано это.Это не тривиально, чтобы получить право.
Я думаю, что есть одно важное решение, которое вы должны принять: хотите ли вы, чтобы чат был действительно мгновенным, или это нормально, чтобы задержка составляла 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.
Хорошо, это стало намного длиннее, чем я хотел. Но я надеюсь, что это поможет некоторым людям. :)