Скрипт, отображающий количество посетителей
находящихся на сайте в данный момент
Любому вебмастеру наверняка бывает интересно, сколько посетителей находится на его сайте в определенный момент времени, но не всегда хочется ставить сторонние счетчики.
Предлагаем Вам установить на свой сайт простой PHP скрипт, позволяющий посчитать количество посетителей онлайн. Особенностью данного скрипта является то, что он не использует базу MySQL.
Для подсчета количества уникальных посетителей, находящихся на Вашем сайте в данный момент времени, Вам необходимо вставить в самое начало содержимого Вашей странички следующий PHP код:
<?php
session_start();
//выделяем уникальный идентификатор сессии
$id = session_id();
if ($id!="") {
//текущее время
$CurrentTime = time();
//через какое время сессии удаляются
$LastTime = time() - 600;
//файл, в котором храним идентификаторы и время
$base = "session.txt";
$file = file($base);
$k = 0;
for ($i = 0; $i < sizeof($file); $i++) {
$line = explode("|", $file[$i]);
if ($line[1] > $LastTime) {
$ResFile[$k] = $file[$i];
$k++;
}
}
for ($i = 0; $i<sizeof($ResFile); $i++) {
$line = explode("|", $ResFile[$i]);
if ($line[0]==$id) {
$line[1] = trim($CurrentTime)."\n";
$is_sid_in_file = 1;
}
$line = implode("|", $line); $ResFile[$i] = $line;
}
$fp = fopen($base, "w");
for ($i = 0; $i<sizeof($ResFile); $i++) { fputs($fp, $ResFile[$i]); }
fclose($fp);
if (!$is_sid_in_file) {
$fp = fopen($base, "a-");
$line = $id."|".$CurrentTime."\n";
fputs($fp, $line);
fclose($fp);
}
}
?>
Принцип работы данного скрипта довольно прост.
У каждого посетителя есть свой идентификатор сессии session_id(). При заходе на сайт мы выделяем этот идентификатор и ищем его в нашей базе (в нашем случае это файл session.txt в корне сайта). Если такого идентификатора сессии нет, то помещаем его в наш текстовый файл, дополнительно записав текущее время через разделитель "|".
После обновления страницы пользователем мы вновь выделяем идентификатор сессии, проверяем его наличие в файле session.txt. Если такого идентификатор сессии нет, то добавляем, если есть - обновляем время (заменяем на текущее время).
<?php
. . .
$base = "session.txt";
. . .
?>
Далее просматриваем все записи в файле session.txt и удаляем те, у которых разница с текущим временем составляет больше 10 минут (или 600 секунд). Данный интервал времени можно изменить на свое усмотрение, изменив значение в строке:
<?php
. . .
$LastTime = time() - 600;
. . .
?>
Для вывода в нужном месте информации о количестве посетителей, находящихся в данный момент на Вашем сайте, используйте следующий код:
<?php
echo "Сейчас на сайте: <b>".sizeof(file($base))."</b>";
?>
Для нормальной работы данного скрипта необходимо чтобы Ваш хостинг поддерживал использование сессий!
Данный скрипт долгое время функционировал и на данном сайте, но в дальнейшем был переведен на работу с MySQL. Пример работы аналогичного скрипта Вы можете наблюдать в верхней части правой колонки нашего сайта над меню.
Перед публикацией все комментарии проходят обязательную модерацию!
Если Вы хотите задать какой-либо вопрос, то сделайте это на нашем форуме.
Таким образом, Вы сможете быстрее получить ответ на интересующий Вас вопрос.
+1 от меня :)
Подскажите, пожалуйста, в чём косяк? Неужели это конфликт скриптов?
session_start();
echo session_id();
Скопируйте код целиком еще раз.
Может, в настройках PHP надо что-то подкрутить?
В настройках файла php.ini должно быть следующее:
register_globals = On
session.use_cookies = 1
session.use_trans_sid = 0
Так же включите прием cookies Вашим браузером.
Дальнейшее обсуждение Вашей проблемы перенес на форум - Скрипт, отображающий количество посетителей онлайн
P.S. Вот ещё вопросик как поставить надпись "Сейчас на сайте:" в правый верхний угол сайта, а то у меня пишет прямо по центру некрасиво как то...
Как сделать как у Вас, например, чтоб на одном уровне были слева часы, а справа кто онлайн?
echo "Сейчас на сайте: <b>".sizeof(file($base))."</b>";
на такие:
echo "<table border='0' width='100%'><tr><td align='left'>Тут часы</td><td>Тут что-угодно в центре</td>";
echo "<td align='right'><font color='red'>Сейчас на сайте: </font><b>".sizeof(file($base))."</b></td></tr></table>";
2014-04-12 20:39:16: (mod_fastcgi.c.2676) FastCGI-stderr: PHP Notice: Undefined variable: ResFile in /var/www/index.php on line 24
PHP Notice: Undefined variable: ResFile in /var/www/index.php on line 33
PHP Notice: Undefined variable: is_sid_in_file in /var/www/index.php on line 35
Подскажите, пожалуйста, почему так происходит и возможно ли это исправить?
Прошлые ошибки не возникают, но в логах маячит вот эта строчка:
2014-04-13 14:01:13: (mod_fastcgi.c.2676) FastCGI-stderr: PHP Notice: Uninitialized string offset: 0 in /var/www/index.php on line 27
Может всё-таки мне нужно поправить конфигурацию PHP? Потому что на сервере хостинга у меня ошибок с Вашим скриптом не возникало, а сейчас сайт крутиться на локальном сервере.
К примеру, уровень error_reporting = E_ALL & ~E_NOTICE позволяет выводить все ошибки, за исключением замечаний.
Подскажите, пожалуйста, куда вставить блокировку flock($fp, LOCK_EX); и flock($fp, LOCK_UN);?
Заранее спасибо.
A PHP Error was encountered
Severity: Warning
Message: file(base) [function.file]: failed to open stream: No such file or directory
Filename: views/rightblok_view.php
Line Number: 17
Строка 17 имеет вид: echo "Сейчас на сайте: <b>".sizeof(file('base'))."</b>";
Подскажите плиз как исправить заранее спасибо!
Спасибо за подсказку, смог решить проблему сделав так :) надеюсь это верно и будет работать
<?php
$base = "session.txt";
echo "Сейчас на сайте: <b>".sizeof(file($base))."</b>";
?>
Но появились еще вопросы: пишу на сервере denwer как проверить количество посещений?
И второе: когда получаю ( Сейчас на сайте: 16 ) и закрываю Браузер число не меняется, помогает только перезагрузка сервера это так должно быть?
Заранее Огромное спасибо!!!
Warning: file() [function.file]: Filename cannot be empty in силка на страничку on line 112
Сейчас на сайте: 1
Не совсем красиво смотрится, а что делать я не знаю =(
Похожая проблема. Если отображение в том же файле, все ОК, если выводить отдельным файлом, то:
Warning: file() [function.file]: Filename cannot be empty in W:\home\shoppppinng\www\seeList.php on line 3
Сейчас на сайте: 1
и количество не меняется.
Для отображения в отдельном файле, в частности встроил в "Скрипт ведения логов посещения сайта", писать в таком виде:
<?php
$base = "session.txt";
echo "Sejchas na sajte: <b>".sizeof(file($base))."</b>";
?>
Так можно? Спасибо!
flock($fp, LOCK_EX); и flock($fp, LOCK_UN); Понятно, что в начале открытия файла и закрытия, но выдается ошибка. Вставлять до и после последней скобки? И стоит ли добавлять другие строчки из темы "Блокировка файлов от записи на PHP."
на if (sizeof(file($base))>0) echo "Онлайн: <b>".sizeof(file($base))."</b>";
А вообще непонятно для чего это нужно, т.к. если на сайте 0 человек, то этого никто и не увидит.
Решение вот это не помогает: попробуйте переместить строку <?php session_start(); ?> в самое начало Вашей странички до вывода каких-либо данных на экран. А лучше сделайте самой первой строкой файла.
Вопрос: что я неправильно делаю и как это исправить?
Все работает, если только файл index.php, а в файле с расширением index.html ошибка. Поможете? На текущее время не так силен в web-программировании.
Тогда файлы с расширением .html будут обрабатываться как .php.
Т.е., если посетитель зашёл на главную страницу сайта, его записало в файл базы, я это вижу. Прошло 15 минут, к примеру, и больше посетителей нет. И скрипт же не запускается, чтобы проверить прошло 10 минут или нет.
Как можно исправить такое? Т.е. если у меня в течение часа был всего один посетитель, то он так и будет висеть в таблице "За последние 10 минут", хотя он был на сайте пол часа назад, к примеру.
Тут нужен ещё один скрипт наверно, который поставить на крон, чтобы тот проверял каждую минуту, например, если от записи N-ой строки прошло больше 10 минут, то строку удаляем.
Предложите свой вариант?
$LastTime = time() - 600;
$base = "session.txt";
$file = file($base);
$k = 0;
for ($i = 0; $i < sizeof($file); $i++) {
$line = explode("|", $file[$i]);
if ($line[1] > $LastTime) { $ResFile[$k] = $file[$i]; $k++; }
}
$fp = fopen($base, "w");
for ($i = 0; $i<sizeof($ResFile); $i++) { fputs($fp, $ResFile[$i]); }
fclose($fp);
Таким образом, каждый раз при обновлении странички панели управления сайта будут удаляться все старые записи в базе, и Вы будете видеть актуальное количество посетителей.
Скажите, а как сделать так, чтобы количество онлайн посетителей отображалось только на определённой странице, а не на всех?
К примеру, в админке сайта, которая лежит в другой папке.
echo "Сейчас на сайте: <b>".sizeof(file($base))."</b>";
Следовательно, данную строчку Вам нужно добавить только в админке, где вместо $base нужно указать файл, в котором хранятся идентификаторы и время посетителей.
Лучший скрипт со всего интернета!!! Много перелопатил. Только Ваш выбрал. Один только момент... Добавил вышеуказанный код по обновлению админки и очищение файла сессий, так вот не удаляет. Вроде по времени удаляет, но при обновлении не удаляет. Подскажите, пожалуйста, в чём может быть дело?
Спасибо!
Благодарю за классный скрипт!
Я заметил, что у Вас в статистике сайта есть такая фишка:
Статистика обновлена 03 мин. 10 сек. назад. Следующее обновление через 06 мин. 50 сек.
Подскажите, где можно такой взять скрипт, чтобы знать, когда следующее обновление посетителей сайта online?
Просто добавил вывод на экран разницы между текущим и временем обновления файла.
У меня никак не получается вывести время отсчёта на экран. Подскажите, пожалуйста, как у Вас это получилось.
Спасибо!
С чем связано, что при обновлении страницы добавляется +1 пользователь?
Я реализовал немного иначе, чтобы каждый раз не вставлять этот код, просто создал функцию и записал ее в файл со всеми функциями. И как подобает функции в конце вывел return. То есть перед последней фигурной скобкой (перед концом функции): return sizeof(file($base));
И чтобы не мучатся добавлять функцию на каждой странице, вставил ее в файл с коннектом с БД. А уже в месте, где нужно указать количество посетителей вывел: echo name_function();
P.S. также, необходимо указать не просто название файла "session.txt", а полный путь, чтобы потом не было проблем, если посетитель зайдет с другой страницы. Так что строчку $base = "session.txt"; заменить на: $base = $_SERVER["DOCUMENT_ROOT"] . "session.txt";
Я добавил счётчик в отдельный файл php и на странице сделал обновление через... Перенесено на форум
На PHP 7.1 работает, на новых не работает
"sizeof():Parameter must be an array or an object that implements Countable in"
Понимаю, что надо дать массив или объект, но в PHP не силён. Не подскажете, что где изменить?