yii2.0.55和yii3数据库连接失败常见于localhost触发unix socket错配,应将host=localhost改为127.0.0.1强制tcp连接,并同步配置php三处socket路径、授权root@127.0.0.1账号,docker环境需用网关ip或服务名替代localhost。

Yii2.0.55和Yii3项目部署时数据库连接不上,常见于本地开发环境(尤其是macOS或Docker容器)中MySQL配置与PHP底层socket路径不一致,导致PDO初始化失败并抛出“SQLSTATE[HY000] [2002] No such file or directory”或“Connection refused”错误。
确认是否因localhost触发Unix socket路径错配
打开项目配置文件(如config/db.php或.env),检查dsn中host值是否为localhost;若为localhost,则PHP会尝试通过Unix socket连接MySQL,但Yii未对齐实际socket路径,极易失败。
将host=localhost改为host=127.0.0.1,强制走TCP协议;此操作无需重启MySQL,改完即生效(但需清Yii缓存:php yii cache/flush-all或php yii system/cache-flush)。
Yii3项目同理:检查config/autoload/db.php或config/params.php中dsn字段,确保不含localhost;若使用yiisoft/db-mysql组件,其底层仍依赖PDO MySQL驱动,同样受此限制。
macOS下补全PHP三处socket路径配置
仅改127.0.0.1还不够——若PHP CLI或Web SAPI仍沿用错误socket路径,某些场景(如迁移命令、后台任务)仍可能报Can't connect to local MySQL server through socket。
执行mysql --socket=/tmp/mysql.sock -u root -p验证当前MySQL实际socket路径;Homebrew安装通常为/usr/local/var/mysql/mysql.sock,MAMP为/Applications/MAMP/tmp/mysql/mysql.sock,系统默认为/tmp/mysql.sock。
找到当前PHP使用的php.ini(CLI运行php --ini,Web运行phpinfo()查Loaded Configuration File),在其中补全以下三行(路径须与上一步验证一致):
mysql.default_socket = /tmp/mysql.sockpdo_mysql.default_socket = /tmp/mysql.sockmysqli.default_socket = /tmp/mysql.sock
【必须重启Web服务或PHP-FPM】:Apache执行sudo apachectl restart,Nginx+PHP-FPM执行sudo brew services restart php(macOS)或sudo systemctl restart php-fpm(Linux);不重启,配置不生效。
检查MySQL用户权限是否匹配127.0.0.1来源
第一步改127.0.0.1后若仍报Access denied for user 'root'@'localhost',说明MySQL中只有'root'@'localhost'账号,而Yii连接的是'root'@'127.0.0.1'——这是两个独立账号。
登录MySQL终端,执行:SELECT User, Host FROM mysql.user;,确认是否存在'root'@'127.0.0.1'记录。
若不存在,执行授权语句创建(密码请替换为实际值):CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION; FLUSH PRIVILEGES;。
Yii2.0.55与Yii3均不自动处理host别名映射,127.0.0.1和localhost必须分别授权。
Docker环境中避免使用localhost作为DB host
方法一:用宿主机网关IP代替localhost
在容器内,localhost指向容器自身,而非宿主机MySQL;Linux/macOS宿主机网关通常是172.17.0.1(Docker默认bridge网络),可直接在Yii配置中设为host=172.17.0.1。
方法二:用Docker自定义网络+服务名
若MySQL也运行在Docker中(如docker-compose.yml定义了mysql:服务),Yii配置应写host=mysql,并确保两个容器处于同一自定义网络(非默认bridge)。
方法三:挂载socket文件(仅限Linux宿主机)
将宿主机/var/run/mysqld/mysqld.sock挂载进PHP容器的相同路径,并在php.ini中统一配置socket路径;此法绕过TCP,性能略优,但跨平台兼容性差。











