线程安全php-pecl-memcache和php-pecl-mongo

我正在将运行Apache的Fedora服务器从prefork切换到worker。

除了Mongo和Memcache的php库以外,一切似乎都很好。 有没有人有任何成功让这些工作与httpd工人mpm?

请注意,我安装了memcache和mongo,像这样:

yum install php-pecl-memcache php-pecl-mongo 

一时兴起,我试着将/usr/lib64/php/modules/下的.so文件复制到/usr/lib64/php-zts/modules/ ,但是我得到了这些错误:

PHP警告:PHP启动:无法加载dynamic库'/usr/lib64/php-zts/modules/memcache.so' – /usr/lib64/php-zts/modules/memcache.so:undefined symbol:basic_globals in Unknown第0行PHP警告:PHP启动:无法加载dynamic库'/usr/lib64/php-zts/modules/mongo.so' – /usr/lib64/php-zts/modules/mongo.so:undefined symbol:core_globals in未知在第0行

你不能只从/usr/lib64/php/modules//usr/lib64/php-zts/modules/复制模块.ZTS(线程化)和非ZTS版本的PHP有不同的模块ABI。

显然,Fedora 18的php-pecl-memcache软件包 ,甚至Rawhide软件包都是在没有ZTS支持的情况下构build的,所以它们在mod_php中不能用于线程化的Apache MPM。

你有几个select在这里:

  1. 根据PHP FAQ中的build议,将PHP与线程化的Apache MPM一起使用的最可靠的方式是FastCGI模式(例如使用php-fpm),以便PHP能够在单独的单线程进程中运行。 这样,您可以使用所有可用的PHP扩展 – 甚至是那些使用非线程安全库并且不能在multithreading进程中工作的扩展。

  2. 如果你真的需要使用带有线程化MPM的mod_php,你可以使用第三方软件包( 比如这个 ),这些软件包是用php-zts支持构build的(注意/usr/lib64/php-zts/modules/memcache.so是存在的在文件列表中)。

  3. 如果你不能find一个PHP-zts支持你需要的PHP扩展的现成的二进制包,你可以尝试自己重新编译这个包,但是如果这个扩展没有支持ZTS的话,这也是不可能的码。