ASP.NET Web Pages 里运行 PHP?—— 2025 年有 4 种真实可行的方案
(从最推荐到最不推荐,逐个讲清楚)
| 方案 | 是否推荐 | 难度 | 性能 | 适用场景 | 一句话评价 |
|---|---|---|---|---|---|
| 1. 用 IIS + FastCGI 直接运行 PHP(官方正解) | 5 stars | ★★☆☆☆ | 极好 | 想在同一个网站下同时跑 .cshtml 和 .php | 2025 年最稳、最快、最干净的方案 |
| 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 分钟搞定:
- 下载最新 PHP(非线程安全版)
https://windows.php.net/download/
推荐:PHP 8.3 NTS x64(Zip 包) - 解压到 C:\php-8.3
- 把下面这行加到系统环境变量 Path
C:\php-8.3 - 在 IIS 里安装 CGI 角色(服务器管理器 → 添加角色和功能 → Web 服务器 → 应用程序开发 → CGI)
- 在你的 ASP.NET Web Pages 站点 → 处理程序映射 → 添加模块映射
请求路径:*.php
模块:FastCgiModule
可执行文件:C:\php-8.3\php-cgi.exe
名称:PHP via FastCGI
- 在站点根目录添加 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>
- 重启 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 文件夹就行!随时说一声就发你!