drupal-civicrm/sites/all/modules/civicrm/CRM/Utils/Cache.php
2018-01-14 13:10:16 +00:00

214 lines
7 KiB
PHP

<?php
/*
+--------------------------------------------------------------------+
| CiviCRM version 4.7 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2017 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
| CiviCRM is free software; you can copy, modify, and distribute it |
| under the terms of the GNU Affero General Public License |
| Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
| |
| CiviCRM is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| See the GNU Affero General Public License for more details. |
| |
| You should have received a copy of the GNU Affero General Public |
| License and the CiviCRM Licensing Exception along |
| with this program; if not, contact CiviCRM LLC |
| at info[AT]civicrm[DOT]org. If you have questions about the |
| GNU Affero General Public License or the licensing of CiviCRM, |
| see the CiviCRM license FAQ at http://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
/**
*
* @package CRM
* @copyright CiviCRM LLC (c) 2004-2017
*/
/**
* Cache is an empty base object, we'll modify the scheme when we have different caching schemes
*/
class CRM_Utils_Cache {
/**
* (Quasi-Private) Treat this as private. It is marked public to facilitate testing.
*
* We only need one instance of this object. So we use the singleton
* pattern and cache the instance in this variable
*
* @var object
*/
public static $_singleton = NULL;
/**
* Constructor.
*
* @param array $config
* An array of configuration params.
*
* @return \CRM_Utils_Cache
*/
public function __construct(&$config) {
CRM_Core_Error::fatal(ts('this is just an interface and should not be called directly'));
}
/**
* Singleton function used to manage this object.
*
* @return CRM_Utils_Cache_Interface
*/
public static function &singleton() {
if (self::$_singleton === NULL) {
$className = 'ArrayCache'; // default to ArrayCache for now
// Maintain backward compatibility for now.
// Setting CIVICRM_USE_MEMCACHE or CIVICRM_USE_ARRAYCACHE will
// override the CIVICRM_DB_CACHE_CLASS setting.
// Going forward, CIVICRM_USE_xxxCACHE should be deprecated.
if (defined('CIVICRM_USE_MEMCACHE') && CIVICRM_USE_MEMCACHE) {
$className = 'Memcache';
}
elseif (defined('CIVICRM_USE_ARRAYCACHE') && CIVICRM_USE_ARRAYCACHE) {
$className = 'ArrayCache';
}
elseif (defined('CIVICRM_DB_CACHE_CLASS') && CIVICRM_DB_CACHE_CLASS) {
$className = CIVICRM_DB_CACHE_CLASS;
}
// a generic method for utilizing any of the available db caches.
$dbCacheClass = 'CRM_Utils_Cache_' . $className;
$settings = self::getCacheSettings($className);
self::$_singleton = new $dbCacheClass($settings);
}
return self::$_singleton;
}
/**
* Get cache relevant settings.
*
* @param $cachePlugin
*
* @return array
* associative array of settings for the cache
*/
public static function getCacheSettings($cachePlugin) {
switch ($cachePlugin) {
case 'ArrayCache':
case 'NoCache':
$defaults = array();
break;
case 'Redis':
case 'Memcache':
case 'Memcached':
$defaults = array(
'host' => 'localhost',
'port' => 11211,
'timeout' => 3600,
'prefix' => '',
);
// Use old constants if needed to ensure backward compatibility
if (defined('CIVICRM_MEMCACHE_HOST')) {
$defaults['host'] = CIVICRM_MEMCACHE_HOST;
}
if (defined('CIVICRM_MEMCACHE_PORT')) {
$defaults['port'] = CIVICRM_MEMCACHE_PORT;
}
if (defined('CIVICRM_MEMCACHE_TIMEOUT')) {
$defaults['timeout'] = CIVICRM_MEMCACHE_TIMEOUT;
}
if (defined('CIVICRM_MEMCACHE_PREFIX')) {
$defaults['prefix'] = CIVICRM_MEMCACHE_PREFIX;
}
// Use new constants if possible
if (defined('CIVICRM_DB_CACHE_HOST')) {
$defaults['host'] = CIVICRM_DB_CACHE_HOST;
}
if (defined('CIVICRM_DB_CACHE_PORT')) {
$defaults['port'] = CIVICRM_DB_CACHE_PORT;
}
if (defined('CIVICRM_DB_CACHE_TIMEOUT')) {
$defaults['timeout'] = CIVICRM_DB_CACHE_TIMEOUT;
}
if (defined('CIVICRM_DB_CACHE_PREFIX')) {
$defaults['prefix'] = CIVICRM_DB_CACHE_PREFIX;
}
break;
case 'APCcache':
$defaults = array();
if (defined('CIVICRM_DB_CACHE_TIMEOUT')) {
$defaults['timeout'] = CIVICRM_DB_CACHE_TIMEOUT;
}
if (defined('CIVICRM_DB_CACHE_PREFIX')) {
$defaults['prefix'] = CIVICRM_DB_CACHE_PREFIX;
}
break;
}
return $defaults;
}
/**
* Create a new, named, limited-use cache.
*
* This is a factory function. Generally, you should use Civi::cache($name)
* to locate managed cached instance.
*
* @param array $params
* Array with keys:
* - name: string, unique symbolic name.
* - type: array|string, list of acceptable cache types, in order of preference.
* - prefetch: bool, whether to prefetch all data in cache (if possible).
* @return CRM_Utils_Cache_Interface
* @throws CRM_Core_Exception
* @see Civi::cache()
*/
public static function create($params = array()) {
$types = (array) $params['type'];
foreach ($types as $type) {
switch ($type) {
case '*memory*':
if (defined('CIVICRM_DB_CACHE_CLASS') && in_array(CIVICRM_DB_CACHE_CLASS, array('Memcache', 'Memcached', 'Redis'))) {
$dbCacheClass = 'CRM_Utils_Cache_' . CIVICRM_DB_CACHE_CLASS;
$settings = self::getCacheSettings(CIVICRM_DB_CACHE_CLASS);
$settings['prefix'] = $settings['prefix'] . '_' . $params['name'];
return new $dbCacheClass($settings);
}
break;
case 'SqlGroup':
if (defined('CIVICRM_DSN') && CIVICRM_DSN) {
return new CRM_Utils_Cache_SqlGroup(array(
'group' => $params['name'],
'prefetch' => CRM_Utils_Array::value('prefetch', $params, FALSE),
));
}
break;
case 'Arraycache':
case 'ArrayCache':
return new CRM_Utils_Cache_ArrayCache(array());
}
}
throw new CRM_Core_Exception("Failed to instantiate cache. No supported cache type found. " . print_r($params, 1));
}
}