ZTS状态需查看phpinfo()中“Zend Extension Build”行末尾的NTS或TS标识,NTS表示ZTS off,TS表示ZTS on;命令行可用php -r "echo PHP_ZTS ? 'ZTS enabled' : 'ZTS disabled';"快速验证。

phpinfo 页面里怎么看 ZTS(线程安全)状态
能,但得找对地方。PHP 编译时是否启用 ZTS(Zend Thread Safety),会在 phpinfo() 输出的「Zend Engine」区块中明确标出,不是所有位置都显示,也不是靠搜索“thread”就能准确定位。
- 直接访问
phpinfo()页面(比如http://localhost/info.php),用浏览器 Ctrl+F 搜索Zend Extension Build - 找到类似这样的字符串:
api=20220829,NTS或api=20220829,TS -
TS表示启用了线程安全(ZTS on),NTS表示非线程安全(ZTS off) - 注意:这个字段写在「Zend Extension Build」行末尾,不是单独一行,容易被忽略
为什么不能只看 “Thread Safety” 这个标题行
有些 PHP 版本(尤其是 Windows 下的官方二进制包)会在 phpinfo() 顶部显眼位置显示一个叫 Thread Safety 的条目,值为 enabled 或 disabled。但这行信息并不可靠:
- 它只反映 SAPI 层(如 Apache、IIS)是否以线程模式加载 PHP,不等于底层 Zend 引擎是否编译为 ZTS
- Linux 下多数发行版打包的 PHP(如 Ubuntu 的
php-fpm)即使启用了多进程模型,Thread Safety行也常显示disabled,但实际Zend Extension Build是NTS—— 这才是真实状态 - 真正决定扩展能否加载、
pthread类是否可用、是否支持pcntl_fork等行为的,是ZTS编译标志,不是这个标题行
命令行下快速查 ZTS 状态(绕过 phpinfo)
如果没法访问 Web 环境,或者想自动化判断,用命令行更直接:
php -r "echo PHP_ZTS ? 'ZTS enabled' : 'ZTS disabled';"
或查看编译参数:
立即学习“PHP免费学习笔记(深入)”;
php -i | grep "Configure Command"
输出中若含 --enable-zts,即为 ZTS;若含 --disable-zts 或无此参数,默认为 NTS。
扩展加载失败时,ZTS 不匹配是最常见元凶
装不上 redis.so、igbinary.so 或自定义扩展?报错类似 undefined symbol: zend_objects_store_add_ref 或 cannot load shared object file?大概率是 ZTS 状态不一致:
- PHP 本身是 NTS 编译,但你下载的扩展是 TS 版(常见于 Windows 官方 DLL 包)
- PHP 是 TS 编译(如某些 Apache 模块版),但扩展是 NTS 版
-
php -v显示的版本号和phpinfo()不一致(比如 CLI 和 FPM 用的是不同二进制),导致你以为配对了,其实没配对
ZTS 状态一旦不匹配,扩展根本不会初始化,连错误日志都可能不吐全。别跳过这一步验证。











