You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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大小写敏感,若实际请求路径与代码中判断的路径大小写不一致(比如/dashboard vs /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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:10:24