Skip to content

Instantly share code, notes, and snippets.

@maximevalette
Created March 16, 2011 11:55
Show Gist options
  • Save maximevalette/872369 to your computer and use it in GitHub Desktop.
Save maximevalette/872369 to your computer and use it in GitHub Desktop.
Fonctions pour gérer un memcache facilement avec MySQL
<?php
/**
* Exemple de variables Memcache
* Il faut absolument configurer le common name, pour pas faire de collision entre données
* si on a plusieurs sites avec le même Memcache.
*/
$memcache = new Memcache();
$memcache->addServer('localhost',9000);
$common_name = 'site.';
/**
* Fonction de base, pour une requête qui sort une seule ligne.
*
* @param string $query La requête SQL classique
* @param int $timeout Le timeout du cache souhaité
* @param bool $force Pour forcer le refresh à chaque appel
* @param null $alias Alias de la requête au niveau du memcached (pratique pour delete après)
* @return object Le résultat de la requête, comme un mysql_fetch_object
*/
function mcache($query,$timeout=3600,$force=false,$alias=null) {
global $memcache, $common_name;
if ($alias) {
$hash = $common_name.md5($alias);
} else {
$hash = $common_name.md5($query);
}
$value = $memcache->get($hash);
if ($value === FALSE || $force == true) {
$result = @mysql_query($query);
$value = @mysql_fetch_object($result);
$memcache->set($hash,$value,NULL,$timeout);
}
return $value;
}
/**
* Configurer une variable dans le memcached directement.
*
* @param string $query Requête SQL ou alias
* @param string|object $value La valeur qu'on veut lui donner
* @param int $timeout Le timeout du cache souhaité
* @return $value Sans modification, en cas de besoin
*/
function mcache_set($query,$value,$timeout=3600) {
global $memcache, $common_name;
$hash = $common_name.md5($query);
$value = $memcache->set($hash,$value,NULL,$timeout);
return $value;
}
/**
* Récupérer directement une donnée du memcached.
*
* @param string $query Requête SQL ou alias
* @return string|object|bool $value La valeur qui est dans le cache (false en cas d'échec)
*/
function mcache_get($query) {
global $memcache, $common_name;
$hash = $common_name.md5($query);
$value = $memcache->get($hash);
return $value;
}
/**
* Similaire à mcache, pour les requêtes SQL à plusieurs lignes.
*
* @param string $query La requête SQL classique
* @param int $timeout Le timeout du cache souhaité
* @param bool $force Pour forcer le refresh à chaque appel
* @param null $alias Alias de la requête au niveau du memcached (pratique pour delete après)
* @return array Les résultats de la requête, comme un while mysql_fetch_object
*/
function mcache_array($query,$timeout=3600,$force=false,$alias=null) {
global $memcache, $common_name;
if (!$memcache) {
$value = array();
$result = mysql_query($query);
while ($row = mysql_fetch_object($result)) {
$value[] = $row;
}
return $value;
}
if ($alias) {
$hash = $common_name.md5($alias);
} else {
$hash = $common_name.md5($query);
}
if ($force != true) {
$value = $memcache->get($hash);
}
if ($value === FALSE || $force == true) {
$memcache->delete($hash);
$result = mysql_query($query);
while ($row = mysql_fetch_object($result)) {
$value[] = $row;
}
$memcache->set($hash,$value,NULL,$timeout);
}
if (!is_array($value)) $value = array();
return $value;
}
/**
* Suppression d'un élément du memcached.
*
* @param string $query Requête SQL ou alias
* @return bool Résultat de la suppression
*/
function mcache_delete($query) {
global $memcache, $common_name;
$hash = $common_name.md5($query);
$value = $memcache->delete($hash);
return $value;
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment