我注意到,由于各种原因,我在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之类的东西,所以我不知道在这种情况下这是否毫无意义。
这个好用还是我应该做些不同的事情?
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\');