先做裸连测试确认基础连通性:用mysqli_connect()验证hostname(建议用127.0.0.1而非localhost)、账号密码、数据库名及php mysqli扩展是否启用;若失败则属环境或权限问题,成功再查ci配置加载路径、.env权限与bom、mysql 8.0+认证协议兼容性及ci_environment环境变量设置。

先查数据库基础凭证和网络可达性,不是框架配置
CI 报 Unable to connect to your database server using the provided settings,90% 的情况根本没走到框架加载逻辑——错误发生在 PHP 尝试建立 MySQL 连接那一瞬间。所以别急着翻 database.php 或 .env,先做三件事:
- 用
mysqli_connect()写个裸连测试文件(比如test_db.php),直接传入你填在 CI 配置里的hostname、username、password、database四个值,看是否能连上 - 确认
hostname是"127.0.0.1"而不是"localhost":Linux 上localhost强制走 Unix socket,但 PHP 可能找不到/var/run/mysqld/mysqld.sock,报错(HY000/2002): No such file or directory - 检查 PHP 是否真启用了
mysqli扩展:运行php -m | grep -i mysqli,别信 phpinfo() 页面——CLI 和 Web(FPM/Apache)可能加载不同 php.ini
如果裸连失败,问题在服务器环境或账号权限;如果裸连成功,再回头查 CI 的配置加载路径是否正确(比如 .env 文件权限是否为 644、是否被 Git 忽略导致没上传、index.php 里 $pathsPath 是否指向真实路径)。
Namecheap 共享主机上数据库名和用户名必须带前缀
Namecheap 的 cPanel 创建数据库时,database name 和 database user 都强制加了你的 cPanel 用户名前缀,比如你登录用户名是 abc123,那实际数据库名不是 myapp,而是 abc123_myapp;用户也不是 myuser,而是 abc123_myuser。直接抄本地开发配置必连不上。
- 进 cPanel → 「MySQL Databases」页面,挨个核对「Current Databases」和「Current Users」两栏的完整名称
-
.env里必须写全:database.default.database = "abc123_myapp"、database.default.username = "abc123_myuser" - 创建完用户后,务必在「Add User To Database」里手动把该用户和目标数据库关联,并勾选至少
SELECT、INSERT、UPDATE、DELETE权限——只建库建用户不授权,等于白搭
CI4 的 .env 配置没生效?先确认项目结构和 index.php 路径
CI4 部署到子域名时,常见错误是把整个项目(含 app、public、system)一股脑扔进根目录,结果 .env 文件被放在 web 可访问路径下,或者 index.php 根本读不到它。
- 正确结构是:
/home/abc123/example.tgsoftware.services/(子域名根目录)放public/下所有文件(index.php、css/、js/等),而app、system、.env放在/home/abc123/下(即与子域名根目录同级) - 然后修改
/home/abc123/example.tgsoftware.services/index.php,找到$pathsPath行,改成:$pathsPath = FCPATH . '../app/Config/Paths.php';(注意是../app/,不是../public/app/) - 确认
.env文件权限是644,且内容没被 BOM 头污染(用file -i .env查编码,避免 UTF-8 with BOM)
MySQL 8.0+ 报 Client does not support authentication protocol requested by server
这是 MySQL 8.0 默认用 caching_sha2_password 认证插件,而 PHP 7.2 以下的 mysqli 不支持。裸连会报这个错,CI 也会卡在这一步。
- 临时解法(仅开发/测试):登录 MySQL 执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 生产环境推荐升级 PHP 到 7.4+,并确认
mysqli编译时启用了 OpenSSL 支持(php -i | grep -i openssl) - 别碰
skip-grant-tables或降级 MySQL——认证协议不匹配是明确信号,绕开它只是掩盖问题
最常被忽略的是:CI4 的 service('database') 在自定义类里调用时,如果环境配置(如 CI_ENVIRONMENT=production)没设对,它会去读 app/Config/Database.php 而不是 .env,导致你以为改了 .env 却没生效。部署前务必确认 CI_ENVIRONMENT 值和对应配置文件的存在性。











