为什么默认禁用 PHP ZTS?

Mos*_*aei 3 php multithreading zts

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

Der*_*ick 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

  • 谢谢你的好回答。我还有两个问题:D 1. 如果 ZTS 只是用于内部目的,为什么所有线程第三方扩展(例如“parallel”)都需要它?2. 为什么我必须从源代码编译 PHP 才能启用 ZTS?为什么我们不能通过包管理器安装它?目前,我使用 phpbrew 从源代码编译 PHP,但这让我的合作者感到困惑。 (2认同)