phpEnv 下 sqlsrv 扩展安装失败主因是 PHP 架构(x64/x86)、线程模型(NTS/TS)、扩展 DLL 名称及系统 ODBC 驱动三者未严格匹配;须通过 php -i 确认架构与线程类型,下载对应版本 sqlsrv DLL(如 php_sqlsrv_81_nts_x64.dll),放入 ext 目录并配置 php.ini 启用 extension=sqlsrv 和 extension=pdo_sqlsrv,再安装 ODBC Driver 18 for SQL Server,并使用 localhost 而非 127.0.0.1 连接。

phpEnv 下装不了 sqlsrv,基本是因为扩展名、PHP 架构、ODBC 驱动三者没对齐——不是“没下载对”,而是“根本没匹配上”。
确认 phpEnv 的 PHP 架构和线程模型
phpEnv 默认打包的 PHP 多为 NTS(非线程安全)+ x64,但部分旧版或自定义包可能是 TS 或 x86。错配会导致 php_sqlsrv_*.dll 加载失败,且 php -m 不报错、extension_loaded('sqlsrv') 返回 false。
- 打开终端,执行
php -v看版本(如 8.1.22) - 执行
php -i | findstr "Architecture Thread"(Windows)或php -i | grep -E "(Architecture|Thread)"(Linux/macOS),确认输出含x64和NTS - 若显示
TS,必须用_ts.dll;若显示x86,不能用_x64后缀的 DLL
下载并启用正确的 sqlsrv 扩展 DLL
微软已停止为 phpEnv 这类集成环境单独打包,必须手动从官方驱动页选对应版本。当前(2026 年)最新稳定版是 SQLSRV 5.11,支持 PHP 8.0–8.3。
- 访问 https://www.php.cn/link/7322c71e66f72ebb1cf52d9a6abc90ca,找
php_sqlsrv_81_nts_x64.zip(按你实际 PHP 版本调整) - 解压后,把
php_sqlsrv_81_nts_x64.dll和php_pdo_sqlsrv_81_nts_x64.dll放进 phpEnv 对应 PHP 版本的ext/目录(例如phpenv/php/php-8.1.22/ext/) - 编辑该 PHP 版本的
php.ini(通常在phpenv/php/php-8.1.22/conf/php.ini),末尾加两行:extension=sqlsrvextension=pdo_sqlsrv
⚠️ 不要写带完整路径或.dll后缀的写法,phpEnv 会自动识别
必须安装系统级 ODBC 驱动(Windows)
phpEnv 自带的 PHP 不带 ODBC 驱动,sqlsrv 扩展加载成功也不代表能连——连接时会直接报 Named Pipes Provider: Could not open a connection 或 TCP Provider: Error code 0x2746。
立即学习“PHP免费学习笔记(深入)”;
- 去 ODBC Driver 18 for SQL Server 下载安装程序(msi)
- 运行安装,默认路径即可,无需重启,但需确保安装后有
C:\Windows\System32\msodbcsql18.dll - 验证:命令行执行
odbcad32→ “驱动程序”页签,能看到ODBC Driver 18 for SQL Server
连接测试时 localhost 比 127.0.0.1 更可靠
SQL Server 默认启用命名管道(Named Pipes),而 phpEnv 下的 PHP 常因 TCP/IP 设置未开或防火墙拦截导致 127.0.0.1 连接被拒,错误信息常为 Connection refused 或 Server is not found or not accessible。
- 用
localhost代替 IP 地址:$conn = sqlsrv_connect('localhost', ['Database' => 'testdb', 'Uid' => 'sa', 'PWD' => 'xxx']); - 如果仍失败,检查 SQL Server 配置管理器 → “SQL Server 网络配置” → 对应实例的 “协议” → 确保
TCP/IP和Named Pipes均为“已启用” - 连接字符串中不要硬编码端口(如
localhost,1433),除非明确禁用了动态端口且只用固定端口
最易被忽略的一点:phpEnv 切换 PHP 版本后,php.ini 是独立的,改了 A 版本的配置,B 版本依然无效;ODBC 驱动装一次就行,但扩展 DLL 必须每个 PHP 版本都放一份。



















