查找打开的会话数
我正在寻找一个简单的(无数据库)方法来列出有多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"> </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基于时间戳来获取您的网站上活跃用户的数量。