Как сделать быстрый, легкий, экономичный онлайн-чат с PHP + JS + (MySQL?) + (AJAX?) - PullRequest
10 голосов
/ 06 декабря 2010

Каким способом лучше всего будет писать онлайн чат с js?Если бы я использовал AJAX и обновлял информацию о пользователях и сообщениях каждые 5 секунд - HTTP-запросы и ответы увеличат трафик, а запросы увеличат нагрузку на сервер.

а как иначе?Розетки?Но как ..

Ответы [ 4 ]

8 голосов
/ 06 декабря 2010

У вас, похоже, проблема с нагрузкой на сервер, поэтому я сравню соответствующие технологии.

Ajax-опрос: Это самое простое. Вы выполняете цикл setTimeout каждые 5 секунд или чаще, чтобы проверять наличие новых сообщений чата, или устанавливаете iframe для перезагрузки. Когда вы публикуете сообщение, вы также возвращаете новые сообщения, и вещи не должны выходить из строя. Самым большим недостатком этого метода является то, что вы вряд ли будете опрашивать с частотой, соответствующей частоте отправки сообщений. Либо вы будете опрашивать слишком быстро, и вы будете делать много дополнительных запросов, либо вы будете опрашивать слишком медленно, и вы будете получать порции сообщений за раз вместо того, чтобы получать их в режиме реального времени. Это, безусловно, самый простой способ.

HTTP Push Это идея о том, что сервер должен сообщать клиенту о появлении новых сообщений, а не постоянно беспокоить сервер, спрашивая, есть ли еще новые. Представьте, что родитель ведет машину, а ребенок спрашивает: «Мы уже там?», Вы можете просто попросить родителя сказать ребенку, когда они туда доберутся.

Есть несколько способов подделать это и сделать это по-настоящему. Упомянутые вами WebSockets фактически создают поток между клиентом и сервером и отправляют данные в режиме реального времени. Это потрясающе, и для 4 из 10 пользователей, у которых есть браузер, способный это сделать, они будут в восторге. У всех остальных будет сломанная страница. Сожалею. Может быть, через пару лет.

Вы также можете подделать технологию push с такими вещами, как long-polling . Идея состоит в том, что вы спрашиваете сервер, есть ли какие-либо новые сообщения, и сервер не отвечает до тех пор, пока не появится новое сообщение или не будет достигнут некоторый заданный предел (30 секунд или около того). Это сводит количество запросов к минимуму при использовании известных веб-технологий, поэтому большинство браузеров будут работать с ним. У вас будет высокий параллелизм соединения, но они на самом деле ничего не делают, поэтому он должен иметь слишком высокую стоимость сервера.

Я использовал все это раньше, но в итоге я сам пошел на длинный опрос . Вы можете узнать больше о том, как на самом деле это сделать, здесь: Как мне реализовать базовый «длинный опрос»?

2 голосов
/ 16 июня 2013

Вы должны выбрать сокеты, а не AJAX Polling, однако не так много о том, как можно интегрировать чаты на основе сокетов с MySQL.

Я провел несколько тестов и приведу здесь базовый пример:https://github.com/andrefigueira/PHP-MySQL-Sockets-Chat

Используется Ratchet (http://socketo.me/) для создания сервера чата в PHP.

И вы можете отправлять сообщения чата в БД, отправляя серверJSON с информацией о том, кто в чате, (если, конечно, у вас есть пользовательские сессии)

1 голос
/ 06 декабря 2010

Типичный подход - использовать длинный опрос .Хотя лучше не делать этого в PHP (PHP будет нуждаться в одном процессе для каждого соединения, таким образом, резко ограничивая число возможных посетителей вашего сайта)Вместо этого используйте node.js .Идеально подходит для чатов.

1 голос
/ 06 декабря 2010

Есть несколько способов немедленно передать сообщения клиенту:

  • HTML5 Websockets
    • хорошо, потому что вы можете использовать их как настоящие розетки
    • плохо, потому что только несколько браузеров поддерживают его
  • бесконечно загружаемая рама
    • хорошо, потому что его поддерживает каждый браузер
    • не так круто, потому что вы должны делать AJAX-запросы для отправки вещей
    • вы можете отправлять команды клиенту, встраивая теги <script> в содержимое
      • скрипт также выполняется немедленно!
  • ...

Итак, в заключение я бы выбрал второй путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...