Economiser vos ressources PHP/MySQL en environnement complexe
Par Maxime Ritter, vendredi 30 novembre 2007 à 05:04 - Geekeries - #607 - rss
Quand on développe une appli PHP/MySQL un peu complexe, en particulier quand on gère plusieurs serveurs SQL, il n'est pas rare d'être dans une situation où l'on ouvre des connections à un serveur MySQL qui ne serviront que dans 2 à 3% des cas. On ouvrira par exemples des connections MySQL susceptibles avant d'appeler un fonction qui demande en paramètre le link MySQL. Fonction qui utilisera par exemple memcache pour cacher les requêtes MySQL. D'emblée, on peut se dire que cela n'a aucune incidence. Ce n'est pas vrai : la connection prendra 1 ms à s'établir, va créer un thread dans MySQL, et consommer un slot et de la mémoire dans l'Apache plus longtemps. Et si on utilise memcache, c'est bien pour économiser des ressources MySQL, n'est-ce pas ?
Alors, pourquoi vous ne développer pas une bibliothèque permettant d'ouvrir vos connection MySQL qu'au moment où elles deviennent vraiment nécessaires ?
class CDSQL {
var $this->link = FALSE;
function real_connect() {
$this->link = mysql_connect($this->host, $this->user, $this->pass)
or die($_SERVER['SERVER_ADDR'] . " : could not connect to " . $this->host . ": " . mysql_error());
mysql_select_db($this->db, $this->link) or die("Could not select database : ".$this->db);
}
function check_connect() {
if(! $this->link)
real_connect();
}
function mysql_query($query){
$this->check_connect();
$result = mysql_query($query,$this->link) or die("Die Query Failed : $query ". mysql_error());
return $result;
}
function CDSQL($host,$db,$user,$pass) {
$this->host = $host;
$this->db = $db;
$this->user = $user;
$this->pass = $pass;
}
function insert_id(){
return mysql_insert_id($this->link);
}
function affected_rows() {
return mysql_affected_rows($this->link);
}
function ping() {
$this->check_connect();
return mysql_ping($this->link);
}
Il suffit dès lors de passer une instance de CDSQL (construite avec les bons paramètres pour se connecter à la base de données) au lieu d'un lien MySQL à ses fonctions susceptibles d'avoir besoin d'une base de données.
"Beware of bugs in the above code; I have only proved it correct, not tried it.". Moi aussi je peux me la jouer Donald Knuth. Enfin presque, si on voulait faire ça proprement, il faudrait un destructeur qui fait le mysql_close, mais il n'y a pas de desctructeur en PHP4, et il n'y a pas de gestion des exceptions en PHP4, d'où les die(). Dans la vraie vie on est vite tenté de rajouter d'autres fonctionnalités (par exemple pour quoter les requêtes et éviter les injections SQL ou gérer plusieurs types de bases de données).
Il subsiste le cas où pour des raisons sanitaires on préfère s'assurer que le serveur MySQL est bien en état avant de commencer un traitement, mais pour des pages, c'est rarement le cas. Pour ces cas-là , on pourra toujours forcer la connection en appelant la méthode real_connect().
Note for future : la nuit est faite pour dormir, pas pour relire du code PHP/MySQL.



Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire