可通过phpinfo()中thread safety字段判断:enabled为zts(线程安全),disabled为nts;frankenphp官方默认使用zts版以支持多线程worker模式,但自定义构建需实测确认。

看 phpinfo() 里的 Thread Safety 字段
FrankenPHP 内嵌的 PHP 运行时是否为 ZTS(线程安全)版,和普通 PHP 一样,最直接的方式是调用 phpinfo() 查看。FrankenPHP 启动后,只要能访问到 PHP 脚本(比如放一个 info.php),就能拿到完整输出。
关键不是找 “FrankenPHP” 字样,而是定位到 Thread Safety 这一行:
- 值为
enabled→ 表示当前 PHP 是 ZTS 编译的(即线程安全) - 值为
disabled→ 表示 NTS(非线程安全)
注意:FrankenPHP 官方预编译二进制默认只提供 ZTS 版本(因为要支持多线程 Worker 模式),但如果你自己从源码编译、或用了某些定制构建,就仍需实测确认。别光信文档,得看运行时真实输出。
检查 php -v 输出括号里的 TS/NTS 标识
FrankenPHP 的 CLI 模式(frankenphp serve 或直接调用 frankenphp 二进制)也暴露 PHP 版本信息。执行:
frankenphp -v
观察第一行或第二行末尾括号内容:
-
(TS)→ ZTS 版本 -
(NTS)→ 非线程安全版本
如果没显示括号,说明该构建未携带明确标识,此时必须回退到 phpinfo() 或 php-config --configure-options 验证。FrankenPHP 的 Go 层不干预 PHP 的编译标志,这个括号完全取决于底层 libphp 是怎么编译的。
为什么 FrankenPHP 必须用 ZTS?
FrankenPHP 的核心能力 —— Worker 常驻模式 —— 依赖 PHP 在多个 OS 线程中安全复用同一份运行时状态。这只有 ZTS 版本才能保证:
- NTS 版本没有线程锁、无 TSRM(Thread Safe Resource Manager)支持,多线程并发调用会触发内存冲突或崩溃
- 即使你暂时没开
worker,FrankenPHP 默认仍启用固定数量的 PHP 线程处理请求(见frankenphp_total_threads指标),这些线程共享同一个 SAPI 上下文 - 所有官方 Docker 镜像、GitHub Releases 下载的
frankenphp二进制,底层 PHP 均为 ZTS 构建;但自定义构建或某些第三方打包可能忽略这点
所以,如果你在启用 worker 后遇到随机 segfault、zend_mm_heap corrupted 或线程卡死,第一反应就该查 ZTS 是否真实生效 —— 很多问题根源不在配置,而在 PHP 运行时本身就不支持线程安全。
别被 Caddyfile 或 metrics 指标误导
frankenphp_busy_threads、frankenphp_total_threads 这类指标即使有数值,也不能反推 PHP 是 ZTS。它们只是 FrankenPHP Go 层统计的线程数,而底层 PHP 如果是 NTS,可能在第 2 个并发请求进来时就崩溃,指标反而“看起来正常”。同样,Caddyfile 里写 worker 或 metrics 并不自动保证线程安全 —— 它们只是开关,真正执行的 PHP 解释器是否扛得住,得靠 phpinfo() 或 php -v 实锤。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











