FrankenPHP 原生支持 Windows 了

简介: FrankenPHP 正式原生支持 Windows!基于 Go 1.26 对 MSVC Clang 的 CGO 支持,成功打通与官方 PHP(MSVC 编译)的链接难题,实现 100% 特性兼容——含 Worker Mode、Hot Reloading 及全部扩展。性能较 Nginx/PHP-FPM 提升超 260%,开箱即用。(239字)

FrankenPHP 原生支持 Windows 了

FrankenPHP 是什么

FrankenPHP 是一个基于 Caddy 和 PHP 构建的现代 PHP 应用服务器,目标是简化 PHP 应用的运行与部署。它既可以作为传统 PHP 应用的运行环境,也提供了 Worker Mode、Hot Reloading 等更偏现代化的能力,因此这两年在 PHP 社区里关注度一直不低。

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

自项目发布以来,Windows 原生支持一直是 FrankenPHP 社区呼声最高的需求之一。现在,这项能力已经正式落地。也就是说,FrankenPHP 已经可以在 Windows 上原生运行,并实现 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 打补丁,让 Windows 版 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。
FrankenPHP 原生支持 Windows 了

目录
相关文章
|
4月前
|
缓存 NoSQL API
当你的 PHP 应用的 API 没有限流时会发生什么?
PHP API若无限流,易遭流量洪峰、爬虫或攻击冲击,导致服务器过载、响应延迟甚至宕机。本文剖析限流缺失的性能与安全风险,指出常见误区(如忽略用户分级、算法低效、云环境适配失败),并提供基于Redis的中间件实现方案及生产部署要点,助你构建健壮、可扩展的API防护体系。(239字)
398 168
|
SQL 关系型数据库 MySQL
18 PDO你知道是什么吗?
路老师在知乎分享了PHP语言的知识,重点介绍了PDO(PHP Data Object)数据库抽象层。PDO旨在解决PHP早期版本的维护难题,提高代码的可移植性和兼容性。文章详细讲解了PDO的基本概念、特点、连接数据库的方法以及执行SQL语句的几种方式,包括`exec()`、`query()`、`prepare()`和`execute()`方法。适合PHP初学者深入了解和实践。
|
4月前
|
存储 缓存 安全
为什么 PHP 闭包要加 static?
PHP闭包默认隐式绑定$this,即使未使用也会延长对象生命周期,导致内存泄漏风险。加static可显式禁用$this绑定,避免意外引用,确保对象及时销毁。PHP 8.6将自动优化无$this使用的闭包,但显式声明static仍推荐——更安全、更清晰、兼容性更好。(239字)
319 151
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
40160 184
|
4月前
|
SQL 前端开发 JavaScript
PHP 的异步编程 该怎么选择
本文深入解析PHP异步编程演进:从4.3版Streams非阻塞I/O,到5.5生成器模拟协程,再到8.1原生Fiber;对比EventLoop与Promise(ReactPHP/Amp)方案,剖析回调地狱破解之道,并给出选型建议——重链式逻辑选ReactPHP,重同步体验选Amp+Revolt事件循环。(239字)
446 163
|
前端开发 Java Linux
cp: can‘t stat ‘/usr/share/zoneinfo/Asia/Shanghai‘: No such file or directory
cp: can‘t stat ‘/usr/share/zoneinfo/Asia/Shanghai‘: No such file or directory
|
10月前
|
存储 运维 安全
阿里云服务器2核4G与4核8G配置解析:实例规格、价格及选择指南
阿里云服务器2核4G和4核8G配置凭借其均衡的性能与性价比,成为中小企业及开发者群体的热门选择。通用算力型u1实例2核4G5M带宽80G ESSD Entry云盘特惠价199元1年,个人用户最低531.79元1年,4核8G配置价格最低的是通用算力型u1实例,活动价格为955.58元1年起,除此之外,还有计算型c7、c9i、c8y等计算型实例有2核4G与4核8G配置可选。具体配置还需要看想要购买的云服务器实例规格和配置及带宽大小。本文将结合2025年最新活动价格,深度解析阿里云服务器2核4G与4核8G配置的实例规格、适用场景及选择策略,以供参考。
|
7月前
|
网络协议 安全 应用服务中间件
Debian 11.1 安装Nginx 并开启HTTP3 详细教程
本文介绍如何在Linux系统中从源码编译安装支持HTTP/3的Nginx 1.25.5。涵盖系统更新、依赖安装、源码下载、配置编译参数(含HTTP/3模块)、安装及验证全过程,并提供启用HTTP/2与HTTP/3共存的nginx.conf配置示例,确保兼容性。最后提醒开放云服务器安全组的TCP/UDP 443端口以支持QUIC协议。
411 10
|
8月前
|
XML 存储 JSON
Protocol Buffers (Protobuf) 详解
Protocol Buffers(Protobuf)是Google推出的高效数据序列化格式,语言无关、平台无关,比JSON和XML更小更快。支持多语言代码生成,具备良好的兼容性与类型安全,广泛应用于gRPC、微服务通信及数据存储等场景。
993 5
|
应用服务中间件 nginx 缓存
一文掌握 Nginx 反向代理:从入门到生产级配置
本文全面解析Nginx反向代理,涵盖基础概念、负载均衡策略、SSL终止、缓存、安全防护及生产级配置,助你从入门到精通,构建高性能、高可用的Web架构。
1820 1

热门文章

最新文章