X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FUtils%2FCache.php;h=93e292127f13af13e1301286579f8c39fd326a1e;hb=075af2f09c32084fb6729648b306ba40bdf07220;hp=23975cae4d2adb302dbc3e40e9c024f967bf1fe7;hpb=de0e75379083bed6adc1b44e37fb29a60813487b;p=civicrm-core.git diff --git a/CRM/Utils/Cache.php b/CRM/Utils/Cache.php index 23975cae4d..93e292127f 100644 --- a/CRM/Utils/Cache.php +++ b/CRM/Utils/Cache.php @@ -171,7 +171,7 @@ class CRM_Utils_Cache { * Support varies by driver: * - For most memory backed caches, this option is meaningful. * - For SqlGroup, this option is ignored. SqlGroup has equivalent behavior built-in. - * - For Arraycache, this option is ignored. It's redundant. + * - For ArrayCache, this option is ignored. It's redundant. * If this is a short-lived process in which TTL's don't matter, you might * use 'fast' mode. It sacrifices some PSR-16 compliance and cache-coherency * protections to improve performance. @@ -183,7 +183,7 @@ class CRM_Utils_Cache { $types = (array) $params['type']; if (!empty($params['name'])) { - $params['name'] = CRM_Core_BAO_Cache::cleanKey($params['name']); + $params['name'] = self::cleanKey($params['name']); } foreach ($types as $type) { @@ -220,6 +220,37 @@ class CRM_Utils_Cache { throw new CRM_Core_Exception("Failed to instantiate cache. No supported cache type found. " . print_r($params, 1)); } + /** + * Normalize a cache key. + * + * This bridges an impedance mismatch between our traditional caching + * and PSR-16 -- PSR-16 accepts a narrower range of cache keys. + * + * @param string $key + * Ex: 'ab/cd:ef' + * @return string + * Ex: '_abcd1234abcd1234' or 'ab_xx/cd_xxef'. + * A similar key, but suitable for use with PSR-16-compliant cache providers. + */ + public static function cleanKey($key) { + if (!is_string($key) && !is_int($key)) { + throw new \RuntimeException("Malformed cache key"); + } + + $maxLen = 64; + $escape = '-'; + + if (strlen($key) >= $maxLen) { + return $escape . md5($key); + } + + $r = preg_replace_callback(';[^A-Za-z0-9_\.];', function($m) use ($escape) { + return $escape . dechex(ord($m[0])); + }, $key); + + return strlen($r) >= $maxLen ? $escape . md5($key) : $r; + } + /** * Assert that a key is well-formed. *