为了其他人解决这个问题,在这里。按顺序组装代码,并在途中使用说明。需要 PHP 的 GD 扩展。
在你的 webroot 中创建一个目录,确保 web 守护进程可以写入:
mkdir liveusers
为 touch 代码创建一个 PHP 脚本(例如 vlive.php)(顺便说一句,touch 是一个标准的 *nix 命令,使用 system()、passthru() 或 exec() 任何你想使用的东西)。让它touch该目录中具有唯一文件名的文件,例如 IP+SessionID 连接在一起:
<?php
exec("touch ". $_SERVER['DOCUMENT_ROOT']."/liveusers/". md5($_SERVER['REMOTE_ADDR'].session_id())); /* SECURITY RISK */
现在,在 同一个文件中,我们需要输出一个 JPEG 并使用适当的 header() 来完成它,我将一个名为 pixel.jpg 的 1x1 像素放入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;
?>
现在让我们将这个 sn-p 包含到您希望在其中看到它的 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 命令以每分钟计算两次。不错。 :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