Issue #3044364 by amateescu: Improve hit ratio for the menu tree cache

merge-requests/1119/head
catch 2019-04-12 13:12:43 +09:00
parent 2d1e404b34
commit 3f8ab25ea8
4 changed files with 65 additions and 8 deletions

View File

@ -12,7 +12,7 @@ namespace Drupal\Core\Menu;
* a parent in the list will be included.
* - Which menu links are omitted, depending on the minimum and maximum depth.
*/
class MenuTreeParameters {
class MenuTreeParameters implements \Serializable {
/**
* A menu link plugin ID that should be used as the root.
@ -28,9 +28,6 @@ class MenuTreeParameters {
/**
* The minimum depth of menu links in the resulting tree relative to the root.
*
* Defaults to 1, which is the default to build a whole tree for a menu
* (excluding the root).
*
* @var int|null
*/
public $minDepth = NULL;
@ -211,4 +208,39 @@ class MenuTreeParameters {
return $this;
}
/**
* {@inheritdoc}
*/
public function serialize() {
// Enforce type consistency for all the internal properties of this object.
$this->root = (string) $this->root;
$this->minDepth = $this->minDepth !== NULL ? (int) $this->minDepth : NULL;
$this->maxDepth = $this->maxDepth !== NULL ? (int) $this->maxDepth : NULL;
$this->activeTrail = array_values(array_filter($this->activeTrail));
// Sort 'expanded' and 'conditions' to prevent duplicate cache items.
sort($this->expandedParents);
asort($this->conditions);
return serialize([
'root' => $this->root,
'minDepth' => $this->minDepth,
'maxDepth' => $this->maxDepth,
'expandedParents' => $this->expandedParents,
'activeTrail' => $this->activeTrail,
'conditions' => $this->conditions,
]);
}
/**
* {@inheritdoc}
*/
public function unserialize($serialized) {
foreach (unserialize($serialized) as $key => $value) {
$this->{$key} = $value;
}
return $this;
}
}

View File

@ -845,10 +845,6 @@ class MenuTreeStorage implements MenuTreeStorageInterface {
* {@inheritdoc}
*/
public function loadTreeData($menu_name, MenuTreeParameters $parameters) {
// Build the cache ID; sort 'expanded' and 'conditions' to prevent duplicate
// cache items.
sort($parameters->expandedParents);
asort($parameters->conditions);
$tree_cid = "tree-data:$menu_name:" . serialize($parameters);
$cache = $this->menuCacheBackend->get($tree_cid);
if ($cache && isset($cache->data)) {

View File

@ -190,3 +190,12 @@ function system_post_update_add_expand_all_items_key_in_system_menu_block(&$sand
return strpos($block->getPluginId(), 'system_menu_block:') === 0;
});
}
/**
* Clear the menu cache.
*
* @see https://www.drupal.org/project/drupal/issues/3044364
*/
function system_post_update_clear_menu_cache() {
// Empty post-update hook.
}

View File

@ -142,4 +142,24 @@ class MenuTreeParametersTest extends UnitTestCase {
$this->assertEquals(1, $parameters->minDepth);
}
/**
* @covers ::serialize
* @covers ::unserialize
*/
public function testSerialize() {
$parameters = new MenuTreeParameters();
$parameters->setRoot(1);
$parameters->setMinDepth('2');
$parameters->setMaxDepth('9');
$parameters->addExpandedParents(['', 'foo']);
$parameters->setActiveTrail(['', 'bar']);
$after_serialize = unserialize(serialize($parameters));
$this->assertSame('1', $after_serialize->root);
$this->assertSame(2, $after_serialize->minDepth);
$this->assertSame(9, $after_serialize->maxDepth);
$this->assertSame(['', 'foo'], $after_serialize->expandedParents);
$this->assertSame(['bar'], $after_serialize->activeTrail);
}
}