3

为什么ZTS默认是禁用的,我们要编译PHP源码来实现Threading能力?启用时是否有任何限制或副作用ZTS?不稳定吗?

4

1 回答 1

7

PHP 最初是作为 CGI 二进制文件开始的,然后作为 Apache 的模块。这两种方式都不需要 PHP 成为线程运行时,因为它们都会按顺序处理请求。

当添加对其他 Web 服务器的支持时,尤其是通过其 ISAPI 接口支持的 Microsoft IIS,它们的处理模型要求 PHP 能够作为线程进程运行。PHP 添加了一个“ZTS”(Zend 线程安全)模式,该模式做了相当多的工作以确保并行(线程)运行的请求不会相互影响。但这确实是以性能为代价的

由于大多数 Web 服务器 API 不需要启用 ZTS,因此 PHP 的默认设置是关闭。如果您要为 ISAPI SAPI(服务器抽象)层构建 PHP,那么 PHP 构建过程会自动打开 ZTS 模式。

说了这么多,ZTS 模式并不是要允许 PHP 脚本中的线程而是允许 PHP 本身在线程环境中运行。如果您对从 PHP 脚本的角度并行运行事物感兴趣,则需要求助于第三方扩展,例如 Joe 的并行扩展或swoole

于 2020-05-20T10:53:16.087 回答