# Windows 上多版本 PHP：一个站点一个 FastCGI 版本

> 在 IIS 上并存 PHP 8.3 与 8.4：独立目录、FastCGI 应用、站点级 handler 和各自 php.ini。

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29
- 测试机: PHP 8.4.27 FastCGI 在 VM 361 Windows 11 26H2 验证；PHP 8.3 并存方案为 E1

## 一句话结论

PHP 版本由 **handler 的 `scriptProcessor`** 决定，不是应用池。要让 8.3 和 8.4 并存：

1. 每个 NTS 包独立目录（`C:\PHP\8.3`、`C:\PHP\8.4`）。
2. 各自 `php.ini`。
3. 各自注册 FastCGI 应用。
4. 每个站点用站点级 `*.php` handler 指向对应版本。
5. 应用池保持独立做隔离，但别指望池能选 PHP 版本。

## 目录

```text
C:\PHP\8.3\php-cgi.exe
C:\PHP\8.3\php.ini
C:\PHP\8.4\php-cgi.exe
C:\PHP\8.4\php.ini
```

不要把两个版本放同一目录或共享 `ext`。`extension_dir` 错/缺失就是“扩展找不到”的常见原因。

## 注册两个 FastCGI 应用

```powershell
Import-Module WebAdministration
Add-WebConfiguration -PSPath 'MACHINE/WEBROOT/APPHOST' `
  -Filter 'system.webServer/fastCgi' `
  -Value @{ fullPath = 'C:\PHP\8.3\php-cgi.exe' }
Add-WebConfiguration -PSPath 'MACHINE/WEBROOT/APPHOST' `
  -Filter 'system.webServer/fastCgi' `
  -Value @{ fullPath = 'C:\PHP\8.4\php-cgi.exe' }
```

两个可以同时存在；请求用哪个只看 handler。

## 站点级 handler

如果服务器已有全局 `PHP_via_FastCGI` 指向 8.4，PHP 8.3 站点可以移除它再加自己的：

```xml
<configuration>
  <system.webServer>
    <handlers>
      <remove name="PHP_via_FastCGI" />
      <add name="PHP83_via_FastCGI"
           path="*.php" verb="*"
           modules="FastCgiModule"
           scriptProcessor="C:\PHP\8.3\php-cgi.exe"
           resourceType="Either" />
    </handlers>
  </system.webServer>
</configuration>
```

不要 `<clear />` 所有 handler；那会删掉静态内容处理器，CSS/图片全挂。只移除要替换的 PHP handler。

8.4 站点可以继续用全局 handler，也可以显式定义 `PHP84_via_FastCGI`。显式更好审计。

## 每个版本独立 php.ini

```ini
; C:\PHP\8.3\php.ini
cgi.fix_pathinfo=0
fastcgi.impersonate=1
date.timezone=UTC
extension_dir="ext"
expose_php=Off
```

PHP 加载错 ini 时，看 `php --ini` / phpinfo。`PHPRC` 可以强制目录，但每版本独立目录 + php-cgi 旁边的 ini 更简单。

## 验证

```powershell
& C:\PHP\8.3\php-cgi.exe -v
& C:\PHP\8.4\php-cgi.exe -v
Get-WebConfiguration -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/fastCgi' |
  Select-Object -ExpandProperty Collection
```

给每个站点放一个 `info.php`，确认 `PHP Version` 和 `Loaded Configuration File`。测完删掉。

> **警告: 应用池不是 PHP 版本开关**
>
> 两个应用池可以跑同一个 PHP 二进制。两个站点都继承同一个 `*.php` handler，就都用那个 `scriptProcessor`。池只控制身份/进程隔离。

## 升级路径

1. 新版本装在旧版本旁边。
2. 先用站点级 handler 测一个站点。
3. 比对扩展和 `php.ini`。
4. 逐站迁移。
5. 回滚不再需要才删旧 FastCGI 应用和目录。

## 实验室边界

PHP 8.4.27 NTS + IIS FastCGI 在 VM 361 验证。8.3 并存为 E1；在 Server 2025 上照此操作并记录两个 phpinfo 后再标 E2。

## 来源

- [PHP — Windows 下载](https://windows.php.net/downloads/releases/)
- [PHP — 配置文件](https://www.php.net/manual/zh/configuration.file.php)
- [Microsoft Learn — FastCGI](https://learn.microsoft.com/zh-cn/iis/configuration/system.webserver/fastcgi/)

---

来源页面: https://winbook.fyi/zh/server/runtimes/php-multi-version/
