企业考勤系统:基于用户权限实现PHP独立页面缓存方案求助
解决方案:为不同用户生成独立缓存页面
你的核心问题是当前缓存文件名仅基于PHP脚本名称,没有区分访问用户,导致所有用户共用同一个缓存文件。要解决这个问题,只需在缓存文件名中加入用户的唯一标识(如用户ID),确保每个用户的缓存文件独立。
修改步骤:
- 获取登录用户的唯一标识:通过Session获取当前登录用户的ID(假设你的系统已通过Session管理登录状态,用户ID存储在
$_SESSION['user_id']中)。 - 修改缓存文件名规则:将用户ID追加到缓存文件名中,让每个用户的缓存文件独一无二。
修改后的top-cache.php代码:
<?php // 启动Session,获取当前登录用户ID session_start(); // 验证用户是否已登录(根据你的实际登录逻辑调整) if (!isset($_SESSION['user_id'])) { header("Location: login.php"); exit; } $user_id = $_SESSION['user_id']; $url = $_SERVER["SCRIPT_NAME"]; $break = explode('/', $url); $file = $break[count($break) - 1]; // 缓存文件名加入用户ID,确保每个用户的缓存独立 $cachefile = 'cached-'.substr_replace($file ,"",-4).'-user-'.$user_id.'.html'; $cachetime = 18000; // 检查缓存是否有效,有效则直接输出缓存内容 if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) { echo "<!-- Cached copy, generated ".date('H:i', filemtime($cachefile))." -->\n"; readfile($cachefile); exit; } ob_start(); // 启动输出缓冲 ?>
bottom-cache.php无需修改:
原代码可以直接使用,因为$cachefile变量已在top-cache.php中定义,include后会共享该变量。
使用说明:
保持原有的使用方式不变,但需确保你的业务逻辑已完成用户登录验证,并将用户ID存入$_SESSION['user_id']:
<?php include('top-cache.php'); // 业务逻辑代码(总经理查看所有记录/普通员工查看自身记录) include('bottom-cache.php'); ?>
额外注意事项:
- 如果用户权限发生变更(如普通员工晋升为总经理),可手动删除该用户的旧缓存文件,或等待缓存自然过期(当前设置为5小时)。
- 若需在数据更新时立即失效缓存(如员工打卡后),可在业务逻辑中添加代码,删除对应用户的缓存文件:
// 示例:员工打卡后,删除该员工的考勤页面缓存 $user_cache_file = 'cached-attendance-user-'.$user_id.'.html'; if (file_exists($user_cache_file)) { unlink($user_cache_file); }
内容的提问来源于stack exchange,提问作者M Emre Çunkuş
相关产品推荐
相关产品推荐

