Created
March 16, 2011 11:55
-
-
Save maximevalette/872369 to your computer and use it in GitHub Desktop.
Fonctions pour gérer un memcache facilement avec MySQL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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