phpEnv中无法一键安装sqlsrv扩展,必须手动下载对应PHP版本的预编译文件(.dll或.so),放入扩展目录,修改php.ini添加extension=sqlsrv和extension=pdo_sqlsrv(不带后缀),重启服务,并安装ODBC驱动及正确配置连接参数。

phpEnv 里装 sqlsrv 扩展根本不能点「一键安装」
phpEnv 的扩展管理界面里搜不到 sqlsrv 或 pdo_sqlsrv,不是你漏看了,是它压根不支持——微软没把驱动打包进 phpEnv 的扩展源,所有勾选安装操作都会静默失败或报 extension not found。
必须手动下载、放文件、改配置三步走。关键前提是确认你的 PHP 是 non-ZTS(绝大多数 phpEnv 默认就是),执行 php -i | grep "Thread Safety",输出 disabled 才对。
- 去微软 GitHub releases 页面(
https://github.com/microsoft/msphpsql/releases)找对应 PHP 版本的sqlsrv和pdo_sqlsrv预编译.so(Linux/macOS)或.dll(Windows)文件 - Windows 用户注意文件名后缀:比如 PHP 8.1 + non-ZTS + x64 就要选
php_sqlsrv_81_nts_x64.dll,别选带ts的 - Linux/macOS 用户别用 pecl install,phpEnv 环境下容易因依赖缺失编译失败;直接 wget 下载
.so放到/path/to/php/lib/php/extensions/no-debug-non-zts-xxxxx/目录下
php.ini 里加 extension 必须写对名字,且不能带 .dll/.so 后缀
Windows 下很多人抄错:写成 extension=php_sqlsrv_81_nts_x64.dll 是错的,PHP 7.4+ 已默认省略后缀;Linux 下写成 extension=sqlsrv.so 也错,应为 extension=sqlsrv。
正确写法统一为:
extension=sqlsrv extension=pdo_sqlsrv
这两行必须放在 php.ini 文件末尾(避免被其他 extension= 行覆盖),且确保前面没被 ; 注释掉。
- 改完后一定要重启 phpEnv 的 PHP 服务(不是只刷新页面),否则
php -m里看不到sqlsrv - 验证命令:
php -m | grep -E "sqlsrv|pdo"应同时输出sqlsrv和pdo_sqlsrv - 如果只看到一个,说明另一个没加载成功,大概率是文件名/路径/后缀写错了
连不上 SQL Server?90% 是缺 ODBC 驱动或连接参数设错
即使 sqlsrv 扩展加载成功,sqlsrv_connect() 或 PDO 构造函数仍会报 SQLSTATE[08001] 或 Connection refused,这不是 PHP 的问题,而是系统级依赖没到位。
Windows 用户必须装 Microsoft ODBC Driver(推荐 18),不能只靠 SQL Server 自带客户端;Linux/macOS 用户必须装 msodbcsql18,且要接受 EULA:
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list sudo apt-get update sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
- 连接字符串里必须显式指定端口(如
192.168.1.100,1433),不能只写 IP - SQL Server 必须启用 TCP/IP 协议,并在防火墙放行 1433(或自定义端口)
- 连接数组里加
"Encrypt" => "false", "TrustServerCertificate" => "true",否则新版本驱动默认拒绝不加密连接
pdo_sqlsrv 连接时提示 PDOException: could not find driver
这个错误和 php -m 显示 pdo_sqlsrv 完全不冲突——它只说明 PDO 引擎识别到了驱动,但实际调用时找不到底层实现,常见于三种情况:
-
pdo扩展本身没启用:检查php.ini是否有extension=pdo(PHP 7.4+ 默认开启,但某些 phpEnv 定制版会关掉) - SQL Server 实例名写错:比如写了
localhost\SQLEXPRESS却没开命名管道,应改用localhost,1433直连 - 用户权限不足:SQL Server 登录模式必须是「混合模式」,且账号需有
public角色以上权限,sa账号密码不能为空格或特殊字符
最容易被忽略的是:phpEnv 多版本共存时,你改的是 A 版本的 php.ini,但 Web 请求走的是 B 版本的 PHP-FPM ——务必用 phpinfo() 页面顶部的 Loaded Configuration File 路径来确认真实生效的配置文件位置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











