Хитрый счетчик "онлайна на сайте"
Рубрика: Мелкие заметки на тему Yii
9 Фев. 2010Заказали мне в общем сделать на сайте элемент, который информировал бы о кол-ве людей на сайте. Некий счетчик живого онлайна. Первым делом в голову пришла идея с использованием БД, затем использовать куки/сессии. Заказчик не в чем меня не ограничивал, просил только реализовать все побыстрее — так я и сделал...
---Данный способ не претендует на Нобелевскую премию, а лишь показывает еще один из способов реализации счетчика «живого онлайна». На моем блоге уже достаточно давно живет счетчик статистики от hit.ua (не реклама). Он достаточно удобен, в живом времени показывает кол-во людей на сайте, да и статистика там не плохая (ядро сайта, активные и тп).
Я подумал, раз этот сервис сам по себе получает кол-во моих посетителей на данный момент — то было бы удобно просто подрубится к нему и транслировать эту цифру у себя на странице. Я перешел на страницу своей статистики (открытая страница) http://hit.ua/site_view/13276 и начал анализировать код. Соглашусь с вами, весьма наглый подход :
ВАЖНО!! Цифры 13276 — это id моего блога в системе hit.ua; для вашего сайта — этот номер будет другим. После регистрации в hit.ua вы сможете увидеть этот номер посмотрев на url страницы на которой находитесь.
Включив фаербаг я понял что hit.ua для поддержания актуальных данных на этой странице — каждую секунду посылает GET запрос на страницу http://hit.ua/stat?i=13276 и получает в ответ:
>> 223,211,21,14
Если на странице статистики 4 динамических поля (хосты, посетители, хиты, онлайн на сайте), то не тяжело догадаться что означают эти цифры и в каком порядке они идут. Обнаружив страницу http://hit.ua/stat?i=13276 я в два раза облегчил себе жизнь: во-первых мне не придется парсить главную страницу статистики и откидывать оттуда лишний код; во-вторых эта страничка очень мало весит и не жрет много трафика.
Пишем простой парсер:
// открываем страницу статистики
$handle = fopen("http://hit.ua/stat?i=27441", "rb");
// получаем все данные
$contents = stream_get_contents($handle);
// удаляем из памяти ссылку на файл
fclose($handle);
// разбиваем полученые данные на ячейки (запятая - разделитель)
$arr = explode(",", $contents);
// переменная онлайна
$online = (!empty($arr)) ? $arr[3] : 0;
Ну вот и все. Теперь переменную $online передаем в отображение и вуаля — на странице получаем кол-во онлайна.
Каждую перезагрузку страницы — будут браться новые данные с hit.ua и транслироваться на ваш сайт. Если хотите что бы данные динамически обновлялись каждые N секунд – используйте для этого javascript/jquery.
ВАЖНО!! Если сайт hit.ua перестанет работать - статистика онлайна на вашем сайте перестанет отображаться. Сам я лично еще не замечал что б этот сайт перестал работать, но на всякий случай предупреждаю.
п.с. Если не получится с динамическим обновлением без перезагрузки страницы — пишите в комментариях, покажу как.
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- С момента публикации моей прошлой статьи прошел практически месяц. Я очень рад что многие из моих читателей подключились в процесс ... "#02 : Обзор"
- Как часто в проектах вы сталкиваетесь с загрузкой картинок? Если в своей работе вы используете thumb-pics (уменьшенные картинки) — тогда ... "Обзор дополнения EasyPhpThumb"
- Раздел "Документации" был пополнен интересной заметкой. Пользователь Sebastián Thierer предоставил так называемую "шпаргалку" по часто используемым методам и приёмам ... "Yii Шпаргалка"

[guest] mihdan
Было сказано: Вторник, 09 Февраль 2010
Позволил себе запостить вашу статью в мой блог с указанием источника. Надеюсь вы не против.
http://kobzarev.com/programming/creating-a-counter-online-in-site.html

[adm] zolter
Было сказано: Среда, 10 Февраль 2010
Вот пример сайта на котором успешно работает данный подход - pijama.ru

[guest] Гость
Было сказано: Четверг, 18 Февраль 2010
Интересно, что покажет бенчмарк этой части кода. Установление соединения с удаленным хостом занимает немало времени.
Зашел на ваш сайт посмотреть новости по фреймворку, пока на php не пишу, интереса ради попробую ваш способ как будет возможность.:)

[guest] Гость
Было сказано: Четверг, 18 Февраль 2010
Я бы не выводил статистику онлайн при генерации страницы, а выводил её с помощью AJAX запроса после генерации страницы у пользователя. (+ тут же как вы и написали можно сделать обновление). Таким образом пользователь будет получать основной контент максимально быстро, и тогда уже можно себе позволить такую хитрость, как установление соединения с удаленным хостом, через ваш скрипт или напрямую :)
Ваша идея интересна, быстро реализуется, спасибо что поделились :)

[guest] Гость
Было сказано: Четверг, 18 Февраль 2010
Прошу прощения, поправлю себя, напрямую стандартным XMLHTTPRequest ведь сделать запрос к стороннему домену нельзя, только через скрипт-прокси на текущем домене :)

[guest] Не специалист
Было сказано: Среда, 01 Декабрь 2010
я не специалист :( - как "Теперь переменную $online передаем..." ? - вы не могли бы привести пример самодостаточного кода для "не специалиста" - что-куда методом копипейст :) ?

[guest] zolter
Было сказано: Среда, 01 Декабрь 2010
Если вы хотите делать вывод онлайна на всех страницах сайта - тогда просто прямо в лаяуте можете написать этот код, и в конце добавить:
echo $online;


