PHP环境安装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)。关键需确认输出中是否包含x64和NTS标识。 - 若显示
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.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运行时并不包含连接SQL Server数据库所需的底层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数据源管理器,切换至“驱动程序”标签页,确认列表中已存在ODBC Driver 18 for SQL Server驱动项。
连接测试时 localhost 比 127.0.0.1 更可靠
进行最终连接测试时,细节处理尤为关键。SQL Server默认启用了命名管道(Named Pipes)连接方式。在phpEnv环境下,PHP有时可能因TCP/IP协议未启用或被防火墙策略拦截,导致使用127.0.0.1IP地址连接时被拒绝,错误信息可能为Connection refused或Server 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/IP和Named Pipes两种协议均处于“已启用”状态。 - 此外,在连接字符串中,除非您已明确禁用动态端口并指定了固定端口,否则建议避免硬编码端口号(如
localhost,1433)。
最后,一个极易被忽视的要点是:phpEnv支持切换多个PHP版本,而每个版本都拥有独立的php.ini配置文件。您为A版本添加的扩展配置,对B版本完全无效。系统级ODBC驱动仅需安装一次,但sqlsrv扩展的DLL文件,需要为您计划使用的每一个PHP版本,分别放置一份到其对应的ext/扩展目录中。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Java正则表达式正向预查用法匹配特定模式前文本
正向预查是正则表达式中匹配位置而非内容的功能,通过`(?= )`语法实现。它能检查特定模式是否紧随其后,但该模式本身不包含在匹配结果中。例如,` d+(?=px)`可提取CSS中“px”前的数字。在Java中,使用`Pattern`和`Matcher`类即可应用此功能,适用于提取单位前数值或特定词前缀等场景。
Java中Collections.synchronizedList方法实现线程安全列表转换指南
Collections synchronizedList()仅保证单个方法原子性,无法自动保护复合操作、迭代或批量操作,需手动同步。它适用于读多写少、不依赖中间状态一致性的简单场景,如快照统计。若需高并发读或弱一致性迭代,可考虑CopyOnWriteArrayList;若列表规模大或写频繁,则synchronizedList配合外部同步更合适。使用时需注意正
静态变量循环依赖问题排查指南初始化块顺序是关键
排查静态变量循环依赖Bug时,需理解静态初始化严格按源码顺序执行且仅一次。若多个类在初始化中相互引用未就绪的静态字段,将读取到默认值(如null),导致空指针或ExceptionInInitializerError。可通过日志追踪执行流,定位中断点。修复时可考虑延迟初始化、拆分初始化阶段或引入中间协调类来解耦。
Java定时任务实现教程Timer与TimerTask用法详解
Timer与TimerTask需配对使用,Timer是单线程调度器。schedule()采用固定延迟策略,scheduleAtFixedRate()追求固定速率。任务需继承TimerTask并重写run()方法,内部应捕获异常避免调度器崩溃。使用后必须调用timer cancel()释放资源。新项目更推荐使用ScheduledExecutorService,
Java嵌套循环中如何用break和标签直接跳出最外层循环
在Java嵌套循环中,标准break只能跳出当前层。使用带标签的break可跳出指定外层循环。需在外层循环前紧贴定义标签,内层使用break加标签名即可直接跳出。该方法语法清晰,是解决多层跳出问题的直接工具。
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

