![线程安全的 php-pecl-memcache 和 php-pecl-mongo](https://linux22.com/image/606971/%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%20php-pecl-memcache%20%E5%92%8C%20php-pecl-mongo.png)
我正在寻找将运行 Apache 的 Fedora 服务器从 prefork 切换到 worker。
除了 Mongo 和 Memcache 的 php 库之外,一切似乎都很好。有没有人成功让它们与 httpd worker mpm 一起工作过?
请注意,我是这样安装 memcache 和 mongo 的:
yum install php-pecl-memcache php-pecl-mongo
一时兴起,我尝试将 .so 从/usr/lib64/php/modules/
复制到/usr/lib64/php-zts/modules/
,但出现了以下错误:
PHP 警告:PHP 启动:无法加载动态库“/usr/lib64/php-zts/modules/memcache.so”-/usr/lib64/php-zts/modules/memcache.so:未定义符号:第 0 行未知中的 basic_globals PHP 警告:PHP 启动:无法加载动态库“/usr/lib64/php-zts/modules/mongo.so”-/usr/lib64/php-zts/modules/mongo.so:未定义符号:第 0 行未知中的 core_globals
答案1
您不能简单地将模块从/usr/lib64/php/modules/
复制到/usr/lib64/php-zts/modules/
— ZTS(线程)和非 ZTS 版本的 PHP 具有不同的模块 ABI。
显然适用于 Fedora 18 的 php-pecl-memcache 软件包甚至生皮包装在构建时没有提供 ZTS 支持,因此无法在线程 Apache MPM 中与 mod_php 一起使用。
您有多种选择:
根据PHP FAQ 中的建议,将 PHP 与线程 Apache MPM 一起使用的最可靠方法是使用 FastCGI 模式(例如,使用 php-fpm),这样 PHP 将在单独的单线程进程中运行。这样,您可以使用所有可用的 PHP 扩展 — 即使是那些使用非线程安全库且根本无法在多线程进程中工作的扩展。
如果你确实需要使用带有线程 MPM 的 mod_php,那么可以使用第三方包(像这样) 是使用 php-zts 支持构建的(请注意,它
/usr/lib64/php-zts/modules/memcache.so
存在于文件列表中)。如果您无法找到适合您所需 PHP 扩展的具有 php-zts 支持的现成二进制包,您可以尝试自己重建该包,但如果该扩展的代码中没有 ZTS 支持,那么这甚至也不可能。