三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Windows下PHP 8.2连接SQL Server 2022:Apache环境配置与连接测试全攻略

Windows下PHP 8.2连接SQL Server 2022:Apache环境配置与连接测试全攻略

1. 项目概述与核心价值

最近在帮一个朋友的公司搭建一个内部使用的数据看板,他们的业务数据主要存储在 SQL Server 2022 里,但开发团队更习惯用 PHP 来写 Web 应用。这个需求听起来很常见,对吧?但实际操作起来,尤其是在 Windows 环境下,让 PHP 8.2 和 SQL Server 2022 顺畅握手,再配上 Apache 2.4,还真不是一件“下一步、下一步”就能搞定的事。网上资料要么太老(还在讲 PHP 5.x 连接 SQL Server 2008),要么太零散,把驱动安装、环境配置、权限问题搅在一起,让很多刚入门的开发者望而却步。

所以,我决定把这次完整的搭建和测试过程记录下来,目标就是让一个对 Windows 服务器环境不熟,甚至刚接触 PHP 的“小白”,也能跟着步骤一步步走通。这篇文章会涵盖从零开始安装 Apache 2.4、PHP 8.2,到配置 PHP 连接 SQL Server 2022 所需的微软官方驱动,最后进行连接测试的全过程。我会把每一步的原理、可能遇到的坑以及解决办法都讲清楚,你完全可以把它当作一份“保姆级”的操作手册。无论你是想快速搭建一个本地开发环境,还是需要在服务器上部署生产应用,这套组合都能提供一个稳定、高性能的 Web 服务基础。

2. 环境准备与核心组件选型解析

在开始动手之前,我们先花点时间搞清楚要准备哪些“食材”,以及为什么选这些特定的“品牌”和“版本”。盲目安装最新版往往不是最佳选择,兼容性是第一位的。

2.1 为什么选择 PHP 8.2 + Apache 2.4 + SQL Server 2022?

首先看 PHP 8.2。它是 PHP 8 系列的一个长期支持版本,在性能(得益于 JIT 编译器)和安全性上都有显著提升,同时语法特性也足够现代。更重要的是,微软官方提供的sqlsrvpdo_sqlsrv驱动程序对 PHP 8.2 有稳定的支持。如果我们贸然使用 PHP 8.3,可能会遇到驱动尚未跟进的兼容性问题。

其次是 Apache 2.4。在 Windows 上,Apache 依然是部署 PHP 最经典、文档最丰富的 Web 服务器之一。相比 IIS,Apache 的配置更直观,.htaccess文件对项目部署也更灵活。我们选择 2.4.x 版本是因为它支持更高效的mpm_winnt模块,性能更好,且与 PHP 8.2 的php8apache2_4.dll模块完美匹配。

最后是 SQL Server 2022。作为微软最新的数据库系统,它提供了强大的数据引擎和丰富的功能。对于 PHP 连接来说,最关键的是它支持 TLS 1.2/1.3 等现代加密协议,这要求我们的 PHP 驱动也必须是最新的版本。选择 2022 也意味着我们面向的是未来几年的技术栈,避免过早面临版本淘汰。

2.2 工具与软件下载清单

