Как реализовать чат, используя jQuery, PHP и MySQL? - PullRequest
4 голосов
/ 02 марта 2009

Я создал скрипт чата с использованием php, mysql и jquery. Он использует JSON для получения данных с сервера. Он делает запросы с фиксированным интервалом к ​​серверу с последним извлеченным идентификатором сообщения для получения новых сообщений от сервера. Но когда несколько пользователей будут общаться в чате, тысячи и тысячи запросов будут отправлены на сервер в течение часа, и хостинг люди наверняка заблокируют его.

Я думаю, что в чате Gmail используется сокет. Потому что он не отправляет запросы с фиксированным интервалом точно. Может ли кто-нибудь из вас дать мне пример кода или направление для решения этой проблемы.

Пожалуйста, мне нужна помощь отчаянно.

Большое спасибо заранее. Мое уважение и привет всем.

Ответы [ 6 ]

7 голосов
/ 02 марта 2009

Если используемый вами хост «наверняка заблокирует», если он делает столько запросов, то вы можете подумать о том, чтобы получить другой хост или обновить пакет хостинга, прежде чем беспокоиться о своем коде. Посмотрите, как Facebook реализует свой чат:

Метод, который мы выбрали для получения текста один пользователь другому включает загрузку iframe на каждой странице Facebook, и имея этот Javascript сделать iframe HTTP-запрос GET через постоянный соединение, которое не возвращается до на сервере есть данные для клиента. Запрос восстанавливается, если он прервано или время ожидания. Это не любой новой техникой: это вариация кометы, в частности XHR длинный опрос и / или BOSH.

1 голос
/ 20 декабря 2009

попробуйте сокет в javascript

http://code.google.com/p/jsocket/

1 голос
/ 02 марта 2009

Правильно или нет, хостинговая компания может расстроиться по нескольким причинам:

1) Скорее всего, они используют Apache Prefork. Каждый запрос чата, вероятно, будет новым соединением и, таким образом, запускает отдельный процесс Apache. Каждый процесс apache съедает от 1 до 100 МБ памяти.

2) Если они обслуживают сервер базы данных, а вы, клиент, отстой в программировании базы данных, вы можете забить их базу данных. «Сосать» означает что угодно, от «нет правильной индексации» до «делает крошечные миллиарды запросов вместо хороших жирных».

Как было предложено выше, убедитесь, что ваш код использует постоянные соединения. Кроме того:

1) Реализовать алгоритм отсрочки на клиенте. Опрашивайте сервер один раз в секунду во время активности, затем возвращайтесь к пяти секундам, затем к десяти, двадцати и т. Д. Таким образом, вы не забиваете сервер, когда нет активности.

2) Несколько вкладок убьют вас. Пользователь открывает 10 вкладок, и все они имеют ваш виджет чата, опрашивающий сервер раз в секунду? Плохие новости. Даже если ваш хост не разозлится, ваша производительность ухудшится.

Если эта вещь станет огромной, спроектируйте свою систему таким образом, чтобы вы могли запускать биты чата-сервера независимо от остальной части вашего веб-приложения. Другими словами, клиенты будут делать запрос к «chat.yourwebapp.com», который, в свою очередь, работает на чем-то вроде lighttpd.

1 голос
/ 02 марта 2009

Может оказаться полезным увидеть пример технологии 'кометы' в действии, используя демон кометы Prototype и веб-сервер jetty . В примере кода для загрузки через пристань есть пример приложения для чата.

Я недавно установил Jetty самостоятельно, поэтому вы можете найти полезный журнал моих команд установки:

Начало работы с кометным сервисом

Скачать Maven с http://maven.apache.org/

Установите Maven, используя http://maven.apache.org/download.html#Installation Я сделал следующие команды Извлечено в /home/sdwyer/apache-maven-2.0.9

> sdwyer@pluto:~/apache-maven-2.0.9$ export M2_HOME=/home/sdwyer/apache-maven-2.0.9
> sdwyer@pluto:~/apache-maven-2.0.9$ export M2=$M2_HOME/bin
> sdwyer@pluto:~/apache-maven-2.0.9$ export PATH=$M2:$PATH.
> sdwyer@pluto:~/apache-maven-2.0.9$ mvn --version
-bash: /home/sdwyer/apache-maven-2.0.9/bin/mvn: Permission denied

> sdwyer@pluto:~/apache-maven-2.0.9$ cd bin
> sdwyer@pluto:~/apache-maven-2.0.9/bin$ ls
m2 m2.bat m2.conf mvn mvn.bat mvnDebug mvnDebug.bat

> sdwyer@pluto:~/apache-maven-2.0.9/bin$ chmod +x mvn

> sdwyer@pluto:~/apache-maven-2.0.9/bin$ mvn –version

Maven version: 2.0.9
Java version: 1.5.0_08
OS name: “linux” version: “2.6.18-4-686″ arch: “i386″ Family: “unix”
sdwyer@pluto:~/apache-maven-2.0.9/bin$

Загрузить сервер Jetty с http://www.mortbay.org/jetty/ Извлечь в /home/sdwyer/jetty-6.1.3

> sdwyer@pluto:~$ cd jetty-6.1.3//examples/cometd-demo

> mvn jetty:run

Запускается целый стек загрузок

После завершения откройте браузер и укажите его: http://localhost:8080 и протестируйте демонстрации.

Код для демонстрационных примеров можно найти в каталоге:

jetty-6.1.3/examples/cometd-demo/src/main/webapp/examples
0 голосов
/ 20 декабря 2009

Вы думаете о встраивании небольшого Flash-ролика в страницу, а затем используете сокеты для связи с сервером. Это займет большую часть нагрузки с сервера и значительно облегчит синхронизацию. Пользовательский интерфейс все еще может работать с JavaScript.
Если вы останетесь со своим решением JavaScript, то молча проигнорируйте мой ответ: -)

0 голосов
/ 02 марта 2009

Почему хост блокирует это? Вы делаете стандартный http-запрос на страницу, если ваш хост не разрешает этого, тогда пришло время переключиться.

Что касается использования сокетов, то здесь нет встроенной возможности подключения к сокету через javascript, хотя я считаю, что JSocket - это библиотека, которая позволяет вам соединять сокет через встроенную флэш-память, которая фактически подключена к вашему серверу. Не искал плагин jquery, который делает это, может быть один.

Ваш код на стороне сервера также кардинально изменится (постоянные и опросы сильно отличаются), так что вам придется отказаться от своей работы.

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

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