phpenv 不自带 mysql,需手动集成本地 mysql 5.6:下载解压 zip 版→配置 ansi 编码的 my.ini→管理员运行 mysqld --initialize-insecure→注册服务→启动→修改 php.ini 启用 mysqli 和 pdo_mysql 扩展→php 连接时用 127.0.0.1 而非 localhost。

phpEnv 本身不自带 MySQL,所谓“phpEnv 安装 MySQL”其实是手动集成 MySQL 到 phpEnv 环境中——关键不是装 phpEnv,而是让 phpEnv 下的 PHP 能连上你本地独立安装的 MySQL 5.6 实例。
为什么 phpEnv 没有内置 MySQL?
phpEnv 是一个 PHP 版本管理工具(类似 pyenv),专注切换 php.exe 和对应扩展,不负责数据库服务。它默认只管 PHP 运行时,MySQL 必须单独部署、启动,并确保 PHP 扩展能通信。
- 常见误解:以为
phpenv install mysql可行 —— 实际不存在该命令 - 真实路径:下载 MySQL 5.6 zip 包 → 解压 → 配置
my.ini→ 注册 Windows 服务 → 启动 → 修改 PHP 的php.ini启用扩展 - phpEnv 管的只是
PHP_BINARY路径和extension_dir,它不修改系统服务或环境变量中的PATH(这点容易漏)
MySQL 5.6 解压版配置要点(Windows)
MySQL 5.6 官方已停止维护,但仍有老项目依赖,必须用 zip 免安装版(msi 安装包在 5.6 后期已难找,且与 phpEnv 手动集成逻辑冲突)。
- 解压后重命名
my-default.ini为my.ini,否则mysqld --install会忽略配置 -
basedir和datadir路径必须用正斜杠/或双反斜杠\,单反斜杠在 Windows ini 文件中可能被解析为转义符 -
my.ini文件编码必须是 ANSI(非 UTF-8),否则服务启动失败且报错Unknown suffix '.' on line 1 - 注册服务前,先以管理员身份运行:
mysqld --initialize-insecure --user=mysql(生成空密码 root 用户);再执行mysqld -install - 首次启动后,立刻用
mysql -u root --skip-password登录并执行SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');,否则后续 PHP 连接会因密码为空被拒绝(MySQL 5.6 默认不允许空密码远程连接)
PHP 扩展启用与连接验证(phpEnv + MySQL 5.6)
phpEnv 切换到目标 PHP 版本后,需确认 php.ini 中三项配置全部生效,缺一不可:
-
extension_dir指向正确的扩展目录,例如:extension_dir = "D:/phpEnv/php/5.6.40/ext"(路径需与你 phpEnv 当前激活版本一致) - 取消注释这三行(注意:5.6 仍支持
php_mysql.dll,但已废弃;推荐只开php_mysqli.dll和php_pdo_mysql.dll):extension=php_mysqli.dllextension=php_pdo_mysql.dll - 检查
php -m | findstr mysql输出是否含mysqli和pdo_mysql;若无,说明extension_dir错误或 DLL 文件缺失 - 写个测试脚本:
<?php var_dump(mysqli_connect('127.0.0.1', 'root', '123456', '', 3306)); ?>,不要用localhost(Windows 下可能走 socket 导致超时)
容易被忽略的兼容性陷阱
MySQL 5.6 与较新 PHP 5.6.x(如 5.6.40)搭配时,几个静默失败点:
-
mysql.default_socket在php.ini中留空即可,不要填mysql.sock(Windows 没这文件,填了反而触发连接失败) - 若用 Apache,确保
LoadModule php5_module指向的php5apache2_4.dll与当前 PHP 版本严格匹配(VC11/VC14、x86/x64),否则 Apache 启动报错Invalid module error - phpEnv 激活某 PHP 版本后,
php --ini显示的配置文件路径可能不是你编辑的那个 —— 它优先读取PHPRC环境变量指定路径,而非当前目录下的php.ini - MySQL 5.6 默认
sql_mode包含STRICT_TRANS_TABLES,插入空字符串到NOT NULL字段会直接报错,PHP 层不会抛异常,只返回false,需检查mysqli_error()
真正卡住人的往往不是安装步骤,而是 ini 文件编码、PATH 未刷新、socket 与 TCP 混用、以及 phpEnv 的 PHPRC 覆盖机制 —— 这些地方没日志、不报错,只让连接一直失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











