function memcache_requirements in Memcache API and Integration 7
Same name and namespace in other branches
- 8.2 memcache.install \memcache_requirements()
- 6 memcache.install \memcache_requirements()
Implements hook_requirements().
File
- ./
memcache.install, line 83 - Install, update and uninstall functions for the memcache module.
Code
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 <a href="http://php.net/manual/en/book.memcache.php">memcache</a> (recommended) or <a href="http://php.net/manual/en/book.memcached.php">memcached</a> 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 <a href="http://php.net/manual/en/book.memcache.php">memcache</a> (recommended) or <a href="http://php.net/manual/en/book.memcached.php">memcached</a> 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');
if (version_compare(phpversion(), '7', '>=')) {
$recommended = MEMCACHE_PECL_PHP7_RECOMMENDED;
}
else {
$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_pecl_version_valid()) {
$warnings[] = $t('PECL !extension version %version is unsupported. Please update to %recommended or newer.', array(
'!extension' => $extension,
'%version' => $version,
'%recommended' => $recommended,
));
}
// If ASCII protocol authentication is enabled, perform extra tests.
if (_dmemcache_use_ascii_auth()) {
// Verify minimum required memcached version for ASCII protocol authentication is installed.
$version = _memcached_ascii_auth_version_valid(MEMCACHED_ASCII_AUTH_MINIMUM);
// TRUE means version valid, FALSE means we failed to connect and will throw a different error.
if ($version !== TRUE && $version !== FALSE) {
$errors[] = $t('ASCII protocol authentication is enabled but requires memcached v%minimum or greater. One or more memcached instances detected running memcache v%version.' . _memcache_statistics_link(), array(
'%version' => $version,
'%minimum' => MEMCACHED_ASCII_AUTH_MINIMUM,
));
}
else {
$version = _memcached_ascii_auth_version_valid(MEMCACHED_ASCII_AUTH_RECOMMENDED);
// TRUE means version valid, FALSE means we failed to connect and will throw a different error.
if ($version !== TRUE && $version !== FALSE) {
$warnings[] = $t('Memcached v%recommended is recommended when using ASCII protocol authentication, to avoid a CPU race. One or more memcached instances detected are running memcache v%version.' . _memcache_statistics_link(), array(
'%version' => $version,
'%recommended' => MEMCACHED_ASCII_AUTH_RECOMMENDED,
));
}
}
// Confirm ASCII authentication works on all memcached servers.
$memcache_bins = variable_get('memcache_bins', array(
'cache' => 'default',
));
foreach ($memcache_bins as $bin => $_) {
if ($mc = dmemcache_object($bin)) {
$ascii_auth = _check_ascii_auth($mc);
if ($ascii_auth !== TRUE) {
$s = $ascii_auth[0];
$message = $ascii_auth[1];
$errors[] = $t('ASCII protocol authentication failed: %message (%host:%port).' . _memcache_statistics_link(), array(
'%host' => $s['host'],
'%port' => $s['port'],
'%message' => $message,
));
}
}
}
}
// 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' => '<ul><li>' . implode('<li>', $errors),
));
}
elseif (!empty($warnings)) {
$requirements['memcache_extension']['severity'] = REQUIREMENT_WARNING;
$requirements['memcache_extension']['description'] = $t('There is a problem with your memcache configuration. Please review %readme for help resolving the following !issue: !warnings', array(
'%readme' => drupal_get_path('module', 'memcache') . '/' . 'README.txt',
'!issue' => format_plural(count($warnings), 'issue', 'issues'),
'!warnings' => '<ul><li>' . implode('<li>', $warnings),
));
}
else {
$requirements['memcache_extension']['severity'] = REQUIREMENT_OK;
}
}
return $requirements;
}