phpEnv需手动配置pdo_sqlsrv扩展:确认PHP版本、TS/NTS及VC编译器类型,下载匹配的php_pdo_sqlsrv_xxx_nts.dll放入ext目录,启用extension=php_pdo_sqlsrv_xxx_nts.dll和extension=php_pdo.dll,server参数优先用localhost而非127.0.0.1。

phpEnv 本身不内置 pdo_sqlsrv 扩展,必须手动下载匹配的 DLL 并配置 php.ini,否则 new PDO("sqlsrv:...") 会直接报错 “Class 'PDO' not found” 或 “Driver not found”。
确认 phpEnv 的 PHP 版本和线程安全(TS/NTS)类型
pdo_sqlsrv 扩展对 PHP 版本、编译器(VC15/VC17)、线程模型(TS/NTS)三者严格匹配。phpEnv 默认使用 VC17 编译、NTS 模式(尤其在 PHP 8.0+),但需实测验证:
- 运行
php -v查看 PHP 版本(如 8.2.12) - 运行
php -i | findstr "Thread Safety"(Windows)或php -i | grep "Thread Safety"(Linux/macOS)——输出enabled表示 TS,disabled表示 NTS - 运行
php -i | findstr "Compiler"确认是MSVC17(常见)还是MSVC15
不匹配的 DLL 会导致 Apache/Nginx 启动失败或扩展加载静默失败。
下载并放置正确的 pdo_sqlsrv DLL 文件
从微软官方 GitHub 发布页(https://github.com/microsoft/msphpsql/releases)下载对应版本的 pdo_sqlsrv*.dll:
立即学习“PHP免费学习笔记(深入)”;
- PHP 8.0–8.3 + NTS + VC17 → 选
php_pdo_sqlsrv_82_ts.dll(注意:文件名中的ts实际指 TS,nts才是 NTS;但新版命名已统一为_82_nts.dll,请以实际文件名后缀为准) - 解压后把 DLL 放到 phpEnv 的
ext目录下,路径类似:C:\phpEnv\php\php-8.2.12\ext\php_pdo_sqlsrv_82_nts.dll - 别漏掉依赖的
sqlsrv*.dll(同目录下也应存在),它被 pdo_sqlsrv 内部调用
修改 phpEnv 的 php.ini 启用扩展
打开 phpEnv 对应 PHP 版本的 php.ini(通常在 C:\phpEnv\php\php-8.2.12\php.ini),找到 ;extension=php_pdo_sqlsrv 这类行:
- 取消注释,并补全完整文件名(含后缀):
extension=php_pdo_sqlsrv_82_nts.dll - 确保
extension=php_pdo.dll已启用(pdo_sqlsrv 依赖 PDO 核心) - 保存后重启 phpEnv 的 Web 服务(Apache/Nginx)和 PHP-FPM(如有)
- 执行
php -m | findstr pdo_sqlsrv,有输出即表示加载成功
连接时 server 参数别写成 127.0.0.1
即使 SQL Server 本地运行,用 127.0.0.1 极易触发“命名管道提供程序: 无法打开与 SQL Server 的连接”错误——这是 Windows 下 TCP/IP 和命名管道协议协商失败的典型表现:
- DSN 中优先用
server=localhost(走共享内存或命名管道,更稳定) - 若必须用 IP,请显式指定端口:
server=127.0.0.1,1433(逗号不可省略,且不能加空格) - 确保 SQL Server 配置管理器中已启用 TCP/IP 协议,并在 IPAll 中设定了
TCP端口=1433,且TCP动态端口为空 - 防火墙放行 1433 端口(尤其是 Windows Defender 防火墙)
扩展没加载、server 写错、SQL Server 网络协议未开——这三处出问题的概率加起来超过 90%,其他配置(如 LoginTimeout、MultipleActiveResultSets)都是次要项。



















