查找打开的会话数

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

这个代码应该工作:

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

当然,这不会因为该目录的安全限制(因为应该有!!)。 有谁知道另一种方式来访问这个号码,而不改变目录权限。

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

结束注:对于任何人来这个问题,我结束了使用一个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并不意味着没有数据库。 还依靠会话来查看有多less用户是活跃的是不可靠的。

如果你想走这条路线,你可以做一个每隔几分钟就以一个安全进程运行的cronjob,并把这个计数保存到PHP读取的文件或数据库中。

但我build议去数据库路线。

 <? // 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中创build一个目录,确保web守护进程可以写入:

 mkdir liveusers 

触摸代码创build一个PHP脚本(例如vlive.php )( btw。touch是一个标准的* nix命令,可以使用system(),passthru()或者exec()来使用它)。 让它以一个唯一的文件名接触该目录下的一个文件,例如IP + SessionID连接在一起:

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

现在,在同一个文件中,我们需要用适当的header() 函数输出一个JPEG格式的文件,我把一个名为pixel.jpg的1×1像素放到webroot的/ images /目录下 ,随意做其他事情:

 $NewImage = imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT']. "http://img.dovov.compixel.jpg"); header("Content-type: image/jpeg"); imagejpeg($NewImage); ?> 

保存PHP文件,然后在您的文档中放置一个标准的HTML标签以使其有用:

 <img src="/vlive.php" alt="Imagination!" /> 

使用这个纯粹的PHP,然后高速caching页面将使它成为现实用户文件几乎没有得到触摸 'd。 通过这样做,您仍然可以统计“实时”用户,并在您的网站上使用整个页面caching系统。

好的,现在每个访问者加载的页面都会触及其独特的文件,所以如果他们刚刚到达,触摸命令将为该用户创build一个文件,如果他们也访问其他页面,则会使用相同的触摸编辑访问date命令。

这是有用的地方:

在另一个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分钟前访问时间改变的唯一文件的数量。 这些是我们在过去十分钟内的活用户…

现在我们在这里有一个select,如果你使用整页caching,你可能会冻结caching的实时数字到这些文件,从而使它相当烦人和无用的。 为此,我build议使用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> 

应该罚款..不是太粗糙。 如果你担心你的目录会运行多less查找命令,你可以使用APC或其他东西来caching它。 这个例子需要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); } ?> 

这些将使用APCcaching30秒显示最近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

您不能从PHP脚本访问该目录而不会造成安全风险。

实现你想要的最简单的方法是使用数据库。 只需存储IP和时间戳,然后select基于时间戳来获取您的网站上活跃用户的数量。