CLI下连接CodeIgniter多库需验证PHP扩展、显式加载非default库(第二个参数为TRUE)、主机名用127.0.0.1避socket问题,并检测$conn_id判连通性。

在 CLI 环境下使用 CodeIgniter 连接多个数据库,和 Web 请求时逻辑一致,但有几个关键点容易出错:CLI 不走 Apache/Nginx,不加载 `.htaccess` 或 `web server config`,且 PHP 配置(如 `php.ini`)可能与 Web 环境不同——这意味着数据库扩展、socket 路径、甚至 `$active_group` 的生效方式都要单独验证。
确认 CLI 下的数据库驱动已启用
CLI 和 Web 可能加载不同的 `php.ini`。先运行:
php --ini
查看 CLI 实际加载的配置路径,再检查该 `php.ini` 是否启用了 `mysqli` 或 `pdo_mysql`:
- Linux/macOS:
php -m | grep -i mysqli - Windows:
php -m | findstr mysqli
若没输出,需编辑对应 `php.ini`,取消注释(或添加):
extension=mysqli ; 或(PHP 7.4+ 推荐) extension=pdo_mysql
多库配置必须显式加载,不能依赖自动初始化
CodeIgniter 默认只自动初始化 `$db['default']`。你在 `database.php` 中定义的 `$db['log_db']`、`$db['report_db']` 等,CLI 脚本里不会自动加载,必须手动调用:
- 用
$this->load->database('log_db', TRUE)—— 注意第二个参数 必须为 TRUE,否则返回NULL,且不赋值给局部变量 - 推荐存入变量,避免重复加载:
$log_db = $this->load->database('log_db', TRUE); - 不要写
$this->log_db = $this->load->database('log_db'),这会覆盖默认实例,且不返回对象
主机名别用 localhost,优先改用 127.0.0.1
Linux CLI 下,localhost 会强制走 Unix socket,而 CLI 的 PHP 可能找不到 MySQL socket 文件(如 `/var/run/mysqld/mysqld.sock`),报错:
mysqli::real_connect(): (HY000/2002): No such file or directory
解决方法:在 `application/config/database.php` 中,把所有多库的 hostname 改为:
$db['log_db']['hostname'] = '127.0.0.1';
这样强制走 TCP/IP,绕过 socket 路径问题;Windows 和 Docker 环境也建议统一用此写法,避免解析歧义。
CLI 脚本中验证连接是否成功
加一句简单检测,避免静默失败:
$log_db = $this->load->database('log_db', TRUE);
if ($log_db->conn_id === FALSE) {
echo "❌ log_db 连接失败:". $log_db->error()['message'] ."\n";
exit(1);
}
echo "✅ log_db 连接正常\n";
注意:`$log_db->error()` 在连接失败时才有效;如果连都连不上,`$log_db->conn_id` 是 `FALSE`,此时不能调用查询方法。


















