laravel数据库配置失效主因是.env优先级高于config/database.php,需清缓存、校验环境变量、检查端口/权限/字符编码及线上配置固化问题。

数据库配置没生效?检查 .env 和 config/database.php 的加载顺序
Laravel 启动时先读 .env,再用它的值覆盖 config/database.php 里的默认配置。很多人改了 config/database.php 却发现不生效,就是因为 .env 里还存着旧的 DB_HOST、DB_NAME 等值,优先级更高。
- 运行
php artisan config:clear清掉配置缓存(改完.env后必做) - 用
php artisan tinker输入env('DB_HOST')和config('database.connections.mysql.host')对比,确认是否一致 -
.env中不能有空格、中文、未闭合引号,比如DB_PASSWORD=123#456会被截断——# 后内容被当注释,得写成DB_PASSWORD="123#456"
连接超时或拒绝?重点看 DB_PORT、防火墙和 MySQL 用户权限
报错 Connection refused 或 SQLSTATE[HY000] [2002] Connection timed out,90% 不是 Laravel 的锅,而是底层连不上。
- 确认 MySQL 实际监听端口:
sudo netstat -tuln | grep :3306(别默认 3306,Docker 或 MAMP 可能改过) - 本地开发用
127.0.0.1而不是localhost:后者在某些系统会走 socket 连接,而DB_SOCKET没配就会失败 - MySQL 用户必须允许从对应 host 连接,比如 Laravel 在 Docker 容器里连宿主机 MySQL,用户得是
'myuser'@'%',不是'myuser'@'localhost'
php artisan migrate 报错 “Access denied”?检查 DB_USERNAME 和密码是否被 URL 编码污染
如果数据库密码含 @、/、:、? 等字符,直接写进 .env 会导致 PDO 构造 DSN 时解析错误,表现为“Access denied for user”,但用户名密码明明是对的。
- 把密码用
urlencode()处理后再填入.env,例如原密码p@ss/w?rd→p%40ss%2Fw%3Frd - 或者改用
DB_URL方式配置(Laravel 9+),它内部会自动处理编码:DB_URL=mysql://user:p%40ss%2Fw%3Frd@127.0.0.1:3306/dbname - 验证方式:在
tinker里执行DB::connection()->getPdo(),不报错才说明凭据真正可用
本地能连、线上连不上?注意 APP_ENV 和配置缓存的陷阱
线上环境常设 APP_ENV=production,此时 php artisan config:cache 会把 .env 固化进 bootstrap/cache/config.php ——之后改 .env 完全无效。
- 上线后改数据库配置,必须重新运行
php artisan config:cache(且确保.env已更新) - 有些部署脚本会自动清缓存但漏掉 config,建议加一句
php artisan config:clear && php artisan config:cache - 检查
bootstrap/cache/目录权限,若 Web 用户无权读取config.php,也会静默失败,日志里只显示“Connection could not be established”
数据库连通性问题最麻烦的点在于:错误信息常指向 Laravel 层,但根子在环境、权限、网络或字符编码上。每次卡住,先绕开框架直连 MySQL(mysql -h host -u user -p dbname),确认基础链路通了,再回来查 Laravel 配置。











