php 8.5 zts 版本不存在,当前最新稳定版为8.3,8.4处于rc阶段;frankenphp要求使用其专用分支源码、启用--enable-zts、链接libcoro并构建libphp.so。

PHP 8.5 ZTS 版本目前不存在
PHP 官方从未发布过 8.5 版本,更不存在所谓“ZTS”或“线程安全版”的 8.5。截至 2024 年中,PHP 最新稳定版是 8.3(8.4 处于 RC 阶段),而 8.5 连开发代号都未公布——它只是个虚构版本号。
你实际想装的,大概率是:
-
PHP 8.3或8.4的 ZTS(Zend Thread Safety)构建版 - 用于搭配
FrankenPHP(它依赖 ZTS +libcoro实现协程)
FrankenPHP 要求的 PHP 构建方式很特殊
FrankenPHP 不是普通 PHP SAPI,它不走 fpm 或 cli,而是把 PHP 嵌入 Go 进程,靠 ZTS + 协程调度器协作。所以它需要:
- 必须启用
--enable-zts编译选项(否则启动直接报错:PHP was not compiled with Zend Thread Safety (ZTS)) - 不能用系统包管理器(如 apt/yum)安装的 PHP:它们默认关闭 ZTS,且无对应
libphp.so - 必须从源码编译,且显式链接
libcoro(FrankenPHP 启动时会检查coro_create符号) - 推荐使用 FrankenPHP 官方提供的
build.sh脚本(位于frankenphp/php-src分支),它已适配 PHP 8.3+ ZTS 构建流程
示例关键编译参数片段(非完整命令):
立即学习“PHP免费学习笔记(深入)”;
./configure \ --enable-zts \ --with-coroutine=libcoro \ --without-apache2handler \ --disable-cgi \ --disable-fpm \ --enable-embed=shared
常见错误:用错 PHP 源码分支或忽略 libcoro
直接 clone 官方 php-src 主干代码并加 --enable-zts 是不够的。FrankenPHP 依赖的 libcoro 补丁尚未合并进主干,必须用其维护的专用分支:
- PHP 8.3 → 对应
frankenphp:php-8.3分支(不是php:master) - PHP 8.4 → 目前仅
frankenphp:php-8.4RC 分支支持(需确认是否已同步最新补丁) - 漏装
libcoro-dev(Debian/Ubuntu)或libcoro-devel(RHEL/CentOS),会导致 configure 报错:coro.h: No such file or directory - 编译后找不到
libphp.so?检查是否启用了--enable-embed=shared;FrankenPHP 只加载这个动态库
FrankenPHP 启动时提示 “PHP version mismatch” 或 “failed to load libphp.so”
这通常不是 PHP 版本号问题,而是 ABI 兼容性断裂:
- FrankenPHP 二进制与你编译的 PHP 必须匹配同一 commit(尤其
php-src和frankenphprepo 的提交时间要接近) - 用
ldd build/libphp.so | grep coro确认是否真正链接了libcoro;若没输出,说明 configure 时没识别到库 - Linux 上注意 SELinux 或文件权限:FrankenPHP 需要读取
libphp.so,且该 so 文件不能被 setuid/setgid 限制 - macOS 用户额外注意:FrankenPHP 当前仅支持 Intel 架构下的 PHP ZTS 构建(Apple Silicon 支持仍不稳定,易出现
bus error)
最稳妥路径:按 frankenphp/docs/building.md 步骤来,别跳过 git submodule update --init —— 那里面藏着 patched libcoro。
ZTS 不是开关,是整条工具链的协同结果;少一个 patch、错一个子模块、漏一个头文件,都会卡在启动前。别信“改个 configure 就行”。











