最准方式是查看phpinfo()中Thread Safety:enabled为TS版,disabled为NTS版;命令行可用php -r "echo ZEND_THREAD_SAFE ? 'TS' : 'NTS';"快速判断;Windows包名含ts/nts后缀,Linux/macOS须用前述方法;选错会导致Apache拒绝启动或Nginx性能下降及扩展加载失败。

直接看 phpinfo() 里的 Thread Safety
这是最准、最无歧义的方式。新建一个 info.php,写入:
用浏览器访问后,在页面搜索 Thread Safety:
- 显示
enabled→ 是TS版 - 显示
disabled→ 是NTS版
注意:这个值是编译时硬编码进 PHP 的,运行时不可更改,所以只要 PHP 二进制没换,结果就绝对可靠。
命令行快速判断:ZEND_THREAD_SAFE 常量
不用开网页,适合 CI/CD 或脚本中自动检测:
立即学习“PHP免费学习笔记(深入)”;
php -r "echo ZEND_THREAD_SAFE ? 'TS' : 'NTS';"
输出 TS 或 NTS,一目了然。原理是 PHP 编译时会根据是否启用 --enable-maintainer-zts 定义该常量,比解析 phpinfo() 输出更轻量、更稳定。
常见误操作:
- 用
php -i | grep Thread可能漏掉关键词(比如输出被截断或含空格) - 依赖
php --version输出——它完全不包含 TS/NTS 信息
Windows 下看文件名后缀和扩展文件是否存在
官方 Windows 二进制包命名很直白:
-
php-8.3.12-Win32-vs16-x64-ts.zip→ts结尾 = TS 版 -
php-8.3.12-Win32-vs16-x64-nts.zip→nts结尾 = NTS 版
另外可检查 PHP 安装目录下有没有 php7apache2_4.dll(或对应版本的 php8apache2_4.dll):
- 有这个 DLL → 通常是 TS 版(专供 Apache ISAPI 模式)
- 没有这个 DLL,但有
php-cgi.exe且常配php-fpm→ 大概率是 NTS 版
注意:Linux/macOS 的 tar.gz 包不带 ts/nts 后缀,不能靠文件名判断,必须走 phpinfo() 或 ZEND_THREAD_SAFE。
选错 TS/NTS 的典型后果
不是“不能跑”,而是“跑得不对”——尤其在扩展加载和并发场景下:
- Apache + mod_php(ISAPI 模式)用 NTS → 直接报错或拒绝启动,因为 Apache 多线程模型要求 PHP 线程安全
- Nginx + php-fpm 用 TS → 能跑,但性能下降 5–15%(锁开销),且部分扩展(如某些旧版
redis、igbinary)可能因 ABI 不兼容而段错误 - 扩展 .dll/.so 文件与 PHP TS/NTS 类型不匹配 →
PHP Warning: PHP Startup: Unable to load dynamic library,且不会提示原因
真正容易被忽略的是:Docker 镜像、一键安装脚本、甚至某些云平台预装环境,未必明确标注 TS/NTS;如果你复用别人编译好的扩展,务必先确认 PHP 类型再加载。











