phpinfo能显示线程安全吗_查ZTS状态用phpinfo法【判识】

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=20250829,NTSapi=20250829,TS
  • TS 表示启用了线程安全(ZTS on),NTS 表示非线程安全(ZTS off)
  • 注意:这个字段写在「Zend Extension Build」行末尾,不是单独一行,容易被忽略

为什么不能只看 “Thread Safety” 这个标题行

有些 PHP 版本(尤其是 Windows 下的官方二进制包)会在 phpinfo() 顶部显眼位置显示一个叫 Thread Safety 的条目,值为 enableddisabled。但这行信息并不可靠:

  • 它只反映 SAPI 层(如 Apache、IIS)是否以线程模式加载 PHP,不等于底层 Zend 引擎是否编译为 ZTS
  • Linux 下多数发行版打包的 PHP(如 Ubuntu 的 php-fpm)即使启用了多进程模型,Thread Safety 行也常显示 disabled,但实际 Zend Extension BuildNTS —— 这才是真实状态
  • 真正决定扩展能否加载、pthread 类是否可用、是否支持 pcntl_fork 等行为的,是 ZTS 编译标志,不是这个标题行

命令行下快速查 ZTS 状态(绕过 phpinfo)

如果没法访问 Web 环境,或者想自动化判断,用命令行更直接:

php -r "echo PHP_ZTS ? 'ZTS enabled' : 'ZTS disabled';"

或查看编译参数:

php -i | grep "Configure Command"

输出中若含 --enable-zts,即为 ZTS;若含 --di

sable-zts 或无此参数,默认为 NTS。

扩展加载失败时,ZTS 不匹配是最常见元凶

装不上 redis.soigbinary.so 或自定义扩展?报错类似 undefined symbol: zend_objects_store_add_refcannot load shared object file?大概率是 ZTS 状态不一致:

  • PHP 本身是 NTS 编译,但你下载的扩展是 TS 版(常见于 Windows 官方 DLL 包)
  • PHP 是 TS 编译(如某些 Apache 模块版),但扩展是 NTS 版
  • php -v 显示的版本号和 phpinfo() 不一致(比如 CLI 和 FPM 用的是不同二进制),导致你以为配对了,其实没配对

ZTS 状态一旦不匹配,扩展根本不会初始化,连错误日志都可能不吐全。别跳过这一步验证。