以下是本次搭建所需的所有核心组件,请务必从官方或可信渠道下载,避免安装被篡改的版本。

  1. Apache HTTP Server 2.4

    • 下载地址:Apache Lounge 是一个提供 Windows 版 Apache 编译版本的知名站点。
    • 版本选择:选择httpd-2.4.xx-win64-VS16.zip。这里的VS16表示使用 Visual Studio 2019 编译,能确保与后续 PHP 线程安全版本兼容。
    • 注意:不要下载安装程序版(.msi),ZIP 压缩包版更纯净,配置更自由。
  2. PHP 8.2

    • 下载地址:Windows.php.net 是 PHP 官方的 Windows 版本发布页。
    • 版本选择:这是最关键的一步。你必须选择Thread Safe版本,并且是VS16 x64 Thread Safe的 ZIP 包。因为 Apache 在 Windows 上以多线程模式运行,必须使用线程安全(Thread Safe)的 PHP 版本。VS16同样是为了与 Apache 的编译环境匹配。
  3. Microsoft ODBC Driver for SQL Server

    • 下载地址:微软官方下载中心。
    • 版本选择:下载最新的ODBC Driver 18 for SQL Server。这是 PHP 连接 SQL Server 的桥梁,版本 18 支持 SQL Server 2022 的所有特性,并强制使用更安全的 TLS 1.2 加密。
  4. PHP SQL Server 驱动 (sqlsrv&pdo_sqlsrv)

    • 下载地址:微软官方的 PHP SQL Server 驱动 GitHub 发布页。
    • 版本选择:根据你的 PHP 版本(8.2)、线程安全(TS)、架构(x64)和编译器版本(VS16),选择对应的 DLL 文件。通常你会下载两个文件:php_sqlsrv_82_ts_x64.dllphp_pdo_sqlsrv_82_ts_x64.dll
  5. Visual C++ Redistributable

    • 下载地址:微软官网。
    • 版本选择:安装Microsoft Visual C++ 2015-2022 Redistributable (x64)。Apache、PHP 和 ODBC 驱动都依赖这个运行库。

提示:建议将所有下载的 ZIP 文件放在一个统一的文件夹中,例如D:\ServerTools,方便后续管理和查找。

3. 安装与配置 Apache 2.4

我们将把 Apache 安装到D:\Apache24,这是一个没有空格和中文的路径,能避免很多潜在的权限和识别问题。

3.1 解压与目录结构

  1. httpd-2.4.xx-win64-VS16.zip解压,并将解压后的Apache24文件夹移动到D:\根目录下。最终路径应为D:\Apache24
  2. 进入D:\Apache24,熟悉一下关键目录:
    • bin/: Apache 的核心可执行文件(httpd.exe)和模块都在这里。
    • conf/: 配置文件目录,最重要的httpd.conf就在里面。
    • htdocs/: 默认的网站根目录,我们后续的 PHP 测试文件就放在这里。
    • logs/: 访问日志和错误日志目录,排查问题时必看。

3.2 修改主配置文件httpd.conf

