免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3208 | 回复: 5
打印 上一主题 下一主题

一個帳號同時只能在一處登陸 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-16 17:29 |只看该作者 |倒序浏览
最初的方案是:首先在數據中創建一個”用戶登陸表”,用來記錄用戶登陸信息.當用戶登陸時,先判斷用戶是否有在表中,有則登陸失敗.否則記下用戶的”ID”和”活動時間”.接下來,在頁面中則每一段時間去更新用戶”活動時間”.同時,刪除沒有更新過的用戶記錄.

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

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

各位朋友,有沒有類似的經驗,或是更好的方案,來出來分享下.
:wink:
同樣的應用:在線消息發送.
  1. // 寫文件
  2. function write_cache($data, $file)
  3. {
  4.     $contents = "<?php\n return " . var_export($data, true) . ";\n?>";
  5.    
  6.     $fp = fopen($file, 'w');
  7.     if (!$fp) {
  8.         return false;
  9.     }
  10.     if (flock($fp, LOCK_EX)) {
  11.         fwrite($fp, $contents);
  12.     }
  13.     fclose($fp);
  14.     return true;
  15. }

  16. // 讀文件
  17. function get_cache($file)
  18. {
  19.     if(file_exists($file))
  20.     {
  21.         return require($file);
  22.     }
  23.    
  24.     return false;
  25. }
复制代码


  1. if($_POST["cmd"] == "login"){
  2.         $_SESSION["id"] = $_POST["f_user"];
  3.         $userFile = $CACHE_DIR . 'user.php';
  4.         $data = get_cache($userFile);
  5.         $nowTime = time();
  6.         foreach($data as $key => $value)
  7.         {
  8.                 if(is_array($value) && $value['user'] == $_SESSION['id'])
  9.                 {
  10.                         // 緩存文件中只有本人的ID,但又超過了生命週期,則可以重新登陸
  11.                         if($nowTime - $value['time'] > $LIFT_TIME)
  12.                         {
  13.                                
  14.                         }else{
  15.                                 echo "<script language='javascript'>alert('此帳號已有人使用中');history.back(-1);</script>";
  16.                                 exit();
  17.                         }
  18.                 }
  19.         }
  20.         echo "<script language='javascript'>document.location='online.php'</script>";
  21. }
复制代码


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

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

  9. // 用戶若已在則更新自己的時間,相反則添加到用戶文件
  10. $data = get_cache($userFile);
  11. $flag = 1;
  12. foreach($data as $key => $value)
  13. {
  14.         if(is_array($value) && $value['user'] == $_SESSION['id'])
  15.         {
  16.                 $flag = 0;
  17.                 $data[$key]['time'] = $nowTime;
  18.         }
  19. }
  20. if($flag == 1 )
  21. {
  22.         $tmp = array(
  23.                 'user' => $_SESSION["id"],
  24.                 'time' => $nowTime,
  25.         );
  26.         array_push($data, $tmp);
  27. }

  28. // 將沒有更新用戶刪除
  29. foreach($data as $key => $value)
  30. {
  31.         if($nowTime - $value['time'] > $LIFT_TIME)
  32.         {
  33.                 array_splice($data,$key,1);
  34.         }
  35. }
  36. write_cache($data, $userFile);
复制代码

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

论坛徽章:
0
2 [报告]
发表于 2007-11-16 19:46 |只看该作者
用memcache保存在内存里吧。不过我没用过

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
3 [报告]
发表于 2007-11-16 20:46 |只看该作者
原帖由 71896532 于 2007-11-16 17:29 发表
最初的方案是:首先在數據中創建一個”用戶登陸表”,用來記錄用戶登陸信息.當用戶登陸時,先判斷用戶是否有在表中,有則登陸失敗.否則記下用戶的”ID”和”活動時間”.接下來,在頁面中則每一段時間去更新用 ...


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

论坛徽章:
0
4 [报告]
发表于 2007-11-19 08:55 |只看该作者
還有就是session的方案,

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


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

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

论坛徽章:
0
5 [报告]
发表于 2007-11-19 09:13 |只看该作者
我現在最大的一個疑點就是: 系統的性能是否和頻繁的數據操作有關.

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

论坛徽章:
0
6 [报告]
发表于 2007-11-19 15:36 |只看该作者
怎麼等了一天,都沒有人來關注這個問題啊  
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP