游乐游手机版
首页/编程语言/文章详情

PHP环境安装SQL Server驱动sqlsrv详细教程

时间:2026-05-07 07:51
在phpEnv中安装SQLServer驱动需确保扩展文件、PHP运行时与系统ODBC驱动三者匹配。首先确认PHP架构与线程模型,下载对应版本的sqlsrv扩展DLL并放入ext目录,在php ini中启用。Windows系统必须额外安装ODBCDriver18。连接测试时建议使用localhost,并检查SQLServer网络协议是否启用。注意为每个PHP版

phpEnv下安装SQL Server驱动(sqlsrv)实战指南

phpEnv下安装SQL Server驱动(sqlsrv)实战

在phpEnv环境中配置sqlsrv扩展失败,绝大多数情况源于“三位一体”的版本匹配问题:扩展文件、PHP运行时环境以及系统ODBC驱动三者未能精确对齐。核心难点通常不在于文件下载,而在于版本、架构与线程模型的精准匹配。

确认 phpEnv 的 PHP 架构和线程模型

首要步骤是精确诊断当前PHP环境的“体质”。phpEnv默认集成的PHP版本多为NTS(非线程安全)和x64架构,但若您使用的是旧版或自定义安装包,则可能为TS(线程安全)或x86架构。一旦错配,php_sqlsrv_*.dll扩展将无法加载,且php -m命令可能无报错,使用extension_loaded('sqlsrv')检测也仅返回false,排查困难。

  • 打开命令行终端,执行php -v确认PHP具体版本号(例如8.1.22)。
  • 接着,执行php -i | findstr "Architecture Thread"(Windows)或php -i | grep -E "(Architecture|Thread)"(Linux/macOS)。关键需确认输出中是否包含x64NTS标识。
  • 若显示TS,则必须选用带_ts.dll后缀的扩展文件;若显示x86,则严禁使用带_x64后缀的DLL文件。

下载并启用正确的 sqlsrv 扩展 DLL

微软官方已不再为phpEnv等集成环境提供独立扩展包,因此需手动前往官网精准匹配下载。截至2026年,最新的稳定版本为SQLSRV 5.11,兼容PHP 8.0至8.3。

  • 访问微软官方PHP驱动下载页面,根据您的PHP版本、架构(x64/x86)、线程模型(NTS/TS)筛选并下载完全匹配的压缩包,例如php_sqlsrv_81_nts_x64.zip
  • 解压下载的ZIP文件,将其中的php_sqlsrv_81_nts_x64.dllphp_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=sqlsrv
    extension=pdo_sqlsrv
    ⚠️ 重要提示:此处仅需写入扩展名称,无需包含完整文件路径或.dll后缀,phpEnv环境会自动完成识别与加载。

必须安装系统级 ODBC 驱动(Windows)

此步骤至关重要却常被忽略。phpEnv自带的PHP运行时并不包含连接SQL Server数据库所需的底层ODBC驱动。因此,即便sqlsrv扩展加载成功,在尝试建立数据库连接时,仍可能遭遇诸如Named Pipes Provider: Could not open a connectionTCP Provider: Error code 0x2746等连接错误。

立即学习“PHP免费学习笔记(深入)”;

  • 前往微软官网,下载并安装“ODBC Driver 18 for SQL Server”的安装程序(.msi格式文件)。
  • 运行安装程序,建议使用默认安装路径,安装完成后通常无需重启操作系统。安装成功后,可验证C:\Windows\System32\msodbcsql18.dll文件是否存在。
  • 安装验证:在命令行中执行odbcad32命令打开ODBC数据源管理器,切换至“驱动程序”标签页,确认列表中已存在ODBC Driver 18 for SQL Server驱动项。

连接测试时 localhost 比 127.0.0.1 更可靠

