Найти количество открытых сессий - PullRequest
3 голосов
/ 25 марта 2009

Я ищу простой (без базы данных) способ определения количества активных пользователей на сайте. Самый простой способ, которым я могу придумать, - это подсчитать количество открытых сессий.

Этот код должен работать:

$number_of_users = count(scandir(ini_get("session.save_path")));

Конечно, этого не произойдет из-за ограничений безопасности в этом каталоге (как и должно быть !!). Кто-нибудь знает другой способ доступа к этому номеру без изменения прав доступа к каталогу.

Примечание: Я ищу вариант, который не включает базы данных или не снижает безопасность сеансов PHP.

Конечное примечание: Для всех, кто придет к этому вопросу, я использовал cronjob (работающий каждую минуту) от root, который сделал нечто похожее на:

ls /var/lib/php5/ | wc -l > /var/www/sessioncount

Убедитесь, что файл /var/www/sessioncount доступен для чтения пользователю apache. Тогда вы можете просто прочитать файл на PHP:

$number_of_users = file_get_contents("/var/www/sessioncount");

Ответы [ 4 ]

5 голосов
/ 25 марта 2009
<?
// 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();
?>
4 голосов
/ 25 марта 2009

Easy не означает отсутствие базы данных в этом случае. Также ненадежно полагаться на сессию, чтобы узнать, сколько пользователей активно.

Если вы хотите пойти по этому пути, вы можете сделать cronjob, который запускается безопасным процессом каждые несколько минут и сохраняет это количество в файл или дБ, которые читает PHP.

Но я рекомендую пойти по маршруту базы данных.

2 голосов
/ 05 октября 2011

Ради решения этого для кого-либо здесь, здесь. Соберите код по порядку и используйте указания по пути. Требуется расширение PHP GD.

Создайте каталог в вашем webroot, убедитесь, что веб-демон может писать в него:

mkdir liveusers

Создание сценария PHP (например, vlive.php ) для кода touch (кстати, touch - стандартная команда * nix, используйте систему (), passthru () или exec () независимо от того, что вы хотите использовать). Пусть коснется файла в этом каталоге с уникальным именем файла, например, IP + SessionID concat'd вместе:

<?php 
exec("touch ". $_SERVER['DOCUMENT_ROOT']."/liveusers/". md5($_SERVER['REMOTE_ADDR'].session_id())); /* SECURITY RISK */

Теперь, в том же файле нам нужно вывести JPEG и завершить его соответствующим заголовком (). Я помещаю пиксель 1x1 с именем pixel.jpg в корень веб-корня / images / directory , не стесняйтесь делать что-то еще:

$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 'd. Делая это, вы все равно можете считать «живых» пользователей и использовать систему полностраничного кэша на вашем сайте.

Хорошо, так что теперь каждая страница, которую загружает посетитель, касается своего уникального файла, поэтому, если они только что прибыли, сенсорная команда создаст файл для этого пользователя, если он также посещает другие страницы, он отредактирует дату доступа с помощью та же самая команда 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">&nbsp;</span>


<script type="text/javascript">
    <!--
    Event.observe(window, 'load', function() {
        if($('live_users_count')) {
            new Ajax.Updater('live_users_count','/readvlive.php'); 
        }
   }
-->
</script>

Должно быть хорошо .. не слишком грубо. Если вы беспокоитесь о том, сколько раз ваш каталог будет выполнять эту команду поиска, вы можете использовать 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, чтобы вычислять ее дважды в минуту. Неплохо. : P

Очистить можно с помощью 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

Веселитесь, извините, я могу объяснить странные вещи. : P

0 голосов
/ 25 марта 2009

Вы не можете получить доступ к этому каталогу из скрипта PHP, не создавая угрозы безопасности.

Самый простой способ достичь желаемого - использовать базу данных. Просто сохраните ip и временную метку, а затем выберите SELECT на основе временной метки, чтобы получить количество активных пользователей на вашем веб-сайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...