php 7.4 连接 mssql 必须三件套齐备且版本严格匹配:微软 odbc 驱动(msodbcsql17/18)、unixodbc-devel(≥2.3.7)、pdo_sqlsrv 5.8.x;需确认系统架构、php 路径及 abi 类型(nts/ts),正确配置微软源,清理旧冲突包,用宝塔对应 php 路径编译扩展,绝对路径写入 php.ini,并通过 sqlcmd 优先验证底层连接。

PHP 7.4 连接 MSSQL 不是“装个扩展就完事”,必须三件套齐备且版本咬合:微软 ODBC 驱动(msodbcsql17 或 msodbcsql18)、unixODBC-devel(编译必需)、以及匹配的 PHP 扩展(pdo_sqlsrv 5.8.x 系列)。缺一不可,错一个版本就报 driver not found 或 unable to load dynamic library。
确认系统架构和 PHP 版本再动手
宝塔面板下容易忽略底层系统细节,直接套用教程命令会失败。先执行:
uname -m
输出 x86_64 表示 64 位系统;再确认 PHP 路径和 ABI 类型:
/www/server/php/74/bin/php -v<br>/www/server/php/74/bin/php-config --configure-options | grep -i "zts\|nts"
若含 --enable-zts,说明是线程安全(TS)版,后续扩展编译必须用 TS 兼容包;多数宝塔默认是 NTS,但不能凭感觉猜。
- CentOS 7/RHEL 7 对应微软源地址是
https://packages.microsoft.com/config/rhel/7/prod.repo - CentOS 8/RHEL 8 用
rhel/8,RHEL 9 用rhel/9—— 源配错,yum install msodbcsql17会提示 “No package available” -
php -m | grep pdo必须看到pdo已启用,否则pdo_sqlsrv加载后也无效
安装 ODBC 驱动时必须清理冲突包
很多报错如 sql.h: No such file or directory 或扩展编译失败,根源是旧版 unixODBC 冲突。别跳过这步:
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel -y<br>sudo ACCEPT_EULA=Y yum install -y msodbcsql17 mssql-tools17 unixODBC-devel
注意:msodbcsql17 和 msodbcsql18 不能共存,选一个并坚持到底;mssql-tools17 带 sqlcmd,调试连接时比 PHP 代码快得多。
- 安装后运行
odbcinst -j,确认Driver Manager路径(通常是/opt/microsoft/msodbcsql17/lib64) - 检查驱动注册:运行
cat /etc/odbcinst.ini,里面应有[ODBC Driver 17 for SQL Server]区块 - 如果
ACCEPT_EULA=Y不加,yum会卡住等待交互式确认
编译 pdo_sqlsrv 扩展必须用对应 PHP 的 phpize
PECL 安装在宝塔环境下常因权限或路径错乱失败,推荐手动编译更可控:
wget https://pecl.php.net/get/pdo_sqlsrv-5.8.1.tgz<br>tar -zxvf pdo_sqlsrv-5.8.1.tgz<br>cd pdo_sqlsrv-5.8.1<br>/www/server/php/74/bin/phpize<br>./configure --with-php-config=/www/server/php/74/bin/php-config<br>make && make install
关键点:所有路径都指向 /www/server/php/74/,不是系统默认 /usr/bin/php;make install 输出最后一行会显示 Installing shared extensions: /www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/,记下这个目录名(它随 PHP 构建参数变化)。
- 编辑
/www/server/php/74/etc/php.ini,末尾添加:extension = /www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/pdo_sqlsrv.so - 不要写
extension = pdo_sqlsrv.so—— 宝塔多 PHP 版本共存时,不写绝对路径会加载错版本 - 改完后必须执行:
/etc/init.d/php-fpm-74 reload(不是 restart)
验证连接前先用 sqlcmd 快速排除网络和认证问题
别急着写 PHP 代码。先用微软官方工具验证底层链路是否通:
sqlcmd -S your-sql-server-ip -U sa -P 'your-password' -Q "SELECT @@VERSION"
如果报 Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired,说明不是 PHP 配置问题,而是防火墙、SQL Server 远程连接未开、TCP 端口(默认 1433)被拦,或 SQL Server 身份验证模式没设为“混合模式”。
- ThinkPHP 中 DSN 必须显式指定 driver:
sqlsrv:server=192.168.1.100;Database=testdb;ConnectionPooling=0; -
ConnectionPooling=0在宝塔 + PHP-FPM 场景下建议加上,避免连接复用导致的超时或状态残留 - 如果连本地 SQL Server 实例,
-S参数写(local)或.不起作用,得用127.0.0.1或真实 IP
最易被忽略的是:SQL Server 默认关闭 TCP/IP 协议,即使服务在运行,也不响应远程连接。这个必须进 SQL Server Configuration Manager 手动启用,光开防火墙没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











