如何在Ubuntu上安装PHP pthreads扩展?

10

我想在Ubuntu上安装'pthreads' PHP扩展。 我使用的是Ubuntu 12.04.1 LTS。 如果需要,我可以升级。 我真的不想从源代码编译任何东西。例如,重新编译源代码听起来对我来说像个可怕的主意。

在我看来,最好的选择是使用aptitude命令安装此扩展。例如像aptitude install php5-mysql这样。另一个好主意是使用pecl install pthreads。但是由于以下错误,它对我无效:

  

checking checking for ZTS... configure: error: pthreads requires ZTS, please re-compile PHP with ZTS enabled

让我解释一下为什么我不喜欢重新编译PHP的想法:

  • 我想我应该卸载原始的PHP包以及所有依赖项。因为如果我在标准PHP上编译它,则任何软件包更新都会覆盖我的更改。而且,另一个选项是保留PHP不更新。无论如何,这会引入一些额外的工作并使设置更加复杂。我们在分布式团队中。 而我不希望其他人在生产服务器上处理这个复杂的设置。
  • 我想在服务器上安装更新。而且我不想因为安全修复等原因重新编译PHP。
  • 我不想在生产服务器上编译任何东西并多次执行此操作。然后我应该构建自己的软件包并使用新版本进行更新等。对不起,但我不够聪明去做这个。也许2-3年后我可以,但现在不行。因为有很多事情要记住。例如如何在仍满足所有依赖关系的情况下将标准PHP软件包替换为自定义软件包。

一些参考资料:

  • 如何在Ubuntu中使用Pthreads PHP扩展 - 关于我将要做的一些讨论。
  • 构建pthreads
  • 这篇文章似乎有点过时且不太实用。我仅将其保留作为参考。我猜想应该把它看作“3年前PHP还没有线程安全性”。


    2
    我猜你得编译它。我在网上找到的所有资源都说你必须这样做。顺便说一句,这并不难。 - Bart Friederichs
    完全同意@BartFriederichs的观点,如果你设法做到了,请告诉我们如何做到的。 - confiq
    @BartFriederichs,感谢您的评论。我同意这并不是很难。问题在于如何在多个生产服务器上安装它。理想情况下,我应该创建自己的软件包,将其放入自己的发行版中,并使用aptitude从我的发行版在服务器上安装它。但是我没有为MySQL驱动程序执行此操作,因为这已经完成了。而且我希望相信我不是唯一使用pthreads的人,对于pthreads也应该执行相同的设置。 - Victor Smirnov
    如果你有多个服务器,你可以直接复制.so文件。或者选择一个为您打包的发行版(不知道它们是否存在)。 - Bart Friederichs
    我写了一篇关于如何使用pthread和ZTS编译PHP的文章,链接在这里:http://blog.flowl.info/2015/compile-php-5-6-pthreads-mongo-ubuntu/。 - Daniel W.
    显示剩余2条评论
    2个回答

    9

    ZTS: [Z]end [T]hread [S]afety.

    ZTS是一个编译时选项,无法在运行时启用。它允许通常在单个线程中执行的PHP解释器在许多线程中执行,每个线程都有自己隔离的解释器实例。

    唯一的选择似乎是进行全新的构建,然后使用您的分发包构建工具。

    我无法就直接创建deb提供建议,但创建rpm相当简单。您可以从https://github.com/krakjoe/spex开始,然后如果您无法找出如何直接创建deb包,则可以使用alien将RPM转换为deb。

    除非您能够找到一个带有完整构建环境的线程安全版本的PHP存储库,否则从源代码构建将是不可避免的。关于这一点,http://pthreads.org/building上的信息可能对您有用。在现代硬件上,您可以在不到一分钟的时间内构建PHP,并且应该抓住机会从安装中去除冗余部分。

    另外值得一提的是,您所引用的有关PHP不支持线程安全的文章来自2008年,它是非常错误的。核心是线程安全的,但有一些扩展是固有不安全的(不是设计差,而是从根本上不适合)。


    谢谢您的评论,它真的很有帮助。这让我相信我正在朝着正确的方向前进 ;) - Victor Smirnov
    3
    链接已损坏,请修复。 - Baba
    ZTS和您可以从这里下载的线程安全二进制文件之间有什么区别:http://windows.php.net/download/? - CMCDragonkai
    嗨@Joe,'building'链接仍然无法使用。我想直接编辑您的帖子,但找不到原意的链接。 - halfer
    Debian和Ubuntu可以使用dpkg -i packages.rpm安装.rpm软件包。 - Daniel W.

    6
    似乎Ubuntu官方存储库中没有线程安全的PHP包。因此,您有两个选择:
    1. 自己编译:
    2. 在其他类似Debian的系统的存储库中找到.deb包。
    我会使用“checkinstal”实用程序进行编译和打包,这样Apt就可以跟踪PHP版本。我还将请求Canonical提供ZTS PHP的软件包。

    谢谢你的回答。我认为在Ubuntu上安装pthreads时,许多人都应该这样做。这就是为什么我认为应该有一些解决方案。但是这个问题证明是相当复杂的。我猜Canonical故意不包含线程安全的PHP二进制文件。但也许已经有一些项目完成了这个任务? - Victor Smirnov
    关于checkinstall的好笔记。这将有助于保持可维护的数据包缓存。使用checkinstall还可以设置相应的版本,因为添加deb到已安装的软件包可能会出现问题。最好使用apt-cache show <collision-packages-during-install>检查所需的版本或者只需使用系统版本apt-cache show php5 | grep Version打包(checkinstall)即可。 - Sebastian Lange

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