'default')); foreach ($memcache_servers as $server => $bin) { if ($cluster = dmemcache_object_cluster($bin)) { $memcache = dmemcache_instance($cluster['cluster']); if (dmemcache_connect($memcache, $server, $cluster['weight']) === FALSE) { $error = TRUE; } else { if (!variable_get('memcache_persistent', TRUE)) { dmemcache_close($memcache); } } } } } if ($error) { $severity = 'error'; } elseif ($warning) { $severity = 'warning'; } if ($error || $warning) { drupal_set_message(t('There are problems with your Memcache configuration. Please review %readme and visit the Drupal admin !status page for more information.', array('%readme' => 'README.txt', '!status' => l(t('status report'), 'admin/reports/status'))), $severity); } } /** * Implements hook_requirements(). */ function memcache_requirements($phase) { $requirements = array(); $t = get_t(); $memcache = extension_loaded('memcache'); $memcached = extension_loaded('memcached'); if ($phase == 'install' || $phase == 'runtime') { $requirements['memcache_extension']['title'] = $t('Memcache'); if (!$memcache && !$memcached) { $requirements['memcache_extension']['severity'] = REQUIREMENT_ERROR; $requirements['memcache_extension']['value'] = $t('Required PHP extension not found. Install the memcache (recommended) or memcached extension.'); } else { $requirements['memcache_extension']['value'] = $t('PHP %extension Extension', array('%extension' => $memcache ? $t('Memcache') : $t('Memcached'))); } } if ($phase == 'runtime') { $errors = array(); $warnings = array(); if (!$memcache && !$memcached) { $errors[] = $t('Required PHP extension not found. Install the memcache (recommended) or memcached extension.'); } if (!function_exists('dmemcache_set')) { // dmemcache.inc isn't loaded. $errors[] = $t('Failed to load required file %dmemcache.', array('%dmemcache' => drupal_get_path('module', 'memcache') . '/' . 'dmemcache.inc')); $requirements['memcache_extension']['value'] = $t('Unknown'); } else { $extension = dmemcache_extension(); if ($extension == 'Memcache') { $version = phpversion('memcache'); $recommended = MEMCACHE_PECL_RECOMMENDED; } elseif ($extension == 'Memcached') { $version = phpversion('memcached'); $recommended = MEMCACHED_PECL_RECOMMENDED; } if (!$version) { $version = $t('Unknown'); } $requirements['memcache_extension']['value'] = $version . _memcache_statistics_link(); if (!_memcache_version_valid()) { $warnings[] = $t('PECL !extension version %version is unsupported. Please update to %recommended or newer.', array( '!extension' => $extension, '%version' => $version, '%recommended' => $recommended, )); } // Make a test connection to all configured memcache servers. $memcache_servers = variable_get('memcache_servers', array('127.0.0.1:11211' => 'default')); foreach ($memcache_servers as $server => $bin) { if ($cluster = dmemcache_object_cluster($bin)) { $memcache = dmemcache_instance($cluster['cluster']); if (dmemcache_connect($memcache, $server, $cluster['weight']) === FALSE) { $errors[] = $t('Failed to connect to memcached server instance at %server.', array('%server' => $server)); } else { if (!variable_get('memcache_persistent', TRUE)) { dmemcache_close($memcache); } } } } // Set up a temporary bin to see if we can store a value and then // successfully retreive it. try { $cid = 'memcache_requirements_test'; $value = 'OK'; // Temporarily store a test value in memcache. cache_set($cid, $value); // Retreive the test value from memcache. $data = cache_get($cid); if (!isset($data->data) || $data->data !== $value) { $errors[] = $t('Failed to store to then retrieve data from memcache.'); } else { // Test a delete as well. cache_clear_all($cid, 'cache'); } } catch (Exception $e) { // An unexpected exception occurred. $errors[] = $t('Unexpected failure when testing memcache configuration.'); } // Core's lock implementation can cause worse performance together with // stampede protection. Plus, long keys will be truncated resulting in // dropped locks. if (variable_get('memcache_stampede_protection', FALSE) && strpos(variable_get('lock_inc', 'includes/lock.inc'), 'includes/lock.inc') !== FALSE) { $warnings[] = $t('Drupal\'s core lock implementation (%core) is not supported by memcache stampede protection. Enable the memcache lock implementation (%memcache) or disable memcache stampede protection.', array('%core' => 'includes/lock.inc', '%memcache' => drupal_get_path('module', 'memcache') . "/memcache-lock.inc")); } } if (!empty($errors)) { // Error takes precedence over warning, stack together errors and // warnings and display as error messages. $errors = array_merge($errors, $warnings); unset($warnings); $requirements['memcache_extension']['severity'] = REQUIREMENT_ERROR; $requirements['memcache_extension']['description'] = $t('There is a problem with your memcache configuration, check the Drupal logs for additional errors. Please review %readme for help resolving the following !issue: !errors', array('%readme' => drupal_get_path('module', 'memcache') . '/' . 'README.txt', '!issue' => format_plural(count($errors), 'issue', 'issues'), '!errors' => '