进行最终连接测试时,细节处理尤为关键。SQL Server默认启用了命名管道(Named Pipes)连接方式。在phpEnv环境下,PHP有时可能因TCP/IP协议未启用或被防火墙策略拦截,导致使用127.0.0.1IP地址连接时被拒绝,错误信息可能为Connection refusedServer is not found or not accessible

  • 一个更为稳妥的连接策略是使用localhost主机名替代IP地址进行连接尝试:
    $conn = sqlsrv_connect('localhost', ['Database' => 'testdb', 'Uid' => 'sa', 'PWD' => 'xxx']);
  • 若使用localhost依然连接失败,可打开“SQL Server配置管理器”,依次展开“SQL Server网络配置”,定位到您的SQL Server实例协议,确保TCP/IPNamed Pipes两种协议均处于“已启用”状态。
  • 此外,在连接字符串中,除非您已明确禁用动态端口并指定了固定端口,否则建议避免硬编码端口号(如localhost,1433)。

最后,一个极易被忽视的要点是:phpEnv支持切换多个PHP版本,而每个版本都拥有独立的php.ini配置文件。您为A版本添加的扩展配置,对B版本完全无效。系统级ODBC驱动仅需安装一次,但sqlsrv扩展的DLL文件,需要为您计划使用的每一个PHP版本,分别放置一份到其对应的ext/扩展目录中。

来源:https://www.php.cn/faq/2423619.html
上一篇PHP获取规约层路径的SPECIFICATION常量使用指南 下一篇C++实现内存数据二进制导出与缓存文件实战指南
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
PyTorch中使用多维索引张量对高维张量批量索引的正确方法
编程语言 · 2026-07-03

PyTorch中使用多维索引张量对高维张量批量索引的正确方法

本文深入讲解如何在 PyTorch 中利用形状为 [b, k] 的索引张量 B,对形状为 [b, m, n] 的高维张量 A 执行高效批量索引,最终得到 [b, k, n] 的输出。核心思路在于合理扩展索引维度并配合 torch gather 实现精准的逐行抽取。 很多人处理高维张量的批量索引时都会

Go中...操作符解包切片传递可变参数函数
编程语言 · 2026-07-03

Go中...操作符解包切片传递可变参数函数

在 Go 语言中,` ` 运算符放在切片变量后面(如 `slice `)的作用是将该切片“展开”为多个独立参数,专门用于调用那些接受可变参数(` T`)的函数,例如 `append` 或 `fmt Println`。这是一种类型安全的语法糖,并非省略号或通配符,能够帮助开发者更简洁地处理

macOS与WSL2下PHP多版本切换失效问题排查与修复指南
编程语言 · 2026-07-03

macOS与WSL2下PHP多版本切换失效问题排查与修复指南

本文深入分析在 macOS 或 WSL2(Ubuntu)开发环境中,通过 Homebrew 管理 PHP 多版本时,php -v 始终显示旧版本(如 php@5 6)的深层原因,并给出系统性解决方案,覆盖 PATH 冲突、符号链接逻辑、Shell 初始化配置、系统残留配置等关键环节。 遇到这种情况的

PHP JSON解析深层嵌套对象属性访问失败的解决方法
编程语言 · 2026-07-03

PHP JSON解析深层嵌套对象属性访问失败的解决方法

使用 json_decode() 解析 API 返回的 JSON 数据时,经常遇到某个子属性无法正常获取,始终返回 NULL —— 这是许多 PHP 开发者都曾碰到过的棘手问题。通常并非数据丢失,而是对象嵌套层级比预期更深,导致访问路径不正确。 举例来说,你看到返回的 JSON 里有一个 appea

nnU-Net v2预处理卡死问题的成因分析与实用解决指南
编程语言 · 2026-07-03

nnU-Net v2预处理卡死问题的成因分析与实用解决指南

> 使用 nnUNetv2_plan_and_preprocess 处理大规模数据集(例如 704 例样本)时,程序常因多进程加载导致死锁而停滞。核心原因在于默认并发数过高引发资源竞争或 I O 阻塞,适当降低并发数即可稳定完成全量预处理。 你在使用 `nnunetv2_plan_and_prepr