Я ищу простой (без базы данных) метод перечисления количества пользователей на веб-сайте. Самый простой способ, который я могу придумать, – подсчитать количество открытых сеансов.
Этот код должен работать:
$number_of_users = count(scandir(ini_get("session.save_path")));
Конечно, это не будет из-за ограничений безопасности в этом каталоге (как и должно быть!). Кто-нибудь знает другой способ доступа к этому номеру без изменения прав доступа к каталогу.
Примечание. Я ищу вариант, который не включает базы данных или снижает безопасность на сеансах PHP.
End Note: для тех, кто подходит к этому вопросу, я закончил использование cronjob (работает каждую минуту) из корня, который сделал что-то похожее:
ls /var/lib/php5/ | wc -l > /var/www/sessioncount
Убедитесь, что файл /var/www/sessioncount
читается пользователем apache. Затем вы можете просто прочитать файл в PHP:
$number_of_users = file_get_contents("/var/www/sessioncount");
В этом случае Easy не означает отсутствие базы данных. Также полагаться на сеанс, чтобы увидеть, сколько пользователей активны, не является надежным.
Если вы хотите пройти этот маршрут, вы можете сделать cronjob, который запускается безопасным процессом каждые несколько минут и сохраняет этот счет в файл или db, который читает PHP.
Но я рекомендую перейти на маршрут базы данных.
<? // you must set your own accessible session path atop every page. session_save_path("/home/some/other/location/"); # SECURITY VIOLATION!!! session_start(); function session_count() { $filter = "sess_"; $files = scandir(session_save_path()); $count = 0; foreach ($files as $file) { if(strpos($file,$filter)===0) { $count += 1; } } return $count; } echo session_count(); ?>
Ради решения этого для кого-то еще, здесь. Соберите код по порядку и используйте направления в пути. Требуется расширение GD для PHP.
Создайте каталог в своем веб-браузере, убедитесь, что веб-демон может написать ему:
mkdir liveusers
Создайте PHP-скрипт (например, vlive.php ) для сенсорного кода (btw. Touch – это стандартная команда * nix, используйте функции system (), passthru () или exec (), которые вы хотите использовать). Прикоснитесь к файлу в этом каталоге с уникальным именем файла, например, IP + SessionID concat'd вместе:
<?php exec("touch ". $_SERVER['DOCUMENT_ROOT']."/liveusers/". md5($_SERVER['REMOTE_ADDR'].session_id())); /* SECURITY RISK */
Теперь, в том же файле, нам нужно вывести JPEG, чтобы закончить его с правильным заголовком (). Я помещаю пиксель размером 1×1 с именем pixel.jpg в каталог webroot / images / , не стесняйтесь делать что-то еще:
$NewImage = imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT']. "/images/pixel.jpg"); header("Content-type: image/jpeg"); imagejpeg($NewImage); ?>
Сохраните файл PHP, а затем поместите в свой стандартный HTML-тег, чтобы он был полезен:
<img src="/vlive.php" alt="Imagination!" />
Исходя из чистого PHP с помощью этих страниц кэширования, вы просто сделаете так, чтобы файлы в реальном времени почти никогда не касались друг друга. Делая это, вы все равно можете подсчитывать «живых» пользователей и использовать полнофункциональную систему кеша на вашем сайте.
Итак, теперь каждая страница, которую посетитель загружает, затрагивает свой уникальный файл, поэтому, если они только недавно приходят, команда touch создаст файл для этого пользователя, если они посещают другие страницы, он отредактирует дату доступа с тем же нажатием команда.
Здесь он становится полезным:
В другом PHP-скрипте (скажем, readvlive.php ):
<?php $livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l"); echo "Live Visitors: ". $livenum; ?>
Теперь давайте добавим этот фрагмент в HTML-элемент, который вы хотите увидеть:
<?php include($_SERVER['DOCUMENT_ROOT']. "/readvlive.php"); ?>
Итак, теперь у нас есть файл, который будет распечатывать количество уникальных файлов со временем доступа, измененным только 10 минут назад. Это наши живые пользователи за последние десять минут …
Теперь у нас есть выбор, опять же, если вы используете полноэкранный кеш, вы можете заморозить кэшированное живое число в эти документы, что делает его довольно раздражающим и бесполезным. Для этого я предлагаю PrototypeJS (Google it), вы используете свои фантастические инструменты AJAX, поместите это между <head></head>
<script src="/js/prototype.js" type="text/javascript"></script>
затем поместите это над </body>
.
<span id="live_users_count"> </span> <script type="text/javascript"> <!-- Event.observe(window, 'load', function() { if($('live_users_count')) { new Ajax.Updater('live_users_count','/readvlive.php'); } } --> </script>
Должно быть хорошо .. не слишком грубо. Если вы обеспокоены тем, насколько ваш каталог будет запускать эту команду find, вы можете использовать APC или что-то в кэше. Этот пример требует APC 3.1.4:
<?php if(apc_exists('livenum')){ $livenum = apc_fetch('livenum');echo $livenum; } else { $livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l"); apc_add('livenum',$livenum,30); } ?>
APC 3.0.13 и выше:
<?php if($livenum = apc_fetch('livenum')){ echo $livenum; } else { $livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l"); apc_add('livenum',$livenum,30); } ?>
Они будут использовать кэширование APC в течение 30 секунд, показывая последние 10 минут живых пользователей, будут запускать команду find для вычисления ее дважды в минуту. Неплохо. :П
Очистить можно с помощью crontab ..
Сценарий ( /root/deloverhead.sh ):
#!/bin/sh find "/path/to/liveusers/ -type f -amin +60 -exec rm {} \;
Вход Crontab (каждый час):
0 * * * * /root/deloverhead.sh >/dev/null 2>&1
Получайте удовольствие, извините, я могу объяснить что-то странное. :П
Вы не можете получить доступ к этому каталогу из сценария PHP, не создавая угрозу безопасности.
Самый простой способ добиться того, что вы хотите, – это использовать базу данных. Просто сохраните ip и временную метку, а затем SELECT на основе метки времени, чтобы получить количество активных пользователей на вашем сайте.