IIS部署Laravel后运行php artisan命令报MySQL连接错误如何解决
原因说明
Laravel运行任意Artisan命令时都会先完成框架启动流程,只要启动流程中涉及数据库查询,就会触发数据库连接校验,和你当前运行的Artisan命令本身是否操作数据库无关。你遇到的报错查询system表取woocommerce_version的逻辑,就是在框架启动阶段执行的。本地运行正常是因为本地数据库配置正确,服务器上数据库配置不匹配或者服务不可达,所以抛出连接错误。
常见触发启动阶段数据库查询的场景如下:
- 服务提供者的
boot方法内直接写了数据库查询逻辑,框架启动时会全局加载所有服务提供者并执行其boot方法 - 路由文件中存在全局直接执行的数据库查询,没有包裹在路由闭包或控制器方法内
- 全局中间件、自定义门面的注册逻辑等其他提前加载的组件中存在数据库查询
对应报错信息:
In Connection.php line 664:
SQLSTATE[HY000] [2002] No connection could be made because the target machine actively refused it. (SQL: select * fromsystemwherekey= woocommerce_version limit 1)
In Connector.php line 70:
SQLSTATE[HY000] [2002] No connection could be made because the target machine actively refused it.
排查步骤
- 执行带详细栈信息的Artisan命令定位查询位置:
php artisan key:generate --verbose,根据输出的调用栈找到触发system表查询的代码位置 - 检查
app/Providers目录下的所有自定义服务提供者,以及config/app.php中注册的第三方服务提供者的boot方法,搜索woocommerce_version或者system表相关的查询代码 - 检查
routes/目录下的所有路由文件,确认是否存在全局作用域下的数据库操作 - 核对服务器站点根目录下
.env文件的数据库配置:确认DB_HOST、DB_PORT、DB_USERNAME、DB_PASSWORD、DB_DATABASE参数和实际运行的MySQL服务配置一致,同时确认IIS对应的PHP环境已开启pdo_mysql扩展,服务器可以正常访问MySQL服务的端口
解决方案
根据排查到的问题对应处理即可:
- 如果是启动阶段(服务提供者boot、路由全局作用域等)的非必要查询:给查询逻辑加CLI运行判断,避免命令行运行时执行查询,示例如下:
// 在服务提供者boot方法中增加判断 public function boot() { // 仅非命令行运行时执行该查询 if (!app()->runningInConsole()) { $wcVersion = \DB::table('system')->where('key', 'woocommerce_version')->value('value'); // 后续业务逻辑 } }
- 如果是数据库配置错误:修正
.env中的数据库参数,确认MySQL服务正常运行、端口对外开放、账号有对应数据库的访问权限即可。
内容的提问来源于stack exchange,提问作者saad
相关产品推荐
相关产品推荐

