最初的方案是:首先在數據中創建一個”用戶登陸表”,用來記錄用戶登陸信息.當用戶登陸時,先判斷用戶是否有在表中,有則登陸失敗.否則記下用戶的”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);