codeigniter 白屏、404、数据库连不上、视图不加载等问题,主因是错误被静默屏蔽、路径大小写不匹配、权限配置错误或关键配置项(如 sess_save_path、index_page、uri_protocol)遗漏;须先开启错误显示、校验路径与环境、检查服务状态及日志。

CodeIgniter 出现白屏、404、数据库连不上、视图不加载,基本不是框架坏了,而是错误被静默吞掉、路径写错、权限没配对或配置项漏设——修之前先让问题显形。
白屏时怎么看到真实错误
CodeIgniter 默认在非 development 环境下屏蔽所有 PHP 错误,导致页面空白但无提示。必须手动打开错误显示开关:
- 打开
index.php,在第一行<?php后立即加三行:error_reporting(E_ALL);ini_set('display_errors', '1');ini_set('display_startup_errors', '1'); - 同时检查 Apache/Nginx 错误日志(如
/var/log/apache2/error.log)和application/logs/下最新日志文件,搜索PHP Fatal error或Unable to load the requested file - 若仍无输出,可能是输出被提前中断:在疑似出问题的视图文件开头加
<?php die('loaded'); ?>,没输出就说明根本没加载进来
$this->load->view() 不生效但也不报错
CI 不会为缺失视图抛异常,默认静默跳过,结果就是页面结构断裂、部分内容消失。常见原因和验证方式如下:
- 路径大小写必须完全匹配:
Posts/index.php≠posts/index.php(Linux 文件系统区分大小写) - 不要手动加
.php后缀:$this->load->view('posts/index.php')会变成views/posts/index.php.php,必然失败 - 动态视图名务必校验:
if (!empty($view_name) && file_exists(APPPATH . 'views/' . $view_name . '.php')) { $this->load->view($view_name); } - 检查权限:
chmod 644 application/views/posts/index.php,确保 Web 用户(如www-data)有读权限
数据库连接失败报 mysqli::real_connect(): (HY000/2002)
这个错误不是用户名密码错了,而是 MySQL 服务本身不可达。关键要区分是服务未运行、套接字路径不对,还是权限拦截:
- 先确认 MySQL 是否在运行:
systemctl status mysql或service mysqld status - 检查
application/config/database.php中'hostname'设置:用'localhost'时,PHP 会尝试 Unix socket;若 socket 路径不对(如/var/lib/mysql/mysql.sock不存在),改用'127.0.0.1'强制走 TCP - 如果用了 socket,确认
mysql.sock文件存在且 Web 用户可读:ls -l /var/lib/mysql/mysql.sock,必要时chown mysql:www-data /var/lib/mysql/mysql.sock - 别信
$this->db->error()返回空——它只捕获查询阶段错误,连接失败时需看 PHP 错误日志或直接var_dump($this->db->conn_id)
session 报 mkdir(): Invalid path
这不是权限问题,而是 $config['sess_save_path'] 没设对。CI 的 Session_files_driver 会主动调用 mkdir() 初始化目录,传入空值或相对路径就会炸:
- 绝对不能留空或设为
NULL,必须用FCPATH拼绝对路径:$config['sess_save_path'] = FCPATH . 'writable/sessions'; - 手动创建目录并设权:
mkdir -p public/writable/sessions,然后chmod 700 public/writable/sessions,再chown www-data:www-data public/writable/sessions - 注意:
mkdir($path, '777')是错的——字符串'777'被当十进制解析,实际权限是 0755;应写mkdir($path, 0777)或分两步mkdir($path, 0755); chmod($path, 0777)
最常被忽略的是:很多问题表面是“找不到文件”或“权限拒绝”,实际根因是路径没写全、大小写不一致、或环境变量(如 CI_ENVIRONMENT)设成了 production 导致调试功能全关。动手前先确认当前环境和日志是否真的打开了。











