Windows 下使用 php-cgi.exe 配置多版本 PHP 运行环境

引言

在 Windows 环境下,PHP 的官方构建不包含 php-fpm.exe,因此无法直接使用 PHP-FPM 来处理高并发 PHP 请求。然而,PHP 提供了 php-cgi.exe,通过 FastCGI 协议可以实现类似 PHP-FPM 的功能,配合 Nginx 等 Web 服务器运行 PHP 应用。本文将详细介绍如何在 Windows 上使用 php-cgi.exe 配置 PHP 运行环境,支持多个 PHP 版本(例如 PHP 7.4 和 PHP 8.4),并无需创建 php-fpm.conf 文件。以下内容基于 PHP 8.4.10(NTS,Visual C++ 2022 x64)和其他常见版本。

为什么 Windows 上没有 php-fpm.exe

PHP-FPM(FastCGI Process Manager)是为 Unix/Linux 系统设计的进程管理器,依赖 fork() 机制,而 Windows 不支持此机制。因此,官方 Windows PHP 构建不包含 php-fpm.exe,也无需 php-fpm.conf 配置文件。取而代之的是 php-cgi.exe,它支持 FastCGI 协议,可以启动 FastCGI 服务,监听指定端口,处理 Nginx 或其他 Web 服务器的 PHP 请求。

在 Windows 上,php-cgi.exe 是非线程安全(Non-Thread Safe, NTS)版本 PHP 的标配,适合与 Nginx 配合使用。通过命令行参数(如 -b 指定端口)或 php.ini 配置,php-cgi.exe 可以实现类似 PHP-FPM 的功能,无需额外的配置文件。

配置单版本 PHP 运行环境

1. 确认 PHP 安装

确保 PHP 已正确安装,包含 php-cgi.exe。以 PHP 8.4.10 为例,假设安装目录为 C:\php

  1. 检查文件
    • 确认 C:\php 包含 php.exephp-cgi.exe
      dir C:\php\php-cgi.exe
      
    • 运行版本检查:
      php -v
      php-cgi.exe -v
      
      输出示例:
      PHP 8.4.10 (cli) (built: Jul 2 2025 11:04:30) (NTS Visual C++ 2022 x64)
      PHP 8.4.10 (cgi-fcgi) (built: Jul 2 2025 11:04:30) (NTS Visual C++ 2022 x64)
      
  2. 下载正确版本(若缺少 php-cgi.exe):
    • 访问 windows.php.net/download,下载 NTS 版本(如 php-8.4.x-Win32-vs16-x64.zip)。
    • 解压到 C:\php,确保包含 php-cgi.exe

2. 配置 php.ini

  1. C:\php 中,复制 php.ini-developmentphp.ini
    copy C:\php\php.ini-development C:\php\php.ini
    
  2. 编辑 php.ini,设置 FastCGI 和基本参数:
    cgi.fix_pathinfo=0
    cgi.force_redirect=1
    fastcgi.impersonate=1
    cgi.rfc2616_headers=0
    extension_dir="ext"
    date.timezone=Asia/Shanghai
    error_log=C:\php\php_errors.log
    extension=gd
    extension=mysqli
    extension=pdo_mysql
    
  3. 验证配置:
    php --ini
    
    确认 Loaded Configuration FileC:\php\php.ini

3. 启动 FastCGI 服务

  1. 创建批处理脚本(C:\php\start-php-cgi.bat):
    @echo off
    echo Starting PHP FastCGI on port 9000...
    cd /d C:\php
    php-cgi.exe -b 127.0.0.1:9000
    
  2. 双击运行 start-php-cgi.bat,启动 php-cgi.exe 并监听 127.0.0.1:9000
  3. 验证端口:
    netstat -an | find "9000"
    
    输出示例:
    TCP 127.0.0.1:9000 0.0.0.0:0 LISTENING
    

4. 配置 Nginx

  1. 假设 Nginx 安装在 C:\nginx,编辑 C:\nginx\conf\nginx.conf
    http {
        server {
            listen 80;
            server_name localhost;
            root C:/www;
            index index.php index.html;
            location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            }
        }
    }
    
  2. 测试和重启 Nginx:
    C:\nginx\nginx.exe -t
    C:\nginx\nginx.exe -s reload
    

5. 测试

  1. C:\www 创建 test.php
    <?php
    phpinfo();
    ?>
    
  2. 浏览器访问 http://localhost/test.php,确认 PHP 版本为 8.4.10。

配置多版本 PHP 运行环境

