Laravel 11 连接 MySQL 必须设 DB_HOST=127.0.0.1(禁用 localhost 防 socket 冲突),密码含特殊字符需单引号包裹或改用 DB_URL,修改 .env 后务必执行 php artisan config:clear 和 optimize:clear,并用 DB::connection()->getPdo() 验证真实连接。
laravel 11 和 phpmyadmin 根本不共享数据库连接配置,你改了 phpmyadmin 能连,不代表 laravel 就能连——它们走的是两条完全独立的路径。
DB_HOST=localhost 在 Laravel 11 中大概率导致连接失败
Laravel 11 默认要求 PHP ≥ 8.2,而新版 MySQL(8.0+)在多数发行版中已默认禁用 Unix socket 连接,或强制使用 caching_sha2_password 认证插件。但问题更底层:
- 当
DB_HOST=localhost时,PHP 的 PDO MySQL 扩展会跳过端口、直接尝试 socket 连接(路径如/var/run/mysqld/mysqld.sock或/tmp/mysql.sock) - 若 MySQL 实际监听的是 TCP(比如 Docker 容器、云数据库、宝塔环境),这个 socket 文件根本不存在,PDO 不报“socket not found”,而是静默 fallback 到
127.0.0.1:3306 - 但此时若 MySQL 没开 TCP 监听(
bind-address = 127.0.0.1或skip-networking开启),就卡在 “Connection refused”
所以正确做法是:
- 统一用
DB_HOST=127.0.0.1(强制走 TCP,行为可预测) - 确保
DB_PORT=3306与 MySQL 实际监听端口一致(XAMPP/MAMP 可能是 3307,Docker 可能映射为 3307) - 删除
DB_SOCKET配置项(它只在localhost下生效,且极易路径错)
php artisan tinker 是唯一可信的连接验证方式
phpMyAdmin 页面里填 localhost 能连,只说明 phpMyAdmin 自己 的连接逻辑通了,和 Laravel 无关。验证 Laravel 实际行为必须进终端:
php artisan tinker
然后执行:
立即学习“PHP免费学习笔记(深入)”;
-
DB::connection()->getPdo()→ 如果抛异常,说明基础 DSN 构造失败(密码含@未 URL 编码、.env有 BOM、缓存没清) - 成功后立刻跑:
DB::connection()->getPdo()->getAttribute(PDO::ATTR_CONNECTION_STATUS)- 输出
localhost via TCP/IP→ 实际走了 3306,但 host 写的是 localhost(危险,不可靠) - 输出
localhost via UNIX socket→ 真正在用 socket,此时必须确认ls -l对应路径存在且 MySQL 用户可读
- 输出
别跳过 php artisan config:clear —— Laravel 11 的配置缓存极强,改完 .env 不清缓存,config('database.connections.mysql.host') 返回的还是旧值。
远程数据库连接失败时,先排除 MySQL 服务端限制
Laravel 报 SQLSTATE[HY000] [2002] 或 [1045],90% 不是 Laravel 的锅:
- 在本地终端直连测试:
mysql -h your.remote.ip -P 3306 -u your_user -p - 如果连不上,检查三件事:
- MySQL 是否绑定了
0.0.0.0(而非仅127.0.0.1) - 云服务器/防火墙是否放行 3306(或你指定的端口)
- 数据库用户是否授权从你的 IP 连接:
GRANT ALL ON db.* TO 'user'@'your.ip.address' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES;
- MySQL 是否绑定了
特别注意:MySQL 8.0+ 新建用户默认用 caching_sha2_password,而 Laravel 11 的 PDO 默认不支持。必须降级认证插件,或在 config/database.php 的 mysql 配置里加:
'options' => [
PDO::MYSQL_ATTR_SSL_MODE => PDO::SSL_NONE,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
],
DB<em>URL</em> 比分散的 DB* 变量更可靠
当密码含 @、:、/ 时,DB_PASSWORD=p@ss:w0rd 会被解析成错误 DSN。与其手动 URL 编码(%40、%3A),不如直接用 DB_URL:
DB_URL=mysql://myuser:%40mypass%3A123@127.0.0.1:3306/mydb
此时 config/database.php 中 mysql 的 url 字段必须保留:'url' => env('DATABASE_URL'),,其他 host/port 等字段会被自动忽略。
真正容易被忽略的点是:Laravel 11 的 config:clear 不清理 OPCache 缓存,开发时如果启用了 OPCache,还得补一句 php artisan optimize:clear,否则改了 .env 依然无效。



















