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

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

Но как другой? Розетки? Но как..

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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