BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 



一個帳號同時只能在一處登陸

首页 » 论坛 » Php »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
71896532
侠客



CU编号: 474277
注册:2006-10-9
最后登录: 2009-07-02
帖子:19
精华:0

可用积分:20 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2007-11-16 17:29 

最初的方案是:首先在數據中創建一個”用戶登陸表”,用來記錄用戶登陸信息.當用戶登陸時,先判斷用戶是否有在表中,有則登陸失敗.否則記下用戶的”ID”和”活動時間”.接下來,在頁面中則每一段時間去更新用戶”活動時間”.同時,刪除沒有更新過的用戶記錄.

后來覺得數據庫的操作過於頻繁,覺得此方案不行.於是便將”用戶登陸表”轉成一個緩存文件,也就是將對數據庫操作轉移到對文件操作.

但不知道,這樣的方案有沒有得到提昇.

各位朋友,有沒有類似的經驗,或是更好的方案,來出來分享下.

同樣的應用:在線消息發送.

// 寫文件
function write_cache($data, $file)
{
    $contents = "<?php\n return " . var_export($data, true) . ";\n?>";
   
    $fp = fopen($file, 'w');
    if (!$fp) {
        return false;
    }
    if (flock($fp, LOCK_EX)) {
        fwrite($fp, $contents);
    }
    fclose($fp);
    return true;
}

// 讀文件
function get_cache($file)
{
    if(file_exists($file))
    {
        return require($file);
    }
   
    return false;
}



if($_POST["cmd"] == "login"){
        $_SESSION["id"] = $_POST["f_user"];
        $userFile = $CACHE_DIR . 'user.php';
        $data = get_cache($userFile);
        $nowTime = time();
        foreach($data as $key => $value)
        {
                if(is_array($value) && $value['user'] == $_SESSION['id'])
                {
                        // 緩存文件中只有本人的ID,但又超過了生命週期,則可以重新登陸
                        if($nowTime - $value['time'] > $LIFT_TIME)
                        {
                               
                        }else{
                                echo "<script language='javascript'>alert('此帳號已有人使用中');history.back(-1);</script>";
                                exit();
                        }
                }
        }
        echo "<script language='javascript'>document.location='online.php'</script>";
}



$userFile = $CACHE_DIR . 'user.php';
$nowTime = time();
$nowUser = array();

// 讀取時間文件,文件不存在則重置時間文件和用戶文件
if(!file_exists($userFile))
{
        write_cache($nowUser, $userFile);
}

// 用戶若已在則更新自己的時間,相反則添加到用戶文件
$data = get_cache($userFile);
$flag = 1;
foreach($data as $key => $value)
{
        if(is_array($value) && $value['user'] == $_SESSION['id'])
        {
                $flag = 0;
                $data[$key]['time'] = $nowTime;
        }
}
if($flag == 1 )
{
        $tmp = array(
                'user' => $_SESSION["id"],
                'time' => $nowTime,
        );
        array_push($data, $tmp);
}

// 將沒有更新用戶刪除
foreach($data as $key => $value)
{
        if($nowTime - $value['time'] > $LIFT_TIME)
        {
                array_splice($data,$key,1);
        }
}
write_cache($data, $userFile);

[ 本帖最后由 71896532 于 2007-11-16 17:42 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
angeljyt
光明使者




CU编号: 428579
注册:2006-6-9
最后登录: 2009-07-04
帖子:802
精华:0

可用积分:801 (丰衣足食)
信誉积分:100
专家积分:30 (本版:10)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


2楼 发表于 2007-11-16 19:46 

用memcache保存在内存里吧。不过我没用过



您对本贴的看法:鲜花[0] 臭蛋[0]
版主 HonestQiao (oaiQtsenoH)
广告杀手-天神
快乐就常有,好景真永在



CU编号: 32193
注册:2002-12-4
最后登录: 2009-06-24
帖子:36332
精华:114

可用积分:36951 (巨富豪门)
信誉积分:220
专家积分:1438 (本版:155)
空间积分:802
推广积分:1

来自:★人杰地灵湖北美丽江城武汉. ..
状态:...保密...

[个人空间] [短信] [博客]


3楼 发表于 2007-11-16 20:46 



QUOTE:
原帖由 71896532 于 2007-11-16 17:29 发表
最初的方案是:首先在數據中創建一個”用戶登陸表”,用來記錄用戶登陸信息.當用戶登陸時,先判斷用戶是否有在表中,有則登陸失敗.否則記下用戶的”ID”和”活動時間”.接下來,在頁面中則每一段時間去更新用 ...

数据表的类型有MEMORY(HEAP)模式,速度很快的。
很多程序,例如论坛就这么做。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

2008年度的(总第四届)2008年度(总第四届)CU网友聚会PP全集!
71896532
侠客



CU编号: 474277
注册:2006-10-9
最后登录: 2009-07-02
帖子:19
精华:0

可用积分:20 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2007-11-19 08:55 

還有就是session的方案,

但不知道幾種方案中,哪一種的可行性會比較高.


類似的一例子,就是一個在線消息發送.

要達到能急時地得到用戶的新消息,並且可以容納相當多的人數同時發送消息



您对本贴的看法:鲜花[0] 臭蛋[0]
71896532
侠客



CU编号: 474277
注册:2006-10-9
最后登录: 2009-07-02
帖子:19
精华:0

可用积分:20 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2007-11-19 09:13 

我現在最大的一個疑點就是: 系統的性能是否和頻繁的數據操作有關.

是否要要採用某種方式來盡量減少數據操作



您对本贴的看法:鲜花[0] 臭蛋[0]
71896532
侠客



CU编号: 474277
注册:2006-10-9
最后登录: 2009-07-02
帖子:19
精华:0

可用积分:20 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2007-11-19 15:36 

怎麼等了一天,都沒有人來關注這個問題啊  



您对本贴的看法:鲜花[0] 臭蛋[0]

首页 » 论坛 » Php »


 


Copyright © 2001-2009 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.088471 second(s), 4 queries , Gzip enabled