要在同一台 Windows 服务器上运行多个 PHP 版本(例如 PHP 7.4 和 PHP 8.4),需为每个版本分配不同的 FastCGI 端口。

1. 安装多版本 PHP

  1. 下载 PHP 7.4(NTS 版本)并解压到 C:\php74
  2. 确认 C:\php74\php-cgi.exe 存在。
  3. 配置 C:\php74\php.ini,类似单版本配置。

2. 启动多版本 FastCGI 服务

  1. 为 PHP 7.4 创建批处理脚本(C:\php74\start-php74-cgi.bat):
    @echo off
    echo Starting PHP 7.4 FastCGI on port 9000...
    cd /d C:\php74
    php-cgi.exe -b 127.0.0.1:9000
    
  2. 为 PHP 8.4 创建批处理脚本(C:\php84\start-php84-cgi.bat):
    @echo off
    echo Starting PHP 8.4 FastCGI on port 9001...
    cd /d C:\php84
    php-cgi.exe -b 127.0.0.1:9001
    
  3. 运行两个脚本:
    C:\php74\start-php74-cgi.bat
    C:\php84\start-php84-cgi.bat
    
  4. 验证端口:
    netstat -an | find "9000"
    netstat -an | find "9001"
    

3. 配置 Nginx 支持多版本

  1. 编辑 C:\nginx\conf\nginx.conf
    http {
        server {
            listen 80;
            server_name site1.local;
            root C:/www/site1;
            index index.php index.html;
            location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;  # PHP 7.4
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            }
        }
        server {
            listen 80;
            server_name site2.local;
            root C:/www/site2;
            index index.php index.html;
            location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9001;  # PHP 8.4
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            }
        }
    }
    
  2. 编辑 C:\Windows\System32\drivers\etc\hosts
    127.0.0.1 site1.local
    127.0.0.1 site2.local
    
  3. 测试和重启 Nginx:
    C:\nginx\nginx.exe -t
    C:\nginx\nginx.exe -s reload
    

4. 测试多版本

  1. C:\www\site1C:\www\site2 创建 test.php
    <?php
    phpinfo();
    ?>
    
  2. 访问:
    • http://site1.local/test.php(显示 PHP 7.4 信息)
    • http://site2.local/test.php(显示 PHP 8.4 信息)

自动化运行(可选)

为避免每次手动运行批处理脚本,可使用 NSSM 将 php-cgi.exe 配置为 Windows 服务:

  1. 下载 NSSM(nssm.cc)。
  2. 安装服务:
    nssm install php-cgi-74 C:\php74\php-cgi.exe
    nssm set php-cgi-74 AppParameters -b 127.0.0.1:9000
    nssm install php-cgi-84 C:\php84\php-cgi.exe
    nssm set php-cgi-84 AppParameters -b 127.0.0.1:9001
    
  3. 启动服务:
    nssm start php-cgi-74
    nssm start php-cgi-84
    

注意事项

  1. 端口冲突

    • 确保每个 PHP 版本使用不同端口(如 90009001)。
    • 使用 netstat -an | find "LISTEN" 检查端口占用。
  2. 性能限制

    • Windows 上的 php-cgi.exe 不如 Linux 的 PHP-FPM 高效,适合中小型应用。
    • 高并发场景可考虑使用 WSL2 或 Docker 运行 Linux PHP-FPM。
  3. 日志排查

    • 检查 C:\php\php_errors.log(由 php.inierror_log 指定)。
    • 若启动失败,运行 php-cgi.exe -b 127.0.0.1:9000 查看错误。
  4. 安全性

    • 避免以管理员权限运行 php-cgi.exe
    • 使用防火墙限制端口访问(如 90009001)。

总结

Windows 上的 PHP 不包含 php-fpm.exephp-fpm.conf,但通过 php-cgi.exe 可以实现 FastCGI 服务,无需额外配置文件。php-cgi.exe 通过命令行参数(如 -b 127.0.0.1:9000)指定端口,配合 Nginx 可轻松运行 PHP 应用。多版本 PHP 环境通过不同端口(如 90009001)区分,批处理脚本或 NSSM 可简化管理。

No comments

公司简介

 

自1996年以来,公司一直专注于域名注册、虚拟主机、服务器托管、网站建设、电子商务等互联网服务,不断践行"提供企业级解决方案,奉献个性化服务支持"的理念。作为戴尔"授权解决方案提供商",同时提供与公司服务相关联的硬件产品解决方案。
备案号: 豫ICP备05004936号-1

联系方式

地址:河南省郑州市经五路2号

电话:0371-63520088

QQ:76257322

网站:800188.com

电邮:该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。