ASP.NET Web Pages – PHP

ASP.NET Web Pages 里运行 PHP?—— 2025 年有 4 种真实可行的方案

(从最推荐到最不推荐,逐个讲清楚)

方案是否推荐难度性能适用场景一句话评价
1. 用 IIS + FastCGI 直接运行 PHP(官方正解)5 stars★★☆☆☆极好想在同一个网站下同时跑 .cshtml 和 .php2025 年最稳、最快、最干净的方案
2. 用 HttpHandler 调用 PHP.exe(纯 .NET 实现)4 stars★★★☆☆只想偶尔调用几个 PHP 文件,不想装 PHP零配置,但略慢
3. 用反向代理(Nginx / IIS ARR)3 stars★★★★☆大流量,想把 PHP 完全独立部署架构最清晰,但要多开一个站点
4. 用 Process.Start 启动 php-cgi(最原始)1 star★★★★★基本没人用了,仅作了解不要用!!!

下面只详细讲 前两种(真正实用的)

方案 1:IIS + FastCGI 直接运行 PHP(2025 年最推荐!)

步骤超简单,5 分钟搞定:

  1. 下载最新 PHP(非线程安全版)
    https://windows.php.net/download/
    推荐:PHP 8.3 NTS x64(Zip 包)
  2. 解压到 C:\php-8.3
  3. 把下面这行加到系统环境变量 Path
    C:\php-8.3
  4. 在 IIS 里安装 CGI 角色(服务器管理器 → 添加角色和功能 → Web 服务器 → 应用程序开发 → CGI)
  5. 在你的 ASP.NET Web Pages 站点 → 处理程序映射 → 添加模块映射
   请求路径:*.php
   模块:FastCgiModule
   可执行文件:C:\php-8.3\php-cgi.exe
   名称:PHP via FastCGI
  1. 在站点根目录添加 Web.config(和 ASP.NET Web Pages 的 Web.config 合并即可)
   <?xml version="1.0" encoding="UTF-8"?>
   <configuration>
     <system.webServer>
       <handlers>
         <add name="PHP-FastCGI" path="*.php" verb="*" 
              modules="FastCgiModule" 
              scriptProcessor="C:\php-8.3\php-cgi.exe" 
              resourceType="Unspecified" requireAccess="Script" />
       </handlers>

       <fastCgi>
         <application fullPath="C:\php-8.3\php-cgi.exe" 
                      arguments="" 
                      maxInstances="4" 
                      idleTimeout="300" 
                      activityTimeout="30" 
                      requestTimeout="90" 
                      instanceMaxRequests="10000"/>
       </fastCgi>
     </system.webServer>
   </configuration>
  1. 重启 IIS → 完成!

现在你的网站可以同时运行:

/Default.cshtml      ← Razor 页面
/About.php           ← PHP 页面
/api/data.php        ← PHP 接口
/blog/index.php      ← WordPress、ThinkPHP、Discuz 全部可以直接跑!

完美共存,互不影响,性能接近原生!

方案 2:纯 .NET 方式调用 PHP(不用装 PHP 也能跑)

适合:只想偶尔调用几个 PHP 文件(比如老项目遗留一个工具)

<!-- App_Code/PhpRunner.cshtml -->
@helper RunPhp(string phpFile, string queryString = "")
{
    var phpPath = @"C:\php-8.3\php.exe";   // 或者 php-cgi.exe
    var script = Server.MapPath(phpFile);

    var startInfo = new System.Diagnostics.ProcessStartInfo {
        FileName = phpPath,
        Arguments = $"\"{script}\" {queryString}",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        CreateNoWindow = true
    };

    using(var process = System.Diagnostics.Process.Start(startInfo)) {
        var output = process.StandardOutput.ReadToEnd();
        process.WaitForExit();
        @Html.Raw(output)
    }
}

页面里直接调用:

<h2>调用 PHP 生成的报表</h2>
@PhpRunner.RunPhp("~/reports/sales.php", "year=2025&month=11")

或者做成 HttpHandler(性能更好):

// App_Code/PhpHandler.cs
public class PhpHandler : IHttpHandler
{
    public bool IsReusable { get { return true; } }

    public void ProcessRequest(HttpContext context)
    {
        var phpFile = context.Request.Path.Replace(".ashx", ".php");
        var physical = context.Server.MapPath(phpFile);

        var psi = new ProcessStartInfo(@"C:\php-8.3\php-cgi.exe", $"-f \"{physical}\"")
        {
            UseShellExecute = false,
            RedirectStandardOutput = true,
            CreateNoWindow = true
        };

        using (var p = Process.Start(psi))
        {
            context.Response.Write(p.StandardOutput.ReadToEnd());
        }
    }
}

然后访问:/handlers/report.ashx → 实际运行 /reports/report.php

真实案例(我见过的最优雅用法)

很多公司老系统是 PHP 新系统用 ASP.NET Web Pages 开发,做法是:

www.mysite.com          → ASP.NET Web Pages(Razor)
www.mysite.com/admin/   → 原来的 ThinkPHP 后台(直接用方案1跑)
www.mysite.com/api/     → PHP 接口(共存)
www.mysite.com/old/     → 老 Discuz 论坛(直接放进去就行)

一个域名、一个站点、一个 IIS,所有语言和谐共处!

终极建议(2025 年版本)

你想干啥?推荐方案
新项目 + 偶尔要跑几个老 PHP 文件方案 1(装个 PHP 最省事)
想把 WordPress/ThinkPHP 嵌到 Razor 站点方案 1(最快、最稳)
完全不想装 PHP方案 2(纯 .NET 调用)
大流量、要独立部署方案 3(Nginx 反向代理)

结论:2025 年了,ASP.NET Web Pages 和 PHP 完全可以和平共处,甚至运行在同一个网站下!

需要我给你一个「Razor + PHP 混合项目模板」(包含 Web.config、目录结构、登录共享、单点登录示例)吗?
复制到 IIS 3 分钟就能跑,新页面用 Razor,老页面直接扔 PHP 文件夹就行!随时说一声就发你!

文章已创建 2863

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部