You are here

function memcache_storage_requirements in Memcache Storage 8

Same name and namespace in other branches
  1. 7 memcache_storage.install \memcache_storage_requirements()

Implements hook_requirements().

File

./memcache_storage.install, line 16
Provides requirements check for integration with memcached.

Code

function memcache_storage_requirements($phase) {

  // Show status messages only on status report page.
  if ($phase != 'runtime') {
    return [];
  }
  $requirements = [];

  // Make sure that the used extension is completely valid.
  $pecl_extension = DrupalMemcachedUtils::getPeclExtension();
  if (empty($pecl_extension) || !class_exists($pecl_extension) || !in_array($pecl_extension, [
    'Memcache',
    'Memcached',
  ])) {
    $requirements['memcache_storage_extension']['title'] = t('Memcache Storage: problems with PECL extension');
    $requirements['memcache_storage_extension']['severity'] = REQUIREMENT_ERROR;
    $requirements['memcache_storage_extension']['value'] = t('Can\'t load PECL extension.');
    $requirements['memcache_storage_extension']['description'] = t('The specified PECL extension %extension can not be found on the server. Make sure that the extension name is valid and it is available on the server.', [
      '%extension' => $pecl_extension,
    ]);
    return $requirements;
  }

  // If extension is correct and exists, show info about the selected
  // extension.
  $pecl_extension_version = phpversion($pecl_extension);
  $requirements['memcache_storage_extension']['title'] = t('Memcache Storage: PECL extension');
  $requirements['memcache_storage_extension']['severity'] = REQUIREMENT_OK;
  $requirements['memcache_storage_extension']['value'] = $pecl_extension . ' (' . $pecl_extension_version . ')';

  // Check of the minimum version compliance.
  $min_version = $pecl_extension == 'Memcached' ? MEMCACHE_STORAGE_MINIMUM_MEMCACHED_VERSION : MEMCACHE_STORAGE_MINIMUM_MEMCACHE_VERSION;
  if ($pecl_extension_version < $min_version) {
    $requirements['memcache_storage_extension']['severity'] = REQUIREMENT_ERROR;
    $requirements['memcache_storage_extension']['description'] = t('The current PECL %extension version is too old. Please upgrate to %version or higher.', [
      '%extension' => $pecl_extension,
      '%version' => $min_version,
    ]);
    return $requirements;
  }

  // Collect a list of cache bins which configured to store the data in the
  // memcached.
  $cache_settings = Settings::get('cache');
  $memcached_bins = [];
  $default_cache_service = isset($cache_settings['default']) ? $cache_settings['default'] : 'cache.backend.database';
  foreach (Cache::getBins() as $bin => $bin_settings) {
    $service_name = isset($cache_settings['bins'][$bin]) ? $cache_settings['bins'][$bin] : $default_cache_service;
    if ($service_name == 'cache.backend.memcache_storage') {
      $memcached_bins[] = $bin;
    }
  }

  // Display a list of cache bins which configured to store the data in the
  // memcached.
  $requirements['memcache_storage_memcached_bins']['title'] = t('Memcache Storage: cache bins');
  $requirements['memcache_storage_memcached_bins']['value'] = t('%count cache bins use Memcache Storage as a cache backend', [
    '%count' => count($memcached_bins),
  ]);
  if (!empty($memcached_bins)) {
    $requirements['memcache_storage_memcached_bins']['severity'] = REQUIREMENT_OK;
    $requirements['memcache_storage_memcached_bins']['description'] = implode(', ', $memcached_bins);
  }
  else {
    $requirements['memcache_storage_memcached_bins']['severity'] = REQUIREMENT_WARNING;
    $requirements['memcache_storage_memcached_bins']['description'] = t('Currently there are no cache bins configured to use memcached. See README.txt file for more info.');
  }

  // Load available servers and its clusters from settings.
  $settings = Settings::get('memcache_storage');
  $server_list = !empty($settings['memcached_servers']) ? $settings['memcached_servers'] : [
    '127.0.0.1:11211' => 'default',
  ];
  foreach ($server_list as $memcached_server => $cluster_name) {

    // Create a new memcached connection.
    $memcached = new $pecl_extension();

    // Get host & port information for every memcached server.
    list($host, $port) = DrupalMemcachedUtils::parseServerInfo($memcached_server);

    // Add a new server for memcached connection and check if was successfull.
    $connected = FALSE;
    if ($pecl_extension == 'Memcache') {
      $connected = $memcached
        ->connect($host, $port);
    }
    elseif ($pecl_extension == 'Memcached') {
      $memcached
        ->addServer($host, $port);
      $servers_stats = $memcached
        ->getStats();
      $server_stats = array_shift($servers_stats);
      $connected = !empty($server_stats['uptime']);
    }

    // Display information about the connection status to each memcached
    // server.
    $requirements['memcache_storage_cluster_' . $memcached_server]['title'] = t('Memcache Storage: %cluster cluster (%server)', [
      '%server' => Html::escape($memcached_server),
      '%cluster' => Html::escape($cluster_name),
    ]);
    if ($connected) {
      $requirements['memcache_storage_cluster_' . $memcached_server]['severity'] = REQUIREMENT_OK;
      $requirements['memcache_storage_cluster_' . $memcached_server]['value'] = t('Connected');
    }
    else {
      $requirements['memcache_storage_cluster_' . $memcached_server]['severity'] = REQUIREMENT_ERROR;
      $requirements['memcache_storage_cluster_' . $memcached_server]['value'] = t('No connection');
    }
  }
  return $requirements;
}