phpEnv是一款国产的Windows平台PHP集成环境,自带Apache、Nginx、MySQL等常用组件,日常开发非常方便。但它的PHP发行包里默认并不包含Sqlsrv扩展,一旦项目需要对接SQL Server数据库,调用sqlsrv_connect时就会直接报Call to undefined function的错误。要让phpEnv里的PHP具备连接SQL Server的能力,需要手动安装Sqlsrv扩展,同时安装微软的ODBC驱动作为底层依赖。本文把整个流程拆开讲清楚,并附上连接测试代码和常见报错的排查方法。

一、安装前必须确认的两个信息
Sqlsrv扩展的DLL文件和PHP版本是强绑定的,下载错了根本加载不上,所以动手之前先要把两件事弄清楚:PHP的小版本号和线程安全模式(Thread Safe还是Non Thread Safe)。
打开phpEnv面板,切换到PHP版本页面,可以看到当前使用的PHP版本,比如8.0.2、7.4.33等。接着在站点根目录新建一个phpinfo.php文件,内容为<?php phpinfo();,浏览器访问这个文件,在页面顶部找到Thread Safety一栏。如果显示enabled,说明是线程安全版本(TS),显示disabled则是非线程安全版本(NTS)。也可以直接看phpinfo里Extension Dir指向的目录,后面放DLL文件时会用到。
确认好之后记录下来,比如PHP 7.4 NTS、PHP 8.0 TS这样的组合。微软官方提供的Sqlsrv扩展文件命名规则是php_sqlsrv_74_nts.dll这种形式,74代表PHP 7.4,nts代表非线程安全,必须和你的环境完全对应。装错了版本时PHP启动会静默失败或者Apache直接起不来,这是新手最容易踩的坑。
二、下载并配置Sqlsrv扩展
Sqlsrv扩展由微软官方维护,可以去微软的下载中心获取,搜索Microsoft Drivers for PHP for SQL Server就能找到下载页。下载页面提供了多个版本的压缩包,例如5.8版本支持PHP 7.0到7.4,5.10版本支持PHP 7.4到8.0,5.11和5.12版本支持PHP 8.0以上。选择压缩包时要根据前面确认的PHP版本决定,不要盲目下最新版。
解压后会看到一堆DLL文件,按命名筛选出符合自己环境的那两个文件:php_sqlsrv_74_nts.dll和php_pdo_sqlsrv_74_nts.dll(以PHP 7.4 NTS为例)。前者是Sqlsrv函数库,后者是PDO驱动,建议两个都装。把它们复制到phpEnv对应PHP版本的ext目录下,路径一般在phpEnv安装目录的php\php-7.4.33-nts\ext这样的位置,具体以phpinfo中Extension Dir显示的为准。
接下来打开同目录下的php.ini,在扩展配置区域添加两行:
extension=php_sqlsrv_74_nts.dll extension=php_pdo_sqlsrv_74_nts.dll
保存后回到phpEnv面板重启Apache或者Nginx加PHP。再次访问phpinfo页面,搜索sqlsrv关键字,如果能找到sqlsrv和pdo_sqlsrv两个模块的信息,说明扩展已经加载成功。如果PHP起不来或者扩展没出现,八成是版本没对上,回头检查TS/NTS和PHP小版本号。
三、安装ODBC驱动并处理依赖
Sqlsrv扩展只是上层封装,真正和SQL Server通信的是微软的ODBC Driver for SQL Server。phpEnv默认没有带这个组件,缺少它时扩展虽然能加载成功,但连接时会报This extension requires the Microsoft ODBC Driver for SQL Server之类的错误。
去微软官网下载Microsoft ODBC Driver 17或18 for SQL Server,注意选择x64版本(如果PHP是32位的就选x86,现在基本都是64位环境)。安装过程是标准的向导式操作,一路下一步即可。装完之后建议重启一次电脑,确保系统驱动生效。
还有一个容易忽略的点:SQL Server本身默认没有启用TCP/IP协议,只开了共享内存,导致远程或本地通过IP连接时失败。打开SQL Server配置管理器,在SQL Server网络配置中找到实例的协议项,把TCP/IP设置为启用,然后重启SQL Server服务。同时确认SQL Server Browser服务是否需要开启,以及防火墙是否放行了1433端口。
四、编写连接代码并测试
环境全部就绪后,写一段简单的测试脚本来验证连接。下面是用sqlsrv方式连接并查询数据的示例:
<?php
$serverName = "127.0.0.1"; // SQL Server地址,带实例名写成 127.0.0.1\SQLEXPRESS
$connectionInfo = array(
"Database" => "testdb",
"UID" => "sa",
"PWD" => "你的密码",
"CharacterSet" => "UTF-8" // 避免中文乱码
);
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
// 打印详细错误信息方便排查
die(print_r(sqlsrv_errors(), true));
}
$sql = "SELECT id, name FROM users";
$stmt = sqlsrv_query($conn, $sql);
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
echo $row['id'] . ' - ' . $row['name'] . '<br>';
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
如果项目用的是PDO,也可以通过pdo_sqlsrv驱动连接,写法更统一:
<?php
try {
$pdo = new PDO(
"sqlsrv:Server=127.0.0.1;Database=testdb",
"sa",
"你的密码"
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$rows = $pdo->query("SELECT id, name FROM users")->fetchAll(PDO::FETCH_ASSOC);
print_r($rows);
} catch (PDOException $e) {
echo '连接失败:' . $e->getMessage();
}
五、常见问题排查
连接失败时先看具体报错信息,不同错误对应不同原因。报Call to undefined function sqlsrv_connect,说明扩展没加载成功,回到phpinfo确认模块是否存在,检查DLL版本和php.ini配置。报ODBC Driver相关错误,说明系统缺少驱动或者版本过低,重新安装对应版本的ODBC Driver。
报连接被拒绝或者超时,通常是SQL Server的TCP/IP协议没启用、1433端口被防火墙拦截,或者实例名写错了。Express版默认是实例名SQLEXPRESS,地址要写成主机名\SQLEXPRESS的形式。中文乱码问题可以在连接参数里加CharacterSet指定UTF-8解决,同时保证数据库排序规则和页面编码一致。
另外提醒一点,phpEnv支持多PHP版本共存,切换版本后ext目录和php.ini都是各自独立的,之前装的扩展不会自动带过去,需要在新版本下重新安装一遍。SQL Server账号建议不要在生产环境直接用sa,应该创建权限受限的专用账号,这也是数据库安全的基本要求。按照以上步骤操作下来,phpEnv环境下的PHP就能稳定地和SQL Server进行数据交互了。
phpEnvSqlsrv扩展SQL Server连接修改时间:2026-09-10 14:59:05