(PECL mysqlnd_ms >= 1.0.0)
mysqlnd_ms_query_is_select — Vérifie quel serveur est sélectionné pour l'envoi de la requête
$query
)Vérifie si l'on doit envoyer la requête au maître, à l'esclave ou bien au dernier serveur MySQL utilisé.
Les plugins internes de lectures/écritures seront utilisés pour analyser la requête afin de rendre une recommandation quant à la destination de la requête. Ce mécanisme est très simple. Le plugin recommandera d'envoyer toutes les requêtes au serveur MySQL maître de réplication sauf les requêtes qui commencent par SELECT, ou commencent avec une astuce SQL qui force l'envoie vers un serveur esclave. En raison de ce mécanisme simple mais rapide, le plugin peut proposer d'exécuter des requêtes en lecture seule comme SHOW TABLES sur le serveur de réplication.
query
La requête à tester.
Une valeur de retour MYSQLND_MS_QUERY_USE_MASTER
indique que la requête doit être envoyée au serveur MySQL maître de
réplication. La fonction retournera une valeur de
MYSQLND_MS_QUERY_USE_SLAVE
si la requête peut
être exécutée sur un esclave en raison du fait qu'elle ait été considérée
comme exécutable en lecture seule. Une valeur de
MYSQLND_MS_QUERY_USE_LAST_USED
est retournée
pour recommander d'exécuter la requête sur le dernier serveur utilisé.
Ce peut être soit le serveur MySQL maître de réplication, soit un
serveur MySQL esclave de réplication.
Si la séparation des lectures et des écritures a été
désactivée avec l'option de configuration
mysqlnd_ms.disable_rw_split,
la fonction retournera toujours
MYSQLND_MS_QUERY_USE_MASTER
ou
MYSQLND_MS_QUERY_USE_LAST_USED
.
Exemple #1 Exemple avec mysqlnd_ms_query_is_select()
<?php
function is_select($query)
{
switch (mysqlnd_ms_query_is_select($query))
{
case MYSQLND_MS_QUERY_USE_MASTER:
printf("'%s' devrait être exécutée sur le maître.\n", $query);
break;
case MYSQLND_MS_QUERY_USE_SLAVE:
printf("'%s' devrait être exécutée sur un esclabe.\n", $query);
break;
case MYSQLND_MS_QUERY_USE_LAST_USED:
printf("'%s' devrait être exécutée sur le serveur qui a exécuté la précédente requête.\n", $query);
break;
default:
printf("Aucune suggestion d'exécution de '%s', par défaut, le maître est recommandé.\n", $query);
break;
}
}
is_select("INSERT INTO test(id) VALUES (1)");
is_select("SELECT 1 FROM DUAL");
is_select("/*" . MYSQLND_MS_LAST_USED_SWITCH . "*/SELECT 2 FROM DUAL");
?>
L'exemple ci-dessus va afficher :
INSERT INTO test(id) VALUES (1) devrait être exécutée sur le maître. SELECT 1 FROM DUAL should be run on a slave. /*ms=last_used*/SELECT 2 FROM DUAL devrait être exécutée sur le serveur qui a exécuté la précédente requête.