CI3钩子仅本地正常,服务器端仅追踪登出行为问题求助
问题:用户行为追踪钩子仅在服务器端记录登出行为,本地环境正常运行
我们团队克隆了一个带用户行为追踪钩子的项目,该钩子原本可记录用户所有POST、GET操作。旧版本在本地和服务器环境均能正常运行,但最新克隆的项目仅本地环境工作正常,服务器端的钩子仅能追踪用户登出行为。
已确认配置
已在配置文件中开启钩子(hook设置为TRUE)
相关代码文件
application/config/hooks.php 配置
$hook['post_controller_constructor'][] = array( 'class' => 'Activity_user', 'function' => 'log_activity', 'filename' => 'log_activity_user.php', 'filepath' => 'hooks', // 'params' => array('red', 'yellow', 'blue') );
application/hooks/log_activity_user.php 代码
class Activity_user { function __construct() { $this->CI =& get_instance(); $this->CI->load->library('session'); $this->CI->load->library('lactivityuser'); } public function log_activity() { $post = $this->CI->input->post(); $get = $this->CI->input->get(); $timezone = new DateTimeZone('Asia/Jakarta'); $date = new DateTime(); $date->setTimeZone($timezone); $result = $date->format('Y-m-d H:i:s'); if(count($post) > 0){ if (strpos($_SERVER["REQUEST_URI"], '/login')) { $data = array( 'email' => $_SESSION["email"] ?? $post["email"], 'menu_name' => $_SERVER["REQUEST_URI"], 'activity' => 'melakukan login', 'created_date' => $result, ); }else if (strpos($_SERVER["REQUEST_URI"], '/Log_data')) { $data = array( 'email' => $_SESSION["email"] ?? $post["email"], 'menu_name' => $_SERVER["REQUEST_URI"], 'activity' => 'Melihat Log Data', 'created_date' => $result, ); }else if (strpos($_SERVER["REQUEST_URI"], '/History_IO')) { $data = array( 'email' => $_SESSION["email"] ?? $post["email"], 'menu_name' => $_SERVER["REQUEST_URI"], 'activity' => 'Melihat History IO', 'created_date' => $result, ); }else if (strpos($_SERVER["REQUEST_URI"], '/Dashboard')) { $data = array( 'email' => $_SESSION["email"] ?? $post["email"], 'menu_name' => $_SERVER["REQUEST_URI"], 'activity' => 'Melihat Dashboard', 'created_date' => $result, ); }else if (strpos($_SERVER["REQUEST_URI"], '/api/rule')) { $data = array( 'email' => ' ', 'menu_name' => $_SERVER["REQUEST_URI"], 'activity' => 'Rule', 'created_date' => $result, ); }else if (strpos($_SERVER["REQUEST_URI"], '/API/Rule')) { $data = array( 'email' => ' ', 'menu_name' => $_SERVER["REQUEST_URI"], 'activity' => 'Rule', 'created_date' => $result, ); } else { $data = array( 'email' => $_SESSION["email"] ?? $post["email"], 'menu_name' => $_SERVER["REQUEST_URI"], 'activity' => json_encode($post), 'created_date' => $result, ); } $this->CI->db->insert('tb_activity_user', $data); }else if(count($get) > 0){ $data = array( 'email' => $_SESSION["email"] ?? $post["email"], 'menu_name' => $_SERVER["REQUEST_URI"], 'activity' => json_encode($get), 'created_date' => $result, ); $this->CI->db->insert('tb_activity_user', $data); } } }
排查与修复建议
- 统一Session获取方式:代码中加载了CI的Session库,但直接使用原生
$_SESSION变量,而CI默认Session存储机制可能不依赖原生$_SESSION,服务器端可能未开启原生Session支持。将所有$_SESSION["email"]替换为$this->CI->session->userdata('email'),确保Session值能正确读取。 - 检查PHP版本兼容性:空值合并运算符
??需要PHP 7.0及以上版本,确认服务器端PHP版本与本地一致,若版本过低需升级或替换为isset($_SESSION["email"]) ? $_SESSION["email"] : $post["email"]写法。 - 验证数据库权限与字段约束:确认项目数据库用户拥有
tb_activity_user表的INSERT权限,同时检查email字段是否允许空值,若不允许空值且$_SESSION["email"]和$post["email"]都为空时,会导致插入失败。 - 排查URL大小写敏感问题:部分服务器(如Apache在Linux环境)默认开启URL大小写敏感,若实际请求路径与代码中判断的路径大小写不一致(比如
/dashboardvs/Dashboard),会导致匹配失败,建议将路径判断改为大小写不敏感模式:strpos(strtolower($_SERVER["REQUEST_URI"]), '/dashboard')。 - 开启服务器错误日志:在项目入口文件
index.php中添加error_reporting(E_ALL); ini_set('display_errors', 1);,查看是否有未捕获的数据库错误、类加载错误或Session初始化错误。 - 验证钩子触发状态:在
log_activity函数开头添加日志写入逻辑(如file_put_contents('/tmp/hook_log.txt', 'Hook executed: ' . date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);),确认钩子在服务器端是否被正常触发。
内容的提问来源于stack exchange,提问作者sanxerta
相关产品推荐
相关产品推荐

