动态配置PHP以支持线程安全性--启用-maintainer-zts,还是使用yum安装pthreads?

6
有没有一种方法可以在不重新编译的情况下启用PHP的线程安全性,或者使用YUM来完成这个任务?我正在尝试安装pthreads,它要求PHP必须使用--enable-maintainer-zts进行编译。但是,我不想重新编译,因为我想使用yum来管理我的PHP堆栈。我目前正在使用REMI repo。我注意到有一个名为php-zts的包,但是我的PHP版本是4.4,并且我找不到php-zts的源RPM。是否有一种方法可以使用yum并启用PHP的线程安全性,以便我可以通过使用来安装?

#pecl install channel://pecl.php.net/pthreads-0.0.42

downloading pthreads-0.0.42.tgz ...
Starting to download pthreads-0.0.42.tgz (53,755 bytes)
.............done: 53,755 bytes
33 source files, building
running: phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
building in /var/tmp/pear-build-rootkThpG6/pthreads-0.0.42
running: /var/tmp/pthreads/configure

...

checking whether to enable Threading API... yes, shared
checking checking for ZTS... configure: error: pthreads requires ZTS, please re-compile PHP with ZTS enabled
ERROR: `/var/tmp/pthreads/configure' failed

正如您所看到的,上面的代码失败了,因为PHP没有启用ZTS。


等等,你正在运行 PHP 4.4?! - Ja͢ck
如何编译启用了pthreads和ZTS的PHP 5.4 / 5.5 / 5.6。 - Daniel W.
2个回答

2

ZTS的可用性在编译时确定,因此不能动态启用和/或禁用它。

你可以通过yum或其他软件包管理器安装pThreads,具体取决于你使用的发行版,但请注意,“可能”并不一定意味着这是你的情况下可用的选项。这取决于你的软件仓库是否有这样的软件包可用,并且依赖于另一个启用了ZTS的PHP构建。我非常怀疑这种情况会出现。


能否克隆我的VM,启用ZTS编译PHP,然后构建pThreads的.so文件。接着,将.so文件复制到原始机器上,该机器已经编译了未启用ZTS的PHP,并且实际上可以运行? - Dan
@Dan 不行,那样也不行。如果你这样做,符号就无法匹配。 - Ja͢ck

1

很不幸,大多数Unix软件包的CLI包维护者并未启用线程安全。有时会为worker mpm apache启用线程安全,但并不总包括完整的构建环境(以至于pecl无法工作)。

简而言之,在运行时无法启用ZTS,它是一个构建时间选项,编译源代码后无法进行更改。

然而,自行安装副本并不难。

您采取的路径在很大程度上取决于您对发行版的经验和预期的使用方式。

如果您希望使用线程安全版本覆盖系统安装,则可参考此链接获取相关信息:http://pthreads.org/building

如果您想建立一个隔离的安装环境,可以在 pthreads.org 的构建页面上找到一些信息。此外,我一直在尝试使用 RPM,http://github.com/krakjoe/spex 包含一个 rpmbuild 文件,可以将 master 和 master pthreads 复制到 /opt/php-pthreads 中,并包含完整的构建环境、包括所有必要的文件和设置,但不支持 apache,因为这会使其更加复杂和庞大,它确实包含了 fpm(也被支持)。
你是我遇到的第一个可以建议使用 rpmbuild 的人,因为您可以将 RPM 保留给其他虚拟机使用,只需进行一次操作(直到下一次更新为止)。缺点是,它使用来自 PHP 的最新代码,目前仍处于测试版...
希望这能帮助您 :)

谢谢提醒,我会将其放回 gh-pages 页面。 - Joe Watkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接