MySQL服务未启动是phpEnv常见问题,需依次检查Windows服务状态、my.ini配置(bind-address、innodb_flush_method、datadir)、端口监听情况、PHP连接参数及扩展启用状态,并清理残留服务与注册表。

MySQL服务根本没起来,连端口都不监听
phpEnv 启动 MySQL 失败最常见现象是:点“启动”按钮后立刻变灰,或者 Windows 服务里 mysql 或 phpstudy_mysql 状态为“已停止”。这不是连接问题,是服务压根没跑起来。
先别急着改 PHP 代码或连接参数——先确认服务是否存活:
- 打开 Windows 服务管理器(
services.msc),找名字含mysql的服务,右键“启动”,看是否报错; - 若启动失败并提示“服务在未由其他服务或程序使用时将自动停止”,大概率是配置或环境冲突,不是权限或密码问题;
- 用管理员身份运行 cmd,执行
sc query mysql(把mysql换成你实际的服务名),观察STATE是否为RUNNING; - 如果服务名带版本号(如
mysql80),务必用那个全名操作,sc delete mysql这类命令对错名无效。
my.ini 配置错误导致 mysqld 启动即退出
phpEnv 自带的 MySQL 很容易因配置项不兼容直接崩溃,尤其在 Windows 分区为 NTFS 带压缩、或路径含中文/空格时。常见报错不会明说,但日志里常出现 InnoDB initialization failure 或 Can't start server : Bind on TCP/IP port。
打开 phpEnv 对应 MySQL 版本的 my.ini(通常在 Extensions\MySQLX.X.X\conf\my.ini),重点检查三处:
立即学习“PHP免费学习笔记(深入)”;
-
[mysqld]段下必须有bind-address = 127.0.0.1,不能是localhost或0.0.0.0(后者在本地环境易触发权限校验失败); - 添加
innodb_flush_method=normal,这是解决部分硬盘驱动(尤其是某些 NVMe 或虚拟化磁盘)下 InnoDB 初始化卡死的关键; - 确认
datadir路径存在、无中文、无空格、且目录内有ibdata1文件;若路径是D:\phpstudy_pro\...\data,别把它剪切到桌面再解压——phpEnv 不接受过深或非标准路径。
PHP 连接时提示 “Connection refused” 或 “2002” 错误
服务明明显示“正在运行”,但 PHP 一调 mysqli_connect() 就报 Connection refused,说明 MySQL 进程虽在,但没真正监听 3306。90% 是因为 my.ini 里写了 skip-networking,或 port 被注释/改错,或 Windows 防火墙拦截了回环流量。
验证和修复步骤很直接:
- 命令行执行
netstat -ano | findstr :3306,没输出 = mysqld 没监听,回头再查配置;有输出但 PID 对应不上 mysqld.exe = 端口被占,用任务管理器杀掉对应进程; - 连接 PHP 代码中,
host必须写"127.0.0.1",不要用"localhost"—— Windows 下 mysqli 会尝试走命名管道或 socket,而 phpEnv 的 MySQL 默认只开 TCP; - 检查
php.ini是否启用了extension=mysqli和extension=pdo_mysql,且没写错文件名(Windows 下是php_mysqli.dll,不是mysqli.dll); - 重启 phpEnv 主程序(不是只重启 Apache/Nginx),否则新配置不生效。
重装前最后一步:清理残留服务与注册表项
如果你曾手动安装过 MySQL 官方版、WAMP、XAMPP 或卸载不干净,Windows 注册表里可能还留着旧服务名或冲突的 my.ini 引用,导致 phpEnv 的 MySQL 服务注册失败或加载错配置。
别跳过这步,尤其当你试过删服务、改配置、换端口都无效时:
- 以管理员身份运行 cmd,执行
sc delete mysql80(替换成你看到的实际服务名,如mysql57、MySQL); - 进 Windows “程序和功能”,卸载所有名称含
MySQL Server、MySQL Installer的条目; - 删掉旧 MySQL 安装目录(如
C:\Program Files\MySQL),并清空C:\ProgramData\MySQL(隐藏目录,需显示系统文件); - 重启电脑,再启动 phpEnv —— 此时它会重新注册干净的服务实例,而不是复用损坏的旧注册项。
真正卡住人的往往不是某个单一配置,而是服务名、my.ini 路径、PHP 扩展启用状态、连接 host 写法这四者之间微妙的不匹配。每次只动一点,用 sc query 和 netstat 验证,比反复重启更省时间。



















