Comme dit mes serveurs fonctionnent en réplication. Donc les données des bases de mes 2 serveurs sont identiques.Je ne sais pas comment s'organisent tes tables, mais le problème, c'est que quand tu écriras sur le serveur maître, il faudra peut être à chaque fois mettre à jour le serveur esclave.
mt_rand (1,2); qui va t'indiquer d'utiliser le serveur 1 ou 2, et ceci de manière aléatoire, tu auras donc une probabilité théoriquement égale que le script utilise le serveur 1 ou le 2, suffit juste ensuite de sélectionner la connexion correspondante.
class psai_db_mysql4
{
/**
* @param array Connexions ouvertes vers les serveurs
*/
private $links = array();
/**
* @param array Paramètres de configuration
*/
private $config;
public function __destruct()
{
foreach ($this->links as $link)
{
mysql_close($link);
}
$this->links = array();
}
public function query($sql)
{
$link = (preg_match('#^SELECT#i', $sql)) ? 'slave' : 'master';
$this->connect($link);
return psai_result(mysql_query($sql, $this->links[$link]));
}
private function connect($link)
{
if (isset($this->links[$link]))
{
return;
}
if (!isset($this->config))
{
$this->config = include('/path/to/config.php');
}
$this->links[$link] = mysql_connect(
$this->config[$link]['host'],
$this->config[$link]['username'],
$this->config[$link]['password']
);
mysql_select_db($this->config[$link]['database'], $this->links[$link]);
}
}
class psai_db_mysql5
{
/**
* @param array Connexions ouvertes vers les serveurs
*/
private $links = array();
/**
* @param array Paramètres de configuration
*/
private $config;
public function __destruct()
{
foreach ($this->links as $link)
{
$link->close();
}
$this->links = array();
}
public function query($sql)
{
$link = (preg_match('#^SELECT#i', $sql)) ? 'slave' : 'master';
$this->connect($link);
return $this->links[$link]->query($sql);
}
private function connect($link)
{
if (isset($this->links[$link]))
{
return;
}
if (!isset($this->config))
{
$this->config = include('/path/to/config.php');
}
$this->links[$link] = new mysqli(
$this->config[$link]['host'],
$this->config[$link]['username'],
$this->config[$link]['password'],
$this->config[$link]['database']
// ne pas oublier les ports, sockets, etc...
);
}
}
class psai_result
{
private $result;
public function __construct($result)
{
$this->result = $result;
}
public function __destruct()
{
if (isset($this->result))
{
mysql_close($this->result);
unset($this->result);
}
}
public function close()
{
$this->__destruct();
}
public function fetch_assoc()
{
if ($row = mysql_fetch_assoc($result))
{
return $row;
}
/**
* On a fini de traiter les résultats, on libère le buffer
*/
$this->__destruct();
return false;
}
}
$db = new db;
$result = $db->query('SELECT ...');
while ($row = $result->fetch_assoc())
{
// ...
}
$result->close();
L'astuce que je recommande c'est de se baser sur MySQLi pour les fonctions et la manière dont les résultats sont retournés. Notamment, dans cet exemple j'utilise une classe "psai_result" destinée à posséder la même signature que mysqli_result. De cette façon, dès que tu passes à MySQL 5 (en imaginant que tu utilises PHP 5 et MySQLi) tu n'as qu'à remplacer la classe d'accès à la base de données et tes scripts ne sont pas affectés (au lieu de recevoir des objets psai_result ils recoivent des mysqli_result, mais leurs signatures étant identiques pas de bobo).
C'est ce que je te disais, lorsque tu écris, tu dois écrire sur les 2 serveurs, c'est quand tu lis que tu choisis un des 2 serveurs...Mettre en place une replication bi-directionnelle, et acceder en lecture/ecriture de facon random sur les 2 serveurs ne me tente pas trop, j'ai pu lire pas mal de problemes avec cette methode (des données différentes d'un serveur à l'autre)