Артем Л.
11416 повідомлень
#15 років тому
Пишу небольшой чат. Посещаемость до 500 человек онлайн, шаред хостинг. Если нарастет больше то естественно буду думать о сервере.
Пока вопрос такой: как лучше оптимизировать нагрузки?
Используем PHP, mysql, jquery, json.
Демонов и memcached использовать возможности нет.

Общими усилиями пришли к такому алгоритму:

Раз в 2 секунды идут запросы от всех юзерей проверяя есть ли новые сообщения.
Делаем временный файл для хранения последнего ответа базы, обновляя его только при добавлении нового сообщения. Используем json.

Схема такая:
Считываем файл, отсылаем юзеру.

Добавление сообщения:
1. Сохраняем сообщение в базу
2. Делаем выборку последних 100 сообщений из нее
3. Сохраняем в файл

Примерно как-то так. Может подскажете как еще оптимизировать нагрузки?
Нужно именно уменьшить общую нагрузку, можно даже жертвуя скоростью.

Например можно тем кто уже в чате отдавать не все сообщения, а только добавленные за последние две секунды...
Заранее спасибо...
Сергей Шпак
596 повідомлень
#15 років тому
ИМХО : Логика неправильная, нужно смотреть сюда : , иными словами идет длинный ответ от сервера, в котором отсылаются изменения ...
зы : комета.
Алексей С.
115 повідомлень
#15 років тому
Цитата ("Hungry_Hunter"):
Делаем временный файл для хранения последнего ответа базы, обновляя его только при добавлении нового сообщения.

Можно попробовать делать HTML страницу, которую грузят пользователи при обновлениях чата. А на крон поставить каждых 2 секунды её перегенерация...

А скрипт добавление уже левым боком идёт.
Артем Л.
11416 повідомлень
#15 років тому
Цитата ("trueW3C"):
А на крон поставить каждых 2 секунды её перегенерация...

А если 5 минут никто ничего не пишет? Крон впустую будет трудится?
Алексей С.
115 повідомлень
#15 років тому
Ну перегенерация, если есть новые сообщения...
Или там в файл записывайте время последнего собщения, а крон его смотрит и думаешь что делать.
Евгений Б.
5330 повідомлень
#15 років тому
Цитата ("Hungry_Hunter"):
Если не считался - делаем выборку из базы последних 100 сообщений, отсылаем юзеру.

такого варианта быть не должно


итак.. у нас 2 файла...
1 - номер последнего сообщения
2- файл с текстом сообщений

зашел новичек, прочитал сразу номер последнего и файл с текстом
потом каждые 2 секунды читаем файл №1, сравниваем что есть у нас... "ого... сообщение №202382467, а мы только 202497246 прочитали последнее" читаем файл №2 и показываем его

минусы: обновление чата скачками
плюсы: нагрузка минимальная


вариант 2

скрипт, который в качестве ответа на передачу номера сообщения последнего выдает сообщения более новые или null (пустой ответ)

скрипт будут мучать 500 пользователей если раз в 2 секунды, то 250 запросов в секунду к нему.... скрипт может кстати делать все по 1-му варианту. тем самым мы на jquery делаем простую логику. таймер на 2 секунды, запрос данных, в первой строке номер сообщения последнего, в остальных html код сообщений (с никами и т.д.) ну или xml генерировать и самому разбирать потом на стороне клиента.
Максим Б.
2206 повідомлень
#15 років тому
Вообще, эти псевдо-рилтайм чаты на PHP пережитки прошлого.
Артем Л.
11416 повідомлень
#15 років тому
ArtPro, спасибо за подробный ответ.
Pixorama, а что по Вашему не пережиток прошлого?
Максим Б.
2206 повідомлень
#15 років тому
Цитата ("Hungry_Hunter"):
Pixorama, а что по Вашему не пережиток прошлого?


Ну к примеру технология Stratus от Adobe -
Можно использовать как для видео-чатов, так и для обычных. Основная фича этой технологии, как раз в оптимизации нагрузки. Т.е. помимо p2p, поддерживаются так называемые Net groups. Т.е. можно делать мультикастовые рассылки от клиента к клиенту, что значительно снижает нагрузки на сервер.
Андрей К.
1172 повідомлення
#15 років тому
А кроме Adobe больше предложить нечего?
Максим Б.
2206 повідомлень
#15 років тому
Lisio, технологий полно. Яндекс знает кучу вариантов по запросу "Socket server".
Роман Беляев
16382 повідомлення
#15 років тому
Hungry_Hunter, знакомая какая-то схема

Цитата:
1. Сохраняем сообщение в базу
2. Делаем выборку последних 100 сообщений из нее
3. Сохраняем в файл


Смущает хранение такого количества сообщений в файлике. Это его вес... Да и база особо ни к чему... можно попробовать вообще все в файлах хранить. В конце концов тут то никаких выборок сложных и сортировки нет, только выборка последних сообщений и добавление "в хвост". В файлах храним по тех же 100 сообщений, именами файлов идентифицируем что получено пользователем, что нет. Пользователь загружает последний файл с сообщениями или тот который был загружен (там могут быть обновляения) +1.
Соответственно меньше сообщений в файлах - больше файлов, но меньше трафик. Логи все уже в файлах.
Евгений Б.
5330 повідомлень
#15 років тому
На хостинге с тупо php +sql особо не развернешься.
если бы стоял вопрос постановке чата на более продвинутом серванте, то и php в сокет сервер запихнуть можно.. вон битрикс в КП jabber сервер намутила на php
Роман Беляев
16382 повідомлення
#15 років тому
Еще можно посмотреть в сторону работы со сжатием. "Полные" файлы можно сжимать, хранить сжатыми и сжатыми же отправлять.
Андрей К.
1172 повідомлення
#15 років тому
Pixorama, есть конкретная? В гугл все посылать горазды. Только учтите, что должно работать на типовом shared'е.
Станислав Малкин
1410 повідомлень
#15 років тому
Шаред хостинг для чата в 500 человек в онлайне - это как? Пытаемся на каменной доске летать, как на звездолете?
Роман Беляев
16382 повідомлення
#15 років тому
Цитата ("ArtLab"):
Пытаемся на каменной доске летать, как на звездолете?


Ну вон самолеты тяжелее воздуха и ничо - летают

По теме. Еще подумалось, что можно попробовать контролировать обновление документов просто запросом заголовков, без самих файлов. Должно быть еще легче. Тогда можно поднять скорость обновления. Но это из раздела "чув звін".
Максим Б.
2206 повідомлень
#15 років тому
Цитата ("Lisio"):
Pixorama, есть конкретная? В гугл все посылать горазды. Только учтите, что должно работать на типовом shared'е.


Я же говорю, полно. На вскидку Ну или опять же можно те же медиа-сервера использовать, Red5, Wowza, FMS.
Артем Л.
11416 повідомлень
#15 років тому
Цитата ("ArtLab"):
Шаред хостинг для чата в 500 человек в онлайне - это как? Пытаемся на каменной доске летать, как на звездолете?

Ага, пытаемся хостинг вроде мощный, нагрузку мне большую достаточно разрешает... По крайней мере 100К посетителей в день держит со всех сайтов и ни капельки не напрягается...
Ну 500 это предел, если достигнет такой отметки, буду думать о сервере...

Цитата ("frig"):
Ну вон самолеты тяжелее воздуха и ничо - летают

Вот вот, именно
Андрей К.
1172 повідомлення
#15 років тому
Цитата ("Pixorama"):
Я же говорю, полно. На вскидку Ну или опять же можно те же медиа-сервера использовать, Red5, Wowza, FMS.

ElectroServer 4 is a premier Flash Media Server alternative.

Опять флэш? Как будто кроме него ничего нет )))