字符串替换缓存&冲突的可能性

时间:2015-06-09 作者:Guerrilla

我注意到,由于各种原因,我在Wordpress中使用了大量字符串替换,我担心一旦它上线,对性能的影响。

我在缓存方面并不先进,但大多数Wordpress缓存插件似乎都在检查整个页面。如果页面包含更改的数据,则它将从服务器重新请求该页面,字符串替换将再次发生。

因此,对于不改变的数据,每次加载页面时都会发生相同的替换(我想是吗?)。

我发现临时API是由memcache自动缓存的,所以我想出了这个代码来替换字符串。

它散列输入值,然后将其存储为瞬态,以便下次请求这些精确值时,它不会从字符串执行操作,而是从内存中加载。

以下是代码:

// values to replace.  Key is item to search for, Value is value to replace it with
// you can have as many as you like
$itemsToReplace = array(
    \'current-menu-parent\' => \'current-menu-parent active\',
    \'item\' => \'name\'
);

// the input string (this would be the value passed to the wordpress filter)
// I just made small string here to show what I mean
$inputString = \'<div class="current-menu-parent">some menu item</div>\';

// replace or get cached value
$output = Cstr_replace($itemsToReplace, $inputString);


function Cstr_replace(array $items, $input)
{
    // create key by combining hashes
    // have to use crc32 for one as transient name is only 45 long
    $hashKey = hash(\'crc32\',(string)$items).\':\'.hash(\'md5\',(string)$input);

    // check if the hash exists.
    // if it exists then it means these exact values have already been replaced and we can use cached
    $filtered = get_transient( $hashKey );
    if ( false === $filtered ) {
        // It wasn\'t there, so replace string and save to transient
        $filtered = str_replace(array_flip($items),$items, $input);
        set_transient( $hashKey, $filtered, 12 * HOUR_IN_SECONDS );
    }

    // return either cached or newly generated string
    return (string)$filtered;
}
我想知道这是否是一个好的做法。它是否有助于绩效?有没有更好的方法来实现这一点?这可能会在其中放入大量条目。那很糟糕吗?我认为碰撞的可能性很小,但数学不是我的强项。

我在C#应用程序中使用了类似的东西,它极大地提高了性能,但它是独立的代码,没有所有的插件和wordpress之类的东西,所以我不知道在这种情况下这是否毫无意义。

这个好用还是我应该做些不同的事情?

1 个回复
SO网友:s_ha_dum

通过简单地添加带有过滤器的类,您可能会获得至少同样好的性能,这当然更整洁,更接近WordPress的修改方式:

function add_classes_wpse_190966($classes) {
  if (in_array(\'current-menu-parent\',$classes)) {
    $classes[] = \'active\';
  }
  return $classes;
}
add_filter(\'nav_menu_css_class\',\'add_classes_wpse_190966\');
或者,使用值数组:

function add_classes_wpse_190966($classes) {
  $itemsToReplace = array(
    \'current-menu-parent\' => \'current-menu-parent active\',
    \'item\' => \'name\'
  );
  $classes = array_intersect_key(array_combine($classes,$classes),$itemsToReplace);

  foreach ($classes as $v) {
    $classes[] = $itemsToReplace[$v];
  }

  return $classes;
}
add_filter(\'nav_menu_css_class\',\'add_classes_wpse_190966\');

结束

相关推荐

无法打开Advanced-cache.php,这将破坏媒体库

在我的WordPress安装中,它是3.8版本,所有插件都已更新,它使用的是Magic Fields 2和Hypercache等插件。我无法在帖子中插入图像,因为当我上传时,它会给我一个错误:上载时出错。请稍后再试。帖子“插入媒体”中的媒体库窗口显示为空白,尽管我知道那里有图像,可以通过侧边栏中的查看它们。当我尝试插入带有魔术字段的图像时,当我单击“插入帖子”时,窗口是空白的,它不会插入图像。在wp配置中。php,我已将调试设置为true:define(\'WP\\u DEBUG\',true);我在禁用