Php 查找打开的会话数

Php 查找打开的会话数,php,session,Php,Session,我正在寻找一种简单(无数据库)的方法来列出一个网站上有多少活跃的用户。我能想到的最简单的方法是计算开放会话的数量 此代码应适用于: 当然不会,因为该目录上有安全限制(应该有!!)。是否有人知道在不更改目录权限的情况下访问此号码的其他方法 注意:我正在寻找一个不涉及数据库的选项或降低PHP会话安全性的选项 结束注意:对于任何回答这个问题的人,我最终使用了一个来自root的cronjob(每分钟运行一次),它做了类似于: ls /var/lib/php5/ | wc -l > /var/www

我正在寻找一种简单(无数据库)的方法来列出一个网站上有多少活跃的用户。我能想到的最简单的方法是计算开放会话的数量

此代码应适用于:

当然不会,因为该目录上有安全限制(应该有!!)。是否有人知道在不更改目录权限的情况下访问此号码的其他方法

注意:我正在寻找一个不涉及数据库的选项或降低PHP会话安全性的选项

结束注意:对于任何回答这个问题的人,我最终使用了一个来自root的cronjob(每分钟运行一次),它做了类似于:

ls /var/lib/php5/ | wc -l > /var/www/sessioncount
确保apache用户可以读取
/var/www/sessioncount
文件。然后,您可以用PHP读取该文件:

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

如果不构成安全风险,您无法从PHP脚本访问该目录


实现所需的最简单方法是使用数据库。只需存储ip和时间戳,然后根据时间戳选择即可获得网站上的活动用户数。

在这种情况下,简单并不意味着没有数据库。同时,依靠会话查看有多少用户处于活动状态也是不可靠的

如果你想走这条路,你可以做一个cronjob,每隔几分钟由一个安全的进程运行一次,并将该计数保存到一个文件或数据库中,由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();
?>

为了帮助其他人解决这个问题,请点击此处。按顺序组装代码,并在途中使用说明。需要PHP的GD扩展

在webroot中创建一个目录,确保web守护进程可以写入该目录:

mkdir liveusers
为touch代码创建一个PHP脚本(vlive.PHP)(顺便说一句,touch是一个标准的*nix命令,可以使用system()、passthru()或exec(),您可以随意使用它)。让它接触该目录中具有唯一文件名的文件,例如IP+SessionID concat'd:

<?php 
exec("touch ". $_SERVER['DOCUMENT_ROOT']."/liveusers/". md5($_SERVER['REMOTE_ADDR'].session_id())); /* SECURITY RISK */
保存PHP文件,然后在文档中放置一个标准HTML标记以使其有用:

<img src="/vlive.php" alt="Imagination!" />
Crontab条目(每小时):


祝你玩得开心,对不起,我可能会解释一些奇怪的事情P

我想要一个无数据库的方法。谢谢,这涉及到巨大的安全风险,所以这不是我想要的答案。谢谢。嗯,为什么这是个安全问题?(或者你的意思是在webroot中)数据库方法是任何web应用程序中最慢和最大的节流阀。我的目标是将数据库查询的数量减少到最小。我喜欢cronjob的想法,或者至少是一个正在运行的进程。
$NewImage = imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT']. "/images/pixel.jpg");
header("Content-type: image/jpeg");
imagejpeg($NewImage);
?>
<img src="/vlive.php" alt="Imagination!" />
<?php 
$livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l");
echo "Live Visitors: ". $livenum;
?>
<?php include($_SERVER['DOCUMENT_ROOT']. "/readvlive.php"); ?>
<script src="/js/prototype.js" type="text/javascript"></script>
<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>
<?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); 
}
?>
<?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); 
}
?>
#!/bin/sh
find "/path/to/liveusers/ -type f -amin +60 -exec rm {} \;
0 * * * * /root/deloverhead.sh >/dev/null 2>&1