答案是:Linux下'localhost'强制走Unix socket但PHP可能找不到socket文件,应改用'127.0.0.1'走TCP;还需检查mysqli扩展是否启用及MySQL 8.0+认证插件兼容性。

hostname 写成 'localhost' 却在 Linux 上连不上
Linux 环境下,hostname 设为 'localhost' 会强制走 Unix socket 连接,但 PHP 可能找不到 MySQL 的 socket 文件(比如 /var/run/mysqld/mysqld.sock),直接报错:mysqli::real_connect(): (HY000/2002): No such file or directory。这不是密码错,也不是服务挂了,是连接路径根本没对上。
临时解法:把 $db['default']['hostname'] 改成 '127.0.0.1',强制走 TCP/IP。Docker、Nginx + PHP-FPM、或跨容器部署时也建议统一用这个,避免 DNS 解析或 socket 路径不一致问题。
PHP 扩展没加载,错误提示却像配置错了
报 Unable to connect to your database server using the provided settings,但你反复核对账号密码端口全对——大概率是 mysqli 或 pdo_mysql 根本没启用。
- 运行
php --ini看真正生效的php.ini路径(CLI 和 Web 环境可能不同) - 检查该
php.ini是否启用了扩展:extension=mysqli(Linux/macOS)或extension=php_mysqli.dll(Windows) - 确认没残留已废弃的
extension=mysql或extension=php_mysql.dll(PHP 7.0+ 已移除) - 重启对应服务:Apache / Nginx + PHP-FPM / php-fpm 服务都要 reload
MySQL 8.0+ 默认认证协议不被旧版 PHP 支持
升级 MySQL 到 8.0 后,新用户默认用 caching_sha2_password 插件认证,而 PHP 7.2 以下的 mysqli 扩展压根不认这个协议,报错:Client does not support authentication protocol requested by server。
开发环境可快速修复:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
生产环境更稳妥的做法是升级 PHP 到 7.4+,并确保 mysqli 编译时启用了 OpenSSL 支持(影响 SSL 连接和部分认证流程)。
多数据库配置后第二个库加载失败
配了 $db['second_db'],但在控制器里写 $this->load->database('second_db') 却没反应,甚至 $this->db 还是默认库——关键点在于没加 TRUE 参数。
CodeIgniter 的 load->database() 默认行为是直接赋值给 $this->db,覆盖掉当前实例;要获取独立 DB 实例,必须显式传参:
-
$second_db = $this->load->database('second_db', TRUE);→ 返回对象,可用于后续操作 - 漏掉
TRUE,函数返回NULL,且不会报错,容易误判为“配置无效” - 多个库共存时,每个都得这样拿实例,不能依赖
$this->db全局变量
最常被忽略的是:错误发生在框架加载数据库驱动之前,调试代码(比如 echo "test")根本执行不到——所以别急着改模型或控制器,先确认 database.php 加载前的底层连接是否成立。


















