И так, сразу определимся что наш счетчик будет уметь и делать. В этой статье я решил написать ту часть, которая не совсем то и счетчик(о нем я напишу в следующий раз), а скорее скрипт, показывающий кто онлайн. Скрипт будет показывать сколько гостей и сколько пользователей, прошедших авторизацию онлайн.
Так как мы не можем вести контроль в режиме реального времени, нам надо определится в течении какого времени счетчик будет считать пользователя онлайн. Я взял 10 минут...
<?php time_on_line = 10;?>
теперь надо подумать о том куда мы будем писать временную информацию. Можно было бы использовать базы данных, но для такой задачи это по меньшей мере не разумно. По-этому мы будем писать в файл. Допустим наш файл для счетчика пользователей онлайн будет называться online.da.
<?php $path = 'online.da';?>
Теперь код с подробными комментами
<?php
$time_on_line = 10;
$path = 'online.da';
//два массива, для гостей и пользователей
$users = array();
$guests = array();
//если файл уже создан, читаем с него инфу
if (file_exists($path) && is_readable($path)) {
//инфа хранится в сериализованном виде(таким образом можно превратить масив в строку)
$data = unserialize(file_get_contents($path));
//теперь мы присваиваем объявленным нами выше массивам данные из файла
$users = (!empty($data['users'])) ? $data['users'] : array();
$guests = (!empty($data['guests'])) ? $data['guests'] : array();
}
//следующие два цикла удаляют из списка онлайн тех кто отсуцтвовал более 10мин.
//поясню: данные у нас хранятся в массивах, где ключ это ID пользователя или IP гостя, а значение это время до которого он будет считаться онлайн
foreach ($users as $key => $user) {
if ($user < time()) unset($users[$key]);
}
foreach ($guests as $key => $guest) {
if ($guest < time()) unset($guests[$key]);
}
//это типо авторизованный юзер
if (!empty($_SESSION['user']['id'])) {
$users[$_SESSION['user']['id']] = time() + $time_on_line * 60);
} else {
//а это гость. $_SERVER['REMOTE_ADDR'] содержит IP адрес
$guests[$_SERVER['REMOTE_ADDR']] = time() + $time_on_line * 60);
}
//теперь сериализуем(превращаем в строку) данные и сохраняем
file_put_contents($path, serialize(array('users' => $users, 'guests' => $guests)));
?>
это что касается части подсчета и сохранения. а как же выводить данные? Далее я об этом и расскажу. В теории нам надо открыть файл счетчика, считать данные и затем преобразовать их в нужный нам вид. После этого мы можем вывести их на страницы сайта и любоваться. Тут все гениально просто, так что я сразу приведу код данной части счетчика посещений с подробными комментами.
<?php
$path = 'online.dat';
$users = 0;
$quests = 0;
//проверяем есть ли и доступен ли файл счетчика
if (file_exists($path) && is_readable($path)) {
//десериализуем. После этого данные будут в виде массива
$data = unserialize(file_get_contents($path));
//считаем количество гостей и юзеров и присваиваем значения переменным
$users = count($data['users']);
$quests = count($data['guests']);
}
//теперь переменные $users и $quests содержат количество соответствующих человеческих единиц онлайн:)
?>
Вот и весь счетчик, не требующий базы данных. Теперь можно просто выводить данные. Как по отдельности, так и суммировать их, например, чтобы показать общее число людишек онлайн.