- 论坛徽章:
- 0
|
最初的方案是:首先在數據中創建一個”用戶登陸表”,用來記錄用戶登陸信息.當用戶登陸時,先判斷用戶是否有在表中,有則登陸失敗.否則記下用戶的”ID”和”活動時間”.接下來,在頁面中則每一段時間去更新用戶”活動時間”.同時,刪除沒有更新過的用戶記錄.
后來覺得數據庫的操作過於頻繁,覺得此方案不行.於是便將”用戶登陸表”轉成一個緩存文件,也就是將對數據庫操作轉移到對文件操作.
但不知道,這樣的方案有沒有得到提昇.
各位朋友,有沒有類似的經驗,或是更好的方案,來出來分享下.
:wink:
同樣的應用:在線消息發送.
- // 寫文件
- 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 编辑 ] |
|