Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Пишу сайт с элементами социальной сети

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
psevdo
Отправлено: 18 Ноября, 2013 - 19:19:14
Post Id



Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Здравствуйте. Пишу сайт с элементами социальной сети. В настоящее время у пользователей имеется возможность обмениваться личными сообщениями. Так вот сейчас нужно сигнализировать пользователю о поступлении ему нового сообщения. Как это лучше сделать? Делать ajax-запросы или есть какой то другой способ? Как например это реализуется в социалках?
 
 Top
tato
Отправлено: 19 Ноября, 2013 - 01:45:29
Post Id



Посетитель


Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011  
Откуда: Владивосток


Помог: 8 раз(а)




Вариантов много AJAX, Soket.IO, node.js, RabbitMQ
Все зависит от желания


-----
просто ?: сложно
 
 Top
psevdo
Отправлено: 19 Ноября, 2013 - 07:47:23
Post Id



Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Нашел вот такую статью http://www[dot]ibm[dot]com/developerwork[dot][dot][dot]ndex[dot]html#N101FA .
Заинтересовал вариант long polling. Только вот один момент пока не ясен:
Цитата:
В файлах для загрузки папка comet-long-polling содержит пример Web-приложения со ждущим запросом, которое можно выполнить с помощью команды mvn jetty:run.


Что такое mvn?
 
 Top
_Dark_
Отправлено: 19 Ноября, 2013 - 10:43:34
Post Id


Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011  


Помог: 5 раз(а)

[+]


Я тоже в будущем собираюсь использовать мгновенные уведомления, но у меня есть идея сделать это в nodeJS и связать через Redis.
Таким образом для уведомлений будет использоваться отдельный сервер, работа с которым будет происходить через сокеты.

Но: если у вам не критична небольшая задержка и у вас нет 1000+ пользователей в онлайн — используйте Ajax, проверяйте новые сообщения каждые, например, 10 секунд.
Я считаю, что этого вполне хватит.

(Отредактировано автором: 19 Ноября, 2013 - 10:50:54)

 
 Top
psevdo
Отправлено: 19 Ноября, 2013 - 11:08:05
Post Id



Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




_Dark_ пишет:
Я тоже в будущем собираюсь использовать мгновенные уведомления, но у меня есть идея сделать это в nodeJS и связать через Redis.
Таким образом для уведомлений будет использоваться отдельный сервер, работа с которым будет происходить через сокеты.

Но: если у вам не критична небольшая задержка и у вас нет 1000+ пользователей в онлайн — используйте Ajax, проверяйте новые сообщения каждые, например, 10 секунд.
Я считаю, что этого вполне хватит.


Пытаюсь сейчас все переосмыслить. Правильно ли я понял? Чтобы заюзать мгновенные сообщения, нужен будет отдельный физический сервер.
 
 Top
caballero
Отправлено: 19 Ноября, 2013 - 11:14:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




не обязательно физический - это может быть и виртуальный - он дешевле


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
psevdo
Отправлено: 19 Ноября, 2013 - 11:33:15
Post Id



Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




caballero пишет:
не обязательно физический - это может быть и виртуальный - он дешевле


Нужно будет купить у хостера две площадки со своими тарифами? Я правильно понял?
 
 Top
esterio
Отправлено: 19 Ноября, 2013 - 11:44:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




psevdo пишет:
Нужно будет купить у хостера две площадки со своими тарифами? Я правильно понял?

Зачем две
_Dark_ пишет:
Я тоже в будущем собираюсь использовать мгновенные уведомления, но у меня есть идея сделать это в nodeJS и связать через Redis.

Как раз стоит такая же задача. И решаю именно таким способом
 
 Top
psevdo
Отправлено: 19 Ноября, 2013 - 11:54:04
Post Id



Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




esterio пишет:
psevdo пишет:
Нужно будет купить у хостера две площадки со своими тарифами? Я правильно понял?

Зачем две


Что то я запутался. Можете по подробнее объяснить как это будет стыковаться?
 
 Top
esterio
Отправлено: 19 Ноября, 2013 - 12:00:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




все просто. Через PHP публикуем сообщение на редис. В NodeJS подписиваемся на сообщения от редиса. Если поступило - шлем его клиенту.
Что нужно учесть:
1. открывать соединение нужно только в одной вкладке иначе можно упереться в лимит одновременных конектов в браузере(де и не хорошо). Остальные же слушают LocalStorage собитие onstorage
2. нужно хранить инденификаторы сессий в redis чтобы знать кому именно слать сообщение из nodejs
 
 Top
psevdo
Отправлено: 19 Ноября, 2013 - 12:11:24
Post Id



Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Прочитал, что Редис - это шустрая СУБД. Обычно в приложениях используется мускул. Я так думаю можно использовать и две СУБД. Критичные к скорости обновления данных для клиента хранить а Редис, а все остальное в мускуле. Так мона?
 
 Top
esterio
Отправлено: 19 Ноября, 2013 - 12:21:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Вы понимаете разницу между SQL и NoSQL? Если нет, то может Вам еще рано такое делать
 
 Top
_Dark_
Отправлено: 19 Ноября, 2013 - 12:31:57
Post Id


Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011  


Помог: 5 раз(а)

[+]


psevdo пишет:
Пытаюсь сейчас все переосмыслить. Правильно ли я понял? Чтобы заюзать мгновенные сообщения, нужен будет отдельный физический сервер.

Не совсем. Я имел в виду веб-сервер Apache для самого сайта и nodeJS для рассылки уведомлений, они могут быть на одном физическом (виртуальном) сервере.

Дело вот в чем: nodeJS специально разработан для поддержания огромного количества открытых соединений, используя при этом минимум ресурсов.

Основной смысл: у вас будут две связки:
Apache (Nginx) + MySQL + PHP — для сайта
nodeJS — система уведомлений

Обе связки подключены к Redis — быстрому хранилищу данных, которое как нельзя лучше подходит для этой цели (читайте ниже почему).

Клиент (пользователь) при загрузке страницы соединяется с nodeJS сервером (есть отличная библиотека socket.io, которая позволяет в практически любом браузере реализовать поддержку сокетов) и ждет уведомлений.

Как это работает:
в Redis есть система pub/sub — publish / subscribe. Это система событий в Redis.
Когда у вас на сайте, на стороне PHP, происходит какое-либо событие, например, пользователь отправил другому пользователю сообщение, то PHP публикует запись в Redis.
nodeJS мгновенно получает эту запись (наше уведомление) и отправляет клиенту.
Все это происходит очень и очень быстро, это не займет больше секунды, если у клиента, конечно, стабильное интернет-соединение. Это вообще произойдет быстрее, чем завершится работа PHP скрипта, т.к. запись в Redis будет отправлена во время работы скрипта, а не после его завершения.

Почему нельзя это сделать на PHP
Это можно реализовать без всяких дополнительных инструментов, используя, например, Ajax или технологию long-polling.

Ajax не особо подходит по нескольким причинам:
    Проверять каждую секунду сервер неприемлемо, т.к. это создаст большую нагрузку (100 активных пользователей — 100+ запросов к серверу каждую секунду = 100+ запросов к MySQL для проверки новых уведомлений)
    Это медленно. Т.к. каждую секунду проверять сервер мы не можем, нам придется устанавливать разумный интервал, например, 10 секунд. Если вы создаете систему мгновенных сообщений, это не подходит.

Теперь о long-poll.

Если кратко, то система работает так:
браузер делает запрос к серверу, который НЕ закрывается до тех пор, пока не произойдет какое-либо событие на сервере.
Пояснение:
вы открыли страницу сайта. JS код делает GET Ajax запрос к серверу, а сервер держит этот запрос открытым до тех пор, пока ему не нужно будет что-то ответить, в нашем случае — отправить уведомление. То есть: соединение держится открытым до тех пор, пока не потребуется отправить уведомление.

Реализовать это вполне можно на PHP, но дело в том, что Apache не предназначен для такого. Множество открытых соединений быстро приведут к повышенному потреблению памяти, а в перспективе и к нестабильной работе всего сайта. Да и сам PHP не рассчитан на такое, его дело — генерация страницы, а не работа в режиме ожидания чего-то.


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

(Отредактировано автором: 19 Ноября, 2013 - 12:47:47)

 
 Top
psevdo
Отправлено: 19 Ноября, 2013 - 12:41:35
Post Id



Гость


Покинул форум
Сообщений всего: 101
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




esterio пишет:
Вы понимаете разницу между SQL и NoSQL? Если нет, то может Вам еще рано такое делать


Знаю что одна реляционная, а другая нет. А вот как это использовать с пользой пока не понял.
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Ноября, 2013 - 12:49:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Я в свое время делал подобные финты и мне хватало nginx push http module.
Не надо никаких редисов, никаких нод, за публикацией следит сам nginx.

http://highload.com.ua/index.php/2010/07/21/используем-nginx-как-long-polling-comet-сервер/
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB