开发阶段开启完整错误提示,上线后必须关闭;日志路径需确保写权限并设为绝对路径;数据库错误需手动捕获记录并脱敏;404页面应联动日志记录且不暴露敏感信息。

错误显示开关要分环境控制
开发阶段建议开启完整错误提示,便于快速定位问题;上线后必须关闭,避免敏感信息泄露。在 index.php 中调整环境常量:
-
开发环境:设置
define('ENVIRONMENT', 'development');,系统会显示 PHP 错误、数据库错误和 CodeIgniter 自身异常 -
生产环境:改为
define('ENVIRONMENT', 'production');,此时error_reporting(0)生效,且display_errors = Off(需同步检查 php.ini) - 额外确认
application/config/config.php中$config['log_threshold']值:0=关闭日志,1=错误,4=全部(含调试),推荐生产环境设为 1 或 2
日志文件权限与路径要手动验证
CodeIgniter 默认将日志写入 application/logs/ 目录,但常见失败不是代码问题,而是系统级限制:
- 确保该目录存在且 Web 服务器用户(如 www-data、nginx 或 apache)有写权限:
chmod 755 application/logs,必要时chown www-data:www-data application/logs - 检查
application/config/config.php中$config['log_path']是否为空——为空则使用默认路径;若自定义,请用绝对路径并末尾加斜杠,例如/var/www/myapp/logs/ - PHP 安全模式或 open_basedir 限制可能阻止日志写入,可通过
phpinfo()查看 open_basedir 设置是否包含日志目录
数据库错误要主动捕获再记录
CI 的 $db_debug = TRUE 只在页面输出错误,不自动记日志。关键业务中应手动补全:
- 在模型或控制器中执行查询后,立即检查:
if ($this->db->error()['code'] !== 0) { log_message('error', 'DB Error: ' . json_encode($this->db->error())); } - 对事务操作,建议在
rollback()前记录上下文,例如当前用户 ID、操作类型、SQL 片段(注意脱敏) - 避免直接记录原始 SQL(含密码、token 等),可用
preg_replace('/password\s*=\s*[\'"].*?[\'"]/', 'password = ***', $sql)简单过滤
自定义错误页与 404 日志联动
不只是美化页面,还要让 404 可追踪:
- 在
application/config/routes.php中设置$route['404_override'] = 'errors/not_found';,指向自定义控制器 - 该控制器的
not_found()方法内,先调用log_message('warning', '404 on ' . $_SERVER['REQUEST_URI'] . ' from ' . $_SERVER['HTTP_REFERER']); - 再加载视图,避免暴露服务器路径等信息;不要在 404 页面中输出
$_SERVER全量内容











