官宣
PHP 官方宣布:FrankenPHP 现已正式提供官方 Windows 支持!
从项目首次发布以来,这一直是呼声最高的功能。很多人在 Windows 上通过 WSL(Windows Subsystem for Linux)成功运行了 FrankenPHP,但原生支持一直是我们追逐的“白鲸”。
今天,这场追逐终于结束了。你现在可以原生在 Windows 上运行 FrankenPHP,兼容性 100%,包括我们的杀手级功能:
性能炸裂
我们不只是想让它“能跑”,我们想要它“跑得快”。社区早期的基准测试已经给出了惊艳的结果。
一位用户在同一台 Windows Server 2022 机器上,把已经优化的 Nginx + PHP-FPM 环境与 FrankenPHP 做了对比,结果非常直观:仅仅更换服务器运行时,就获得了 3.6 倍的性能提升(增幅超过 260%)。
另外,@henderkes 在 PR 中提供的更全面的基准测试也进一步证实了在 Windows 原生环境下各种负载的显著性能提升。
速度小贴士:虽然原生 Windows 支持已经非常快,也非常适合开发和很多生产场景,但如果追求绝对极致的吞吐量,目前通过 WSL 运行 FrankenPHP 仍然会更快(因为 Linux 底层的 I/O 和网络架构优势)。生产环境如果可以,还是优先考虑 Linux!
难题:两个编译器的故事
为什么花了这么久才实现?
早期有一些勇敢的开发者尝试过移植(非常感谢他们!),但除了常见的跨平台问题(路径、文件系统等)外,我们遇到了一个根本性的、结构性的障碍。
简单来说技术难点是:
- FrankenPHP 是一个 Go 库,通过 CGO 调用 PHP 的 libphp
- Windows 上的官方 PHP 构建使用 Visual Studio(MSVC)编译,以保证最佳性能和稳定性
- 但 Go 的 CGO 历史上在 Windows 上只支持 MinGW(GCC),完全不支持 Visual Studio
这导致两者根本无法链接在一起。
解决方案的探索之路
我们尝试过好几条路,每一条都碰壁:
方案1:让 PHP 支持在 Windows 上用 GCC 编译考虑给 PHP 打补丁支持 GCC 编译。但 PHP 官方维护者(可以理解)不愿意引入这种额外复杂度。我们希望绝对稳定、不碎片化、直接使用官方二进制,所以不能接受换用非官方唯一支持的 MSVC 之外的编译器。
方案2:“弗兰肯斯坦”构建(llvm-mingw)尝试用 llvm-mingw 编译 FrankenPHP,再链接官方 MSVC 编译的 PHP。但因为标准库不匹配(MinGW 用 msvcrt.dll,MSVC 用 ucrt/vcruntime),内存分配/释放、文件描述符传递等跨边界操作会直接崩溃。相当于两种不同的“C语言方言”。
突破:Go 1.26 + Clang
最终我们发现最优路径是:让 CGO 支持 Visual Studio 自带的 Clang/LLVM 前端。
不熟悉的人可能不知道,Visual Studio 内置了一个 Clang 版本,可以作为 MSVC 编译器(cl.exe)的直接替代品。它接受 GCC 风格的 flag(CGO 喜欢),但底层使用微软的 STL 和运行时库。简直是两全其美。
在调研和准备给 Go 提交补丁时,我们意外发现 Google 已经悄悄提交了一个完美的补丁,正好实现了这个功能。
这个补丁被合并到了 Go 1.26 中。
借助 Go 的新能力,再配合 lld-link 链接器,我们终于可以用和 PHP 完全相同的工具链来编译 FrankenPHP。
全绿测试
最终成果是一个原生 Windows 二进制,直接链接官方、稳定的 PHP 构建。
最关键的是:因为使用官方 PHP 构建,Windows 上所有原生支持的 PHP 扩展在 FrankenPHP 中开箱即用。
我们还修复了代码中剩余的 Windows 兼容性细节,很高兴地报告:所有测试全部通过。
致谢与赞助
这项复杂的工作得以完成,离不开 Intelligence X 和 Les-Tilleuls.coop 的慷慨赞助。
开源的可持续性真的很不容易。如果你的公司依赖 FrankenPHP、Caddy 或 API Platform,欢迎考虑在 GitHub 上赞助我。你们的资助让我能持续投入时间解决这类深层技术难题,保持整个生态健康且高效。
祝 Windows 上的各位编码愉快!
原文:https://dunglas.dev/2026/03/windows-support-for-frankenphp-its-finally-alive