下面这段程序用一个文本文件record.php来记录在线用户,之所以用php作扩展名是为了防止别人直接在浏览器上看到。它记录每个用户的IP地址,最近活动时间和用户名。$refreshmin = 2;定义了如果2分钟不活动就被认为是下线了。
<?
@session_start();
if(!file_exists("record.php"))
{
$fp = fopen("record.php", "w");
flock($fp, 1);
fputs($fp, "<?die('')?>\n");
flock($fp, 3);
fclose($fp);
} $refreshmin = 2;
$fp = fopen("record.php", "r");
flock($fp, 1);
$found = 0;
$output = fgets($fp, 4096);
while ($buffer = fgets($fp, 4096))
{
$currentip = strtok($buffer, "\t");
if(time() - strtok("\t") < ($refreshmin * 60))
{
$currentname = chop(strtok("\t"));
if(($currentname == "" && $username == "" && $REMOTE_ADDR == $currentip) || ($username != "" && $username == $currentname))
{
$found = 1;
$output .= $REMOTE_ADDR."\t".time()."\t$username"."\n";
$countnow++;
}
else
{
$output .= $buffer;
$countnow++;
}
}
}
if(!$found)
{
$output .= $REMOTE_ADDR."\t".time()."\t$username"."\n";
$countnow++;
}
flock($fp, 3);
fclose ($fp);
$fp = fopen("online/record.php", "w");
flock($fp, 1);
fputs($fp, $output);
flock($fp, 3);
fclose ($fp);
?>
<?
@session_start();
if(!file_exists("record.php"))
{
$fp = fopen("record.php", "w");
flock($fp, 1);
fputs($fp, "<?die('')?>\n");
flock($fp, 3);
fclose($fp);
} $refreshmin = 2;
$fp = fopen("record.php", "r");
flock($fp, 1);
$found = 0;
$output = fgets($fp, 4096);
while ($buffer = fgets($fp, 4096))
{
$currentip = strtok($buffer, "\t");
if(time() - strtok("\t") < ($refreshmin * 60))
{
$currentname = chop(strtok("\t"));
if(($currentname == "" && $username == "" && $REMOTE_ADDR == $currentip) || ($username != "" && $username == $currentname))
{
$found = 1;
$output .= $REMOTE_ADDR."\t".time()."\t$username"."\n";
$countnow++;
}
else
{
$output .= $buffer;
$countnow++;
}
}
}
if(!$found)
{
$output .= $REMOTE_ADDR."\t".time()."\t$username"."\n";
$countnow++;
}
flock($fp, 3);
fclose ($fp);
$fp = fopen("online/record.php", "w");
flock($fp, 1);
fputs($fp, $output);
flock($fp, 3);
fclose ($fp);
?>
$fp = fopen("record.php", "w");
flock($fp, 1);
fputs($fp, $output);
flock($fp, 3);
fclose ($fp);
?>
id integer not null auto_increment, #记录的ID
ip char(15) not null, #访问者的IP地址
dtstamp datetime not null, #最后访问时间
uri char(255), #访问者请求的URI
primary key (id)
); 然后,写一段PHP代码: <?
/*
文件:ccol.php - ConCurrent OnLine statistics
目的:统计同时在线浏览的人数
作者:Hunte, [email protected]
修改:2000-4-25
*/ $duration=1800;
require "db.php";
//包含DBSQL,详情可以参考我的另一篇文章
$ccol=new dbSQL;
$ccol->connect();
$ccol->query("DELETE FROM ccol WHERE (UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(dtstamp))>$duration");
//删除超过半小时的记录
$ccol->query("SELECT * FROM ccol WHERE ip='$REMOTE_ADDR'");
//判断当前的IP是否在该表中存在
if ($ccol->nf())//有?
{
$ccol->next_record();//下移找到的记录数组的指针
$id=$ccol->f('id');
$ccol->query("UPDATE ccol SET dtstamp=now(), uri='$REQUEST_URI' WHERE id=$id");
//设置最后访问时间和访问页面
}
else//没有
{
$ccol->query("INSERT INTO ccol VALUES (0, '$REMOTE_ADDR', now(), '$REQUEST_URI')");
} $ccol->query("SELECT COUNT(*) AS ccol FROM ccol WHERE (UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(dtstamp))<=$duration");
//找出在半个小时内的记录,后面的WHERE子句可有可无--超出时间的已经被删除了
$ccol->next_record()
echo "在线人数:", $ccol->f('ccol');
$ccol->free_result();
?> 怎么用呢?在站点的每个页面的上面调用这个程序,举例来说:
--index.php
...
<!--显示在线人数->
<?require ../stats/ccol.php?>