There is a not-so-obvious way to check whether or not a MemCache-Server is available.
Using ($memCache->connect() == false) will wait for a timeout if it can't connect. If you got a high-traffic site this may not be an option. So when the server is down, you may want to avoid waiting for this timeout on every request and instead try to reconnect only once every X seconds.
If so, this code may help:
<?php
$memCache = new \Memcache();
$memCache->addServer($host, $port);
$stats = @$memCache->getExtendedStats();
$available = (bool) $stats["$host:$port"];
if ($available && @$memCache->connect($host, $port))
// MemCache is there
else
// go on without MemCache
?>
The result of getExtendedStats() is an array. The information is cached and maintained by MemCache itself. If the server is not available, the result will be FALSE.
Even if the result is not false, the server may still not be available. Thus you need to check for connect() != false too, but only if the first check returns TRUE, thus avoiding the 1 second timeout in most cases.
Both getExtendedStats() and connect() issue notices/warnings if the server is not there. Thus you have to mute both calls.
Do NOT use getServerStatus() for this purpose: the result is cached on server-start and will not recognize when the connection to the server is lost (or reestablished) in between.
Memcache::connect
(PECL memcache >= 0.2.0)
Memcache::connect — Ouvre une connexion avec le serveur Memcache
Description
$host
[, int $port
[, int $timeout
]] )Memcache::connect() établie une connexion avec le serveur de cache Memcache. La connexion, qui a été ouverte en utilisant la fonction Memcache::connect() sera automatiquement fermée à la fin de votre script. Vous pouvez néanmoins la refermer en utilisant la fonction Memcache::close(). Vous pouvez également utiliser la fonction memcache_connect().
Liste de paramètres
-
host -
Pointe à l'hôte où memcache écoute pour des connexions. Ce paramètre peut également spécifier d'autres transporteurs comme unix:///path/to/memcached.sock pour utiliser les sockets Unix, et, dans ce cas,
portdoit également être définit à 0. -
port -
Pointe au port où memcache écoute pour des connexions. Définissez ce paramètre à 0 lors de l'utilisation des sockets Unix.
Note : Par défaut, le paramètre
portprend la valeur de l'option de configuration memcache.default_port s'il n'est pas spécifié. Pour cette raison, il convient de spécifier explicitement le port lors de l'appel à cette méthode. -
timeout -
Valeur en seconde qui sera utilisée pour se connecter au démon. Pensez-y deux fois avant de changer la valeur par défaut d'une seconde - vous pourriez perdre tous les avantages de l'utilisation de la cache si votre connexion est trop lente.
Notes
Lorsque le paramètre port n'est pas spécifié, cette méthode
prendra la valeur de la directive de configuration INI
memcache.default_port.
Si cette valeur a été modifiée à un autre endroit dans votre application,
cela peut conduire à des résultats innatendus : pour cette raison, il convient
de toujours spécifier le port explicitement lors de l'appel à la méthode.
Valeurs de retour
Cette fonction retourne TRUE en cas de
succès ou FALSE si une erreur survient.
Exemples
Exemple #1 Exemple avec Memcache::connect()
<?php
/* API procédurale */
$memcache_obj = memcache_connect('memcache_host', 11211);
/* API orientée objet */
$memcache = new Memcache;
$memcache->connect('memcache_host', 11211);
?>
Voir aussi
- Memcache::pconnect() - Ouvre un connexion persistante à un serveur de cache
- Memcache::close() - Ferme la connexion avec le serveur Memcache
To suppress (or handle) the warning and notice thrown by a failed attempt to connect, you can use a custom error handler function, like this:
<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (E_WARNING === $errno)
{
Log("PHP Warning: $errstr, $errfile, $errline", Logging::WARN);
return true;
}
if (E_NOTICE === $errno)
{
Log("PHP Notic: $errstr, $errfile, $errline", Logging::NOTICE);
return true;
}
return false;
}
set_error_handler('myErrorHandler');
?>
If memcached is working, calling memcache_connect( ) returns an Object instance, not a boolean. If memcached is not working, calling memcache_connect( ) throws a notice AND a warning (and returns false as expected).
<?php
/* memcache is running */
$test1 = memcache_connect('127.0.0.1',11211);
echo gettype($test1);
// object
echo get_class($test1);
// Memcache
/* memcached is stopped */
$test2 = memcache_connect('127.0.0.1',11211);
/*
Notice: memcache_connect(): Server 127.0.0.1 (tcp 11211) failed with: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
(10060) in C:\Program Files\Support Tools\- on line 1
Warning: memcache_connect(): Can't connect to 127.0.0.1:11211, A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
(10060) in C:\Program Files\Support Tools\- on line 1
*/
echo gettype($test2);
// boolean
echo $test2===false;
// 1
?>
There appears to be no way to check whether memcached is actually running without resorting to error suppression:
<?php
$test3 = @memcache_connect('127.0.0.1',11211);
if( $test3===false ){
// memcached is _probably_ not running
}
?>
The behavior of Memcache::connect() is to always reinitialize the pool from scratch regardless of any previous calls to addServer().
E.g.
<?php
$mmc = new Memcache()
$mmc->addServer('node1', 11211);
$mmc->addServer('node2', 11211);
$mmc->addServer('node3', 11211);
$mmc->connect('node1', 11211);
?>
The last connect() call clears out the pool and then add and connect node1:11211 making it the only server.
If you want a pool of memcache servers, do not use the connect() function.
If you only want a single memcache server then there is no need to use the addServer() function.
