You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 * from system where key = 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 05:36:00