php实时统计在线人数

lv_square 发布于 2013/08/02 10:15
阅读 1K+
收藏 3
PHP
<?php
function getip() {
	if (getenv ( "http_client_ip" ) && strcasecmp ( getenv ( "http_client_ip" ), "unknown" ))
		$ip = getenv ( "http_client_ip" );
	else if (getenv ( "http_x_forwarded_for" ) && strcasecmp ( getenv ( "http_x_forwared_for" ), "unknown" ))
		$ip = getenv ( "http_x_forwarded_for" );
	else if (getenv ( "remote_addr" ) && strcasecmp ( getenv ( "remote_addr" ), "unknown" ))
		$ip = getenv ( "remote_addr" );
	else if (isset ( $_SERVER ["REMOTE_ADDR"] ) && $_SERVER ["REMOTE_ADDR"] && strcasecmp ( $_SERVER ["REMOTE_ADDR"], "unknown" ))
		$ip = $_SERVER ["REMOTE_ADDR"];
	else
		$ip = "unknown";
	return ($ip);
}

function num(){
$user_online = 'count.txt';
touch ( $user_online );
$timeout = 30;
$user_arr = file_get_contents ( $user_online );
$user_arr = explode ( '#', rtrim ( $user_arr, '#' ) );
$temp = array ();
foreach ( $user_arr as $value ) {
	$user = explode ( ",", trim ( $value ) );
	if (($user [0] != getip ()) && ($user [1] > time ())) {
		array_push ( $temp, $user [0] . "," . $user [1] );
	}
}
array_push ( $temp, getip () . "," . (time () + ($timeout)) . '#' );
$user_arr = implode ( "#", $temp );
$fp = fopen ( $user_online, "w" );
flock ( $fp, LOCK_EX );
fputs ( $fp, $user_arr );
flock ( $fp, LOCK_UN );
fclose ( $fp );
echo "当前有" . count ( $temp ) . "人在线";    
}
 ?>
以上代码是从社区找到的,也试了一下,确实能显示在线人数。
可是我用脚本每30秒调用 num()一次,人数还是没变化,
如果把页面整个刷新,人数就正确。请问这是怎么回事?
是不是调用出现什么问题啦?
加载中
0
0
淡水鱼
淡水鱼

建议用redis 配合实现吧。 

只要登陆了就把他放到一个redis的list里面, 给一个过期时间,例如30分钟。  

如果不做任何操作,30分钟就自动失效了,

如果他手工推出登陆, 那你就用php在redis里面找到他的session id 或则user id 干掉他。


然后你不光可以精确统计在线人数了, 还可以做一个在线列表。

redis性能是你这个文本文件没得比的。

冰亦碎
冰亦碎
正解
0
谨以此为号
谨以此为号
缓存原因吧?后边加个参数试试:.php?uptime=1305214580
返回顶部
顶部