一群使用相同Memcached的无关WordPress无法正确存储他们的数据

时间:2013-01-28 作者:Ivan Buttinoni

在开始之前,我必须警告读者:小心d!

single web server (CentOS 6.3)使用php-5.3.3,我有unrelated wordpress站点(3.5),每个站点都有自己的DB(Mysql5.1),因此table\\u前缀是相同的(“wp\\u”)。

为了加快wordpress的速度,我想用APC获取代码,用memcache后端获取数据,所以在我的web服务器上,我编译了;安装libmemcached-1.0.15和(使用“pecl安装”)php-pecl-memcached 2.1.0(注意结尾)d“”。作为我使用的wp插件“memcached redux“。

在两个不同的服务器(CentOS 6.3)上,我编译了;已安装memcached-1.4.15后端守护程序。

The Issue

首先,我登录wp。第一个域。com,一切都很好。当我尝试登录wp时。第二个域。我发现自己在wp上重定向了。第一个域。com!

如果我清理memcached缓存,我可以登录wp。第二个域。net,但每次我尝试登录wp时,都会在wp上重定向我。第二个域。net。

在我的wp配置中。php我使用以下设置:

// server list definition
$GLOBALS[\'memcached_servers\']=
      array("memcache1.internal:11211","memcache2.internal:11211",);


// try to add a server-related prefix

$GLOBALS[\'blog_id\']=$_SERVER[\'SERVER_NAME\'];
ini_set(\'memcached.sess_prefix\',\'memc.sess.key.\'.$_SERVER[\'SERVER_NAME\'].\'.\');

IMHO the wp don\'t store the data with a significant prefix/salt so one blog fetch onother blog datas!

The work around

作为解决方法,我已经安装了wp插件“Memcached Object Cache“,它使用php pecl memcache(2.2.7)(请注意缺少”d)和配置中的以下代码:

define( \'WP_CACHE_KEY_SALT\', $_SERVER[\'SERVER_NAME\'] );
我想我错过了memcached redux的一些设置,但我不排除缺少的功能(或bug)。

ADD

最终目标是使用php-pecl-memcached,这样我的解决方案就可以了。

1 个回复
SO网友:Tom J Nowell

如果WordPress使用APC,它会将其用于其对象缓存,并且由于APC是每台机器,而不是每集群,这两个将发生分歧,如果您试图在两台机器上运行一个站点,就会出现问题。

在这种情况下,您需要运行1个memcached deamon,并将2个服务器配置为使用1个实例。

但您提到了两台具有不相关站点的服务器。

因此,在这种情况下,我们遇到了与此相同的问题:

http://wordpress.org/support/topic/many-wp-installations-on-the-same-server

插件作者说:

默认情况下,它应该。But that requires that you use unique table prefixes (They all cannot be wp_).

要在许多表前缀相同的站点上使用它,可以在wp config中添加一个常量。php称为WP_CACHE_KEY_SALT,例如:

define(\'WP\\u CACHE\\u KEY\\u SALT\',md5(DB\\u NAME)。FILE));

md5(DB\\U名称。FILE) 只要每个站点都是唯一的,就可以被您想要的任何内容所取代。

实际上,您已经偶然发现了memcache的解决方案及其原因。

因此,如果重命名表前缀使其唯一,memcached可能会起作用

对于ellaborate,如果我们看看memcachedredux插件的关键方法:

function key( $key, $group ) {  
    if ( empty( $group ) )
        $group = \'default\';

    if ( false !== array_search( $group, $this->global_groups ) )
        $prefix = $this->global_prefix;
    else
        $prefix = $this->blog_prefix;

    return preg_replace( \'/\\s+/\', \'\', "$prefix$group:$key" );
}
之后在构造器中:

    global $blog_id, $table_prefix;
    $this->global_prefix = \'\';
    $this->blog_prefix = \'\';
    if ( function_exists( \'is_multisite\' ) ) {
        $this->global_prefix = ( is_multisite() || defined( \'CUSTOM_USER_TABLE\' ) && defined( \'CUSTOM_USER_META_TABLE\' ) ) ? \'\' : $table_prefix;
        $this->blog_prefix = ( is_multisite() ? $blog_id : $table_prefix ) . \':\';
    }
在这里,我们可以看到前缀是“”,或者是博客ID或表前缀。

因此,不需要处理多个站点->1个memcached。所以,更改您的表前缀,测试它是否有效。如果没有,则需要修改插件

结束

相关推荐

将瞬变与Memcached结合使用

我希望有人能为我澄清一下在memcached中使用瞬态的问题。当运行像w3 total cache这样的插件时,使用瞬态存储大型post查询是否有任何实际的性能优势?如果我们正在运行memcached,查询将已经被memcached缓存了,对吗?那么,如果有的话,同时使用这两种方法的好处是什么?