PHP官方宣布:FrankenPHP现已正式提供官方Windows支持!
自项目首次发布以来,支持原生Windows一直是社区呼声最高的功能。虽然很多开发者通过WSL(Windows Subsystem for Linux)成功运行了FrankenPHP,但原生的、无缝的体验一直是开发团队努力追逐的目标。
如今,这个目标已经实现。你现在可以原生在Windows上运行FrankenPHP,并且保持100%的兼容性,包括其杀手级特性:
- Worker Mode(工作模式)
- Hot Reloading(热重载)
性能表现亮眼
我们不仅仅满足于让它“能够运行”,更追求让它“运行得飞快”。社区早期的基准测试已经给出了令人惊艳的结果。
有用户在同一台Windows Server 2022服务器上,将经过优化的Nginx + PHP-FPM环境与FrankenPHP进行了对比。结果非常直观:仅仅更换了服务器运行时,就获得了3.6倍的性能提升(增幅超过260%)。
此外,开发者 @henderkes 在Pull Request中提供的更全面的基准测试,也进一步证实了在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风格的编译选项(这是CGO所偏好的),但底层使用微软的STL和运行时库。这简直是完美的解决方案。
在团队调研并准备向Go项目提交补丁以实现这一功能时,惊喜地发现Google的工程师已经悄悄地提交了一个完美的补丁,正好实现了这个功能。这个补丁被合并到了 Go 1.26 中。
借助Go 1.26的这一新能力,再配合lld-link链接器,团队终于能够使用与编译PHP完全相同的工具链来编译FrankenPHP。
所有测试,全部通过
最终的成果是一个原生的Windows二进制文件,它直接链接了官方、稳定的PHP构建。
最关键的一点是:由于使用了官方的PHP构建,Windows上所有原生支持的PHP扩展都能在FrankenPHP中开箱即用。这对于依赖特定扩展的PHP项目至关重要。
团队还修复了代码中剩余的Windows兼容性细节,并高兴地宣布:所有测试用例全部通过。
- 原生Windows二进制文件
- 完整的PHP扩展支持
- Worker模式
- 热重载功能
这项复杂工作的完成,离不开Intelligence X和Les-Tilleuls.coop的慷慨赞助。开源项目的可持续发展实属不易,正是这些支持让解决深层次技术难题、维护生态健康成为可能。
原文链接:https://dunglas.dev/2026/03/windows-support-for-frankenphp-its-finally-alive
对于更多技术资讯和开发讨论,欢迎访问云栈社区与开发者们交流。