CatchAdmin PHP 后台管理框架 Logo CatchAdmin

FrankenPHP 原生支持 Windows 了

发表于 2026 年 3 月 6 日,作者:Kévin Dunglas

FrankenPHP 现已正式提供官方 Windows 支持,并立即可用。

自项目发布以来,原生支持一直是被提及最多的需求之一。现在,这件事终于完成。你已经可以在 Windows 上原生运行 FrankenPHP,并获得 100% 兼容支持,包括 Worker Mode、Hot Reloading 等核心特性。

性能表现

我们不只是希望它能运行,还希望它具备足够好的性能。社区已经给出了一些早期基准测试结果,整体表现相当突出。

有用户在同一台 Windows Server 2022 机器上,将 FrankenPHP 与一个已经过优化的 Nginx/PHP-FPM 环境进行了对比。结果很直接:仅仅切换服务器运行时,就获得了 3.6 倍性能提升,增幅超过 260%

此外,@henderkes 提供的一组更完整的基准测试,也进一步验证了 FrankenPHP 在 Windows 原生环境下、不同工作负载中的性能收益。

顺带补充一个实用建议:原生 Windows 支持在开发环境以及很多生产负载下都已经足够快,也足够方便;但如果目标是追求更高的极限吞吐量,那么通过 WSL 运行 FrankenPHP 仍然更有优势,因为 Linux 在底层 I/O 和网络架构上依旧更强。如果生产环境允许,优先选择 Linux 仍然是更稳妥的方案。

难点:两个编译器体系的冲突

为什么这件事花了这么久?

其实之前已经有一些开发者尝试将 FrankenPHP 移植到 Windows(非常感谢他们的探索),但除了常见的跨平台问题,例如文件路径和文件系统差异,我们还撞上了一堵更底层、更结构性的墙。

问题的核心可以概括为下面几点:

  • FrankenPHP 是一个 Go 库,它通过 CGO 调用 PHP 的 libphp
  • Windows 上的官方 PHP 构建使用 Visual Studio(MSVC)编译,以保证性能和稳定性
  • 但 Go 的 CGO 在 Windows 上长期不支持 Visual Studio,而是只支持 MinGW(GCC)
  • 这就留下了一个巨大的兼容性鸿沟:两边根本无法直接链接在一起

解决路径

我们尝试过几种方案,但最终都没有走通。

方案一:让 Windows 版 PHP 支持 GCC

我们考虑过给 PHP 打补丁,让它支持使用 GCC 编译。但 PHP 维护者并不希望引入额外复杂度,这一点可以理解。我们也希望直接使用官方二进制,以保证稳定性并避免生态分裂。

因此,依赖 Visual Studio(MSVC)之外的其他编译器并不可行。毕竟,MSVC 是 PHP 官方唯一支持的 Windows 编译器。

方案二:“Frankenstein” 构建方案(llvm-mingw)

我们也尝试过一个折中方案:使用 llvm-mingw 编译 FrankenPHP,再把它链接到官方 Visual Studio 编译的 PHP。

这个方案最终失败,原因是 标准库不匹配

当你把 MinGW 编译出来的二进制(使用 msvcrt.dll 或自己的运行时)与 MSVC 编译出来的二进制(使用 ucrt / vcruntime)混在一起时,就会遇到严重问题。比如一侧分配内存(malloc),另一侧去释放;或者尝试跨边界传递文件描述符,程序都会直接崩溃。

本质上,它们说的是两种不同方言的 “C”。

突破点:Go 1.26 与 clang

最后我们意识到,最合理的路径,是为 CGO 增加对 Visual Studio 提供的 Clang/LLVM 前端的支持。

如果你对这部分不熟悉,可以简单理解为:Visual Studio 自带一套 Clang,它可以作为 MSVC 编译器(cl.exe)的替代实现来工作。它接受 CGO 更适配的 GCC 风格参数,同时底层又使用微软的 STL 和运行时库。

也就是说,它结合了两边的优点。

就在我们调研现有方案、准备给 Go 提交补丁时,意外发现 Google 已经提交过一份非常关键、但几乎没有公开说明的实现,处理的正是这个问题。

这份补丁最终进入了 Go 1.26

借助 Go 新增的这项能力,再配合 lld-link 链接器,我们终于能够使用与 PHP 本身相同的工具链来编译 FrankenPHP。

测试结果

最终成果是:我们拿到了一个 原生 Windows 二进制,并且它直接链接到 PHP 官方提供的稳定版本二进制。

更关键的是,因为链接的是官方 PHP 构建,所以所有 Windows 上受支持的原生 PHP 扩展,在 FrankenPHP 中都能直接工作,无需额外适配。

随后,我们又针对 Windows 特有的一些细节更新了 FrankenPHP 代码库。现在可以确认:全部测试均已通过

  • ✅ 原生 Windows 二进制
  • ✅ 完整扩展支持
  • ✅ Worker Mode
  • ✅ Hot Reloading

致谢与赞助

这项复杂工作之所以能够完成,要感谢 Intelligence X 和 Les-Tilleuls.coop 的慷慨赞助。

开源项目的可持续性从来都不轻松。如果你的公司依赖 FrankenPHP、Caddy 或 API Platform,欢迎在 GitHub 上赞助我。正是这些支持,让我能够投入时间去解决这类底层技术难题,并持续维护一个健康、高效的生态。

现在就可以使用

这项支持已经合并到 Pull Request #2119。你现在就可以从发布页下载最新版 Windows 二进制。

也感谢所有参与调研和实现的人,尤其是 @TenHian 在早期探索阶段的工作,以及 @henderkes 在最终实现中投入的大量精力。

如果你平时主要在 Windows 上开发 PHP,现在已经可以直接试用 FrankenPHP。

本作品采用《CC 协议》,转载必须注明作者和本文链接