用记事本或 VSCode 等文本编辑器打开D:\Apache24\conf\httpd.conf。我们需要修改几个关键地方:

  1. 定义服务器根目录:找到Define SRVROOT这一行,将其值修改为我们的安装路径。

    Define SRVROOT "D:/Apache24"

    注意:Apache 配置中使用正斜杠/作为路径分隔符。

  2. 修改监听端口:找到Listen指令,默认是Listen 80。如果 80 端口被占用(如 IIS、Skype),可以改为Listen 8080

  3. 设置服务器名称:找到#ServerName www.example.com:80,去掉行首的#注释符,并修改为:

    ServerName localhost:80

    (如果你改了端口,这里也要对应修改,如localhost:8080

  4. 配置 PHP 模块支持(先注释):在文件末尾,我们先添加以下配置,但暂时用#注释掉,等 PHP 安装好后再取消注释。这样做是为了在安装 PHP 前能先测试 Apache 是否正常。

    # 告诉 Apache PHP 模块的位置 LoadModule php_module "D:/PHP/php8apache2_4.dll" # 指定 PHP 的配置文件 php.ini 的路径 PHPIniDir "D:/PHP" # 告诉 Apache 将 .php 文件交给 PHP 模块处理 AddHandler application/x-httpd-php .php

3.3 安装 Apache 为系统服务

以管理员身份打开命令提示符(CMD)或 PowerShell,执行以下命令:

cd D:\Apache24\bin httpd.exe -k install

如果成功,你会看到“Installing the ‘Apache2.4’ service”“The ‘Apache2.4’ service was successfully installed.”的提示。

接下来,启动 Apache 服务:

# 方式一:使用命令行 httpd.exe -k start # 方式二:使用系统服务管理器 net start Apache2.4

打开浏览器,访问http://localhost(如果端口是8080,则访问http://localhost:8080)。如果看到 “It works!” 的 Apache 默认页面,恭喜你,Apache 安装成功!

实操心得:如果启动失败,请立即检查D:\Apache24\logs\error.log文件。最常见的错误是SRVROOT路径配置错误,或者 80 端口被占用。日志文件会明确告诉你问题所在。

4. 安装与配置 PHP 8.2

我们将 PHP 安装到D:\PHP目录。

4.1 解压与基础配置

  1. 将 PHP 8.2 的 ZIP 包(php-8.2.x-Win32-vs16-x64.zip)解压到D:\PHP
  2. 进入D:\PHP,找到php.ini-development文件,复制一份并将其重命名为php.ini。这个文件就是我们 PHP 的配置文件。

4.2 配置php.ini关键设置

用编辑器打开D:\PHP\php.ini,我们需要启用一些扩展并调整配置。

  1. 设置扩展目录:搜索;extension_dir = “ext”,去掉行首的分号;(表示取消注释),并确保路径正确。在 Windows 上,通常需要指定绝对路径:

    extension_dir = “D:\PHP\ext”
  2. 启用常用扩展:找到Dynamic Extensions部分,根据需要去掉以下扩展前的分号;。对于连接 SQL Server,我们至少需要opensslcurl(某些驱动安装方式或数据库连接可能需要)。

    extension=curl extension=fileinfo extension=gd extension=mbstring extension=openssl extension=pdo_mysql ; 如果你也用MySQL,可以打开 ; 注意:sqlsrv 扩展我们稍后通过复制 DLL 文件来添加,不在这里直接取消注释。
  3. 调整时区:搜索;date.timezone =,去掉注释并设置你的时区,例如:

    date.timezone = Asia/Shanghai
  4. 调整上传文件大小限制(可选,如果需要上传文件):

    upload_max_filesize = 16M post_max_size = 32M

4.3 将 PHP 与 Apache 关联

现在回到 Apache 的配置文件D:\Apache24\conf\httpd.conf,找到之前我们注释掉的 PHP 配置部分,取消注释(删除行首的#)。

LoadModule php_module “D:/PHP/php8apache2_4.dll“ PHPIniDir “D:/PHP“ AddHandler application/x-httpd-php .php

保存文件后,重启 Apache 服务以使配置生效:

httpd.exe -k restart # 或在服务管理器中重启 Apache2.4

4.4 测试 PHP 是否工作

在 Apache 的网站根目录D:\Apache24\htdocs下,新建一个文件,命名为info.php。用编辑器打开,输入以下内容:

<?php phpinfo(); ?>

保存后,在浏览器中访问http://localhost/info.php(端口号根据你的设置调整)。如果能看到一个详细的、包含了 PHP 版本、配置信息和已加载模块的页面,说明 PHP 已经成功在 Apache 中运行了。

请在这个页面里确认两件事:

  1. PHP Version是 8.2.x。
  2. Server APIApache 2.0 Handler。这证明 PHP 是通过 Apache 模块方式运行的,而不是 CGI。

5. 安装 SQL Server ODBC 驱动与 PHP 扩展

这是连接 SQL Server 的核心步骤,任何一步出错都会导致连接失败。

5.1 安装 Microsoft ODBC Driver 18

运行之前下载的msodbcsql_18.x.x.x_x64.msi安装程序,按照向导提示完成安装。安装过程很简单,通常保持默认选项即可。安装完成后,ODBC 驱动会自动注册到系统中。

你可以通过系统自带的“ODBC 数据源管理器”来验证驱动是否安装成功:

  1. Win + R,输入odbcad32.exe并回车。
  2. 切换到“驱动程序”选项卡,你应该能在列表中看到ODBC Driver 18 for SQL Server

5.2 安装 PHP SQL Server 扩展

  1. 将之前下载的两个 DLL 文件(php_sqlsrv_82_ts_x64.dllphp_pdo_sqlsrv_82_ts_x64.dll)复制到 PHP 的扩展目录D:\PHP\ext下。

  2. 再次打开 PHP 的配置文件D:\PHP\php.ini,在文件末尾(或在Dynamic Extensions区域)添加以下两行,来启用这两个扩展:

    extension=php_sqlsrv_82_ts_x64 extension=php_pdo_sqlsrv_82_ts_x64

    注意:这里写的是不带php_前缀和.dll后缀的扩展名。PHP 会自动在extension_dir指定的目录下寻找对应的 DLL 文件。

  3. 保存php.ini,然后重启 Apache 服务。这是必须的,因为 PHP 只有在启动时才会加载新的扩展配置。

  4. 再次访问http://localhost/info.php,使用浏览器的页面搜索功能(Ctrl+F),搜索sqlsrvpdo_sqlsrv。如果扩展加载成功,你会在页面上看到对应的扩展模块信息,包括其版本号。

6. PHP 连接 SQL Server 2022 测试实战

环境全部就绪,现在让我们编写一个测试脚本,来验证 PHP 是否能成功连接并操作 SQL Server 2022。

6.1 准备测试数据库

在 SQL Server 2022 中,我们需要先有一个数据库、一张表和一些测试数据。假设你的 SQL Server 实例名是localhost(或.\SQLEXPRESS等),身份验证是 Windows 身份验证或 SQL Server 身份验证。

  1. 使用 SQL Server Management Studio (SSMS) 或sqlcmd连接到你的 SQL Server 实例。
  2. 执行以下 SQL 语句:
    -- 创建一个测试数据库 CREATE DATABASE PHPTEST; GO USE PHPTEST; GO -- 创建一张简单的用户表 CREATE TABLE Users ( ID INT PRIMARY KEY IDENTITY(1,1), Username NVARCHAR(50) NOT NULL, Email NVARCHAR(100) ); GO -- 插入两条测试数据 INSERT INTO Users (Username, Email) VALUES (‘张三‘, ‘zhangsan@example.com‘); INSERT INTO Users (Username, Email) VALUES (‘李四‘, ‘lisi@example.com‘); GO

6.2 编写 PHP 连接测试脚本

在 Apache 的网站根目录D:\Apache24\htdocs下,新建一个文件,命名为test_sqlsrv.php

我们将编写两个版本的连接代码:一个使用sqlsrv函数,另一个使用更流行的PDO方式。PDO 方式更推荐,因为它提供了统一的 API 来访问多种数据库。

版本一:使用 sqlsrv 函数

<?php header(‘Content-Type: text/html; charset=utf-8‘); echo “<h2>使用 sqlsrv 函数连接测试</h2>“; $serverName = “localhost“; // 数据库服务器实例名 $connectionInfo = array( “Database“ => “PHPTEST“, // 数据库名 “UID“ => “your_username“, // SQL Server 登录用户名 “PWD“ => “your_password“ // 对应的密码 ); // 如果你使用 Windows 身份验证,可以这样写: // $connectionInfo = array(“Database“=>“PHPTEST“, “Trusted_Connection“=>“Yes“); $conn = sqlsrv_connect($serverName, $connectionInfo); if($conn) { echo “连接成功!<br>“; $sql = “SELECT ID, Username, Email FROM Users“; $stmt = sqlsrv_query($conn, $sql); if($stmt === false) { die(print_r(sqlsrv_errors(), true)); } echo “<table border=‘1‘><tr><th>ID</th><th>用户名</th><th>邮箱</th></tr>“; while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { echo “<tr><td>“ . $row[‘ID‘] . “</td><td>“ . $row[‘Username‘] . “</td><td>“ . $row[‘Email‘] . “</td></tr>“; } echo “</table>“; sqlsrv_free_stmt($stmt); sqlsrv_close($conn); } else { echo “连接失败!<br>“; die(print_r(sqlsrv_errors(), true)); } ?>

版本二:使用 PDO 方式(推荐)

<?php header(‘Content-Type: text/html; charset=utf-8‘); echo “<h2>使用 PDO 连接测试</h2>“; $serverName = “localhost“; $database = “PHPTEST“; $username = “your_username“; $password = “your_password“; try { // PDO 连接字符串:驱动名、服务器、数据库名 $conn = new PDO(“sqlsrv:Server=$serverName;Database=$database“, $username, $password); // 设置 PDO 错误模式为异常,方便调试 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo “PDO 连接成功!<br>“; $sql = “SELECT ID, Username, Email FROM Users“; $stmt = $conn->query($sql); echo “<table border=‘1‘><tr><th>ID</th><th>用户名</th><th>邮箱</th></tr>“; while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo “<tr><td>“ . $row[‘ID‘] . “</td><td>“ . $row[‘Username‘] . “</td><td>“ . $row[‘Email‘] . “</td></tr>“; } echo “</table>“; } catch(PDOException $e) { echo “PDO 连接失败: “ . $e->getMessage(); } ?>

6.3 执行测试与结果分析

  1. 将脚本中的your_usernameyour_password替换为你 SQL Server 的实际登录凭据。如果使用 Windows 身份验证,请参考注释部分修改连接信息。
  2. 在浏览器中访问http://localhost/test_sqlsrv.php
  3. 预期结果:页面应该显示“连接成功!”的提示,并以表格形式展示出我们在Users表中插入的两条数据(ID为1和2,用户名为张三和李四)。

如果页面成功显示数据,那么恭喜你,整个PHP 8.2 + Apache 2.4 + SQL Server 2022的环境已经完美搭建并测试通过!

7. 常见问题与深度排查指南

在实际操作中,你很可能不会一帆风顺。下面我整理了从安装到测试全流程中最可能遇到的“坑”及其解决方案。

7.1 Apache 启动失败

  • 问题现象:执行httpd.exe -k startnet start Apache2.4时失败,或在事件查看器中看到错误。
  • 排查步骤
    1. 检查日志:第一时间查看D:\Apache24\logs\error.log,错误信息通常非常明确。
    2. 端口占用:如果日志显示(OS 10048)… Address already in use,说明 80 端口被占用。可以在httpd.conf中将Listen 80改为Listen 8080或其他端口,并同步修改ServerName
    3. 路径错误:如果日志显示Cannot load D:/Apache24/modules/mod_xxx.so或类似,请检查httpd.confDefine SRVROOT的路径是否正确,以及所有LoadModule指令的路径是否基于SRVROOT正确展开。
    4. 权限不足:确保你是以管理员身份运行命令行来安装和启动服务。对于安装目录D:\Apache24,确保系统账户(如NETWORK SERVICE或你指定的运行账户)有读取和执行权限。

7.2 PHP 扩展加载失败或 phpinfo() 不显示

  • 问题现象:访问info.php页面空白、报错,或者找不到sqlsrv模块信息。
  • 排查步骤
    1. 检查 Apache 错误日志error.log会记录 Apache 加载 PHP 模块时的错误,例如找不到php8apache2_4.dll。确保httpd.confLoadModule指令的路径完全正确。
    2. 检查 PHP 配置:确认php.ini中的extension_dir路径指向了正确的ext文件夹(绝对路径)。确认extension=php_sqlsrv_82_ts_x64这行已添加且拼写无误(注意没有php_前缀和.dll后缀)。
    3. 检查 DLL 文件匹配:这是最常见的问题。必须确保:
      • PHP 版本:8.2
      • 线程安全:Thread Safe (TS)
      • 架构:x64
      • 编译器:VS16
      • 文件:php_sqlsrv_82_ts_x64.dllphp_pdo_sqlsrv_82_ts_x64.dll一个字符都不能错。从非官方渠道下载的驱动经常导致版本不匹配。
    4. 依赖运行库:确保已安装Microsoft Visual C++ 2015-2022 Redistributable (x64)。缺少运行库会导致 PHP 启动时直接崩溃,Apache 日志中可能会有“The Apache service named is not a valid Win32 application”或类似晦涩错误。

7.3 连接 SQL Server 时出错

  • 问题现象:测试脚本报错,提示 “could not find driver”, “login timeout”, “SSL Provider” 错误等。
  • 排查步骤
    1. “could not find driver” (PDO):这明确表示 PDO_SQLSRV 扩展没有加载。请严格按照 7.2 的步骤检查 PHP 扩展加载情况。
    2. “Named Pipes Provider” 或 “TCP Provider” 错误:这通常是网络连接或实例名问题。
      • 启用 TCP/IP:在 SQL Server 配置管理器中,确保 SQL Server 网络配置下的 TCP/IP 协议已启用。
      • 检查实例名$serverName可以是localhost(local).(代表本地默认实例),或者计算机名\实例名(对于命名实例,如MYPC\SQLEXPRESS)。在 SSMS 的登录界面可以看到完整的服务器名称。
      • 防火墙:确保 Windows 防火墙允许 SQL Server 实例(如sqlservr.exe)或相应端口(默认 1433)的入站连接。
    3. “SSL Provider” 相关错误:ODBC Driver 18 默认强制使用 TLS 1.2 加密。如果 SQL Server 2022 实例没有配置有效的证书,可能会出问题。一个快速的测试方法是修改连接信息,暂时禁用强制加密(仅限测试环境!):
      $connectionInfo = array( “Database“ => “PHPTEST“, “UID“ => “sa“, “PWD“ => “password“, “TrustServerCertificate“ => “yes“ // 添加此选项 );
      或者在 PDO 连接字符串中:
      $conn = new PDO(“sqlsrv:Server=$serverName;Database=$database;TrustServerCertificate=yes“, $username, $password);
      如果这样能连上,说明是加密问题。生产环境应正确配置 SQL Server 的证书。
    4. 身份验证失败:仔细检查用户名和密码。如果使用 SQL Server 身份验证,请确保 SQL Server 实例已启用“混合模式身份验证”,并且该用户有访问PHPTEST数据库的权限。

7.4 性能与安全优化建议

当一切跑通后,为了更稳定的生产环境,可以考虑以下几点:

  1. PHP 配置优化:在php.ini中,根据服务器内存调整memory_limit,根据需求调整max_execution_time。对于生产环境,将display_errors设置为Off,将log_errors设置为On,并指定error_log路径。
  2. Apache 配置优化:调整httpd.conf中的MaxKeepAliveRequestsKeepAliveTimeout等参数以优化并发性能。考虑使用mod_deflate模块启用 Gzip 压缩。
  3. 连接管理:在 PHP 脚本中,使用完数据库连接后务必关闭(sqlsrv_close($conn)或 PDO 连接设置为null)。对于频繁执行的脚本,可以考虑使用连接池(但 PHP 本身不支持,需借助外部工具或框架设计)。
  4. 安全加固
    • 永远不要在 PHP 代码中硬编码数据库密码。可以考虑将敏感信息存储在 Web 根目录之外的配置文件中,并通过include引入。
    • 对用户输入进行严格的过滤和参数化查询,使用 PDO 的prepareexecute方法来防止 SQL 注入。这是我们上面测试脚本中query方法的升级版,在实际项目中必须使用。
    // 安全的参数化查询示例 (PDO) $username = $_POST[‘username‘]; // 假设从表单获取 $stmt = $conn->prepare(“SELECT * FROM Users WHERE Username = :name“); $stmt->execute([‘:name‘ => $username]); // 输入会被安全地处理

整个搭建过程就像搭积木,每一步都依赖前一步的稳固。最关键的三个检查点是:Apache 能独立运行、PHP 能通过 Apache 解析、PHP 能加载 SQL Server 驱动。只要按照这个顺序,结合错误日志耐心排查,最终一定能看到成功的测试页面。这套环境一旦搭好,就是一个非常强大的 Windows 平台 Web 开发基础,无论是学习 Laravel、ThinkPHP 等框架,还是开发传统的企业应用,都能得心应手。

← 返回列表