05.04.2014 PHP сортировка массива по значению - array_multisort 02.04.2014 Ошибка php undefined symbol php_json_encode 22.07.2013 Как открыть Excel файл с помощью PHP 29.02.2012 Как проверить пустой массив или нет? 29.02.2012 JQUERY: как вести логи действий пользователя 29.02.2012 PHP: Как через POST передать множественный SELECT 09.04.2011 Работа корзины 22.03.2011 Filter_var или проверка email, url, ip на соответсвие без использования регулярных выражений
#4

Как определить количество посетителей на сайте онлайн

PHP скрипт для определения количества посетителей на сайте онлайн.
Автор: А. Гречухин (http://atlanto.ru)


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

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

Преимущества.

Ему не нужна реляционная база данных, что согласитесь, в нашем Рунете (я имею в виду относительно бесплатную его часть), является несомненным преимуществом.

Опять же несомненным преимуществом является скорость. Я не поленился написать подобный скрипт с использованием БД и при помощи функции microtime() (в самом низу – результат ее работы – «Время генерации: …») измерил время выполнения:

Используя сессии – 0,7 мс

Используя БД – 14,2 мс

То есть преимущество в скорости – более чем в 19 раз! Вы можете сказать : «Тоже мне большое дело. Всего 13 мс разница», да они будут правы – а если посещаемость большая? Растет нагрузка на сервер и тогда действительно такое преимущество становится очевидным.

Еще одно преимущество – то, что информация в сессиях хранится пока не закрыт браузер или 1440 секунд (стоит по умолчанию в php.ini), в БД информацию о юзерах вам пришлось бы удалять вручную.

И последнее – простота, чтобы объявить сессию достаточно вызвать функцию session_start(), а чтобы настроить правильных образом БД нужно написать целых 15 строк кода.

Недостатки.

Нет детальной статистики – в сможете только узнать количество пользователей в данный момент, для ведения статистики (хиты, хосты…) придется все-таки работать с БД.

Нужен PHP4 – как это ни парадоксально – еще не все хостеры поставили себе PHP4.

Собственно скрипт:
  1. <?php
  2. session_start();
  3. define("MAX_IDLE_TIME", 3);
  4. function getOnlineUsers()
  5. {
  6.    if ( $directory_handle = opendir( session_save_path()))
  7.    {
  8.             $count = 0;
  9. 	    while ( false !== ( $file = readdir($directory_handle)))
  10. 	    {
  11. 		if($file != '.' && $file != '..')
  12. 		{
  13. 		      if(time()- fileatime(session_save_path() . '\\\\' . $file) < MAX_IDLE_TIME * 60) 
  14. 		      {
  15. 			  $count++;
  16. 		      }
  17. 		}
  18. 	    }
  19. 	    closedir($directory_handle);
  20. 	    return $count;
  21.     }
  22.     else 
  23.    {
  24.        return false;
  25.    }
  26. }
  27. echo 'Пользователей онлайн: ' . getOnlineUsers() . '';
  28. ?>

ЗАМЕЧАНИЕ: Если у вас нет специальной директории для хранения сессий, просто сразу первой строчкой добавьте:

  1. session_save_path("/path/to/custom/directory");


Теперь пройдемся по отдельным частям кода:

  1. session_start();


Следующая строка кода - это объявление некоторой константы, в течении которой пользователи будет считаться активными, то есть присутствующими в данный момент на сайте. В нашем примере - 180 секунд, то есть, если пользовательь не перешел на новую страницу или не перезагрузил эту в течении 3 минут, то он считается ушедшим с сайта и мы его уже не учитываем:

  1. define("MAX_IDLE_TIME", 3);


Теперь мы объявляем функцию getonlineuser() и сразу открываем "сессионную" директорию:
  1. function getOnlineUsers()
  2. {
  3.        if ( $directory_handle = opendir( session_save_path())) 
  4.        {
  5.    	//Далее идет часть кода, которая собственно и отвечает за подсчет пользователей, функция возвращает кол-во пользователей онлайн: 
  6.  
  7.    	$count = 0;
  8.    	while ( false !== ( $file = readdir($directory_handle))) 
  9.    	{
  10.    	      if($file != '.' && $file != '..')
  11.    	      { 
  12.    		  if(time()- fileatime(session_save_path() . '' . $file) < MAX_IDLE_TIME * 60) 
  13.    		  { 
  14.    		  $count++;
  15.    		  } 
  16.    	      }
  17.    	      closedir($directory_handle); 
  18.    	      return $count; 
  19.    	}
  20.        }
  21.        else 
  22.        {
  23.    	return false; 
  24.        } 
  25. }

И пожалуй, разумно будет вывод количества юзеров в конце:
  1. echo 'Онлайн юзеров: ' . getOnlineUsers() . '';

Все! Скрипт готов!

30.12.2010 PHP обработчик ошибок - php.ini error_reporting 17.12.2009 GDLib и php.ini, как проверить какие форматы поддерживает сервер: 22.03.2011 Засекаем время генерации страницы 22.03.2011 Как определить количество посетителей на сайте онлайн 16.12.2009 О картинках средствами PHP
О сайте