mysqli
PHP Manual

Le pilote natif MySQL

Cette partie du manuel fournit un aperçu du pilote natif MySQL.

Qu'est-ce donc?

Le pilote natif MySQL est un substitut à la bibliothèque cliente MySQL (libmysql). Le pilote natif MySQL fait partie des branches officielles PHP 5.3 et PHP 6.

Les extensions de base de données MySQL mysqli et PDO MYSQL communiquent toutes avec le serveur MySQL. Auparavant, les extensions utilisaient les services de la bibliothèque cliente MySQL et étaient compilées par rapport à elle pour utiliser son protocole client-serveur.

Avec le pilote natif MySQL, il y a maintenant une alternative car les extensions de base de données MySQL peuvent être compilées pour utiliser le pilote natif plutôt que la bibliothèque cliente MySQL.

Le pilote natif MySQL est écrit en C comme une extensions PHP.

Ce que ce n'est pas

Bien que le pilote natif MySQL soit écrit comme une extension PHP, il est important de noter qu'il ne fournit pas une nouvelle API au programmeur PHP. Les API programmeur sont fournies par l'extension MySQL, mysqli et PDO MySQL. Ces extensions peuvent maintenant utiliser les services du pilote natif MySQL pour communiquer avec le serveur MySQL. Ainsi, vous ne devez pas considérer le pilote natif MySQL comme une API.

Pourquoi l'utiliser?

Utiliser le pilote natif MySQL offre bon nombre d'avantages par rapport à la bibliothèque MySQL cliente.

L'ancienne bibliothèque MySQL cliente a été écrite par MySQL AB (maintenant partie de Sun Microsystems, Inc.) et a donc été publiée sous licence MySQL, ce qui a eu pour conséquence de désactiver le support de MySQL par défaut dans PHP? Vu que le pilote natif MySQL a été développé comme partie intégrante du projet PHP, il est publié sous licence PHP, ce qui résout les soucis de licence problématique dans le passé.

De plus, auparavant, vous deviez compiler les extensions de base de données MySQL par rapport à une copie de la bibliothèque MySQL cliente, ce qui signifie que vous deviez avoir MySQL d'installé sur la machine sur laquelle vous compiliez PHP à partir des sources. Ainsi, quand votre application PHP était exécutée, les extensions MySQL appelaient les fichier de la bibliothèque MySQL cliente au démarrage, ceux-ci devant être obligatoirement installés sur le système. Avec le pilote natif MySQL, ce n'est plus le cas car il est inclus dans la distribution standard. Ainsi, vous n'aurez plus besoin d'avoir MySQL installé pour compiler PHP ou exécuter des applications PHP faisant appel à une base de données.

Du fait que le pilote natif MySQL soit écrit comme une extension PHP, il est intimement lié au coeur de PHP. Ceci implique une meilleure efficacité, notamment en ce qui concerne l'utilisation de la mémoire, car le pilote utilise l'allocation mémoire de PHP et par conséquent supporte les limites de mémoire. Utiliser le pilote natif MySQL aboutit à des performances égales sinon meilleurs qu'avec la bibliothèque cliente MySQL, car l'utilisation de la mémoire est beaucoup plus efficace. Le fait que lors de l'utilisation de la bibliothèque cliente MySQL, chaque enregistrement est stockée deux fois en mémoire alors que le client natif MySQL ne les stocké qu'une fois constitue un bon exemple de bonne gestion de la mémoire.

Fonctionnalités spéciales

Le pilote natif MySQL fournit aussi quelques fonctionnalités spéciales non disponibles avec la bibliothèque cliente MySQL, listées ci-dessous :

Les statistiques de performances peuvent s'avérer très utiles pour identifier des goulets d'étranglement de performances.

Le pilote natif MySQL fournit aussi des connexions persistantes lors de son utilisation avec l'extension mysqli.

Installation sous Unix

Par défaut, les extensions de base de données MySQL sont configurées pour utiliser la bibliothèque cliente MySQL. Pour utiliser le pilote natif MySQL, PHP doit être compilé en spécifiant explicitement que les extensions de base de données MySQL doivent être compilées par rapport à lui. C'est fait grâce aux options de configuration précédant la compilation de PHP en elle-même.

Par exemple, pour compiler l'extension MySQL, mysqli et PDO MySQL en utilisant le pilote natif MYSQL, la commande suivante doit être passée :

./configure --with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
[autres options]

Installation sous Windows

Dans les distributions officielle de PHP à partir de la version 5.3, le pilote natif MySQL est activé par défaut et aucune configuration supplémentaire n'est nécessaire pour l'utiliser. Toutes les extensions de base de données MySQL l'utiliseront alors.

Utiliser des connexions persistantes

Les extensions de base de données MySQL ne supportent pas les connexions persistantes quand elles sont utilisées avec la bibliothèque cliente MySQL. Par contre, elle les supportent lorsqu'elles utilisent le pilote natif MySQL. Quand une connexion est initiée, le nom d'hôte est préfixé avec "p:". Le code suivant en montre l'exemple, en créant une connexion avec mysqli :

$host="p:localhost";
$port=3306;
$socket="/tmp/mysql.sock";
$user="root";
$password="password";
$dbname="test";

$conn = new mysqli($host, $user, $password, $dbname, $port, $socket)
or die ('On ne peut pas se connecter au serveur de base de données' . mysqli_connect_error());

Utilisation de mysqli_fetch_all()

Si vous utilisez mysqli avec le pilote natif MySQL, vous avez accès au nouvel appel d'API mysqli_fetch_all().

Comme mysqli_fetch_all() retourne tous les enregistrements comme un tableau en un seule passe, il peut consommer davantage de mémoire que certaines fonctions identiques comme mysqli_fetch_array(), qui retourne un enregistrement à la fois. Cependant, si vous voulez passer en revue le jeu de résultats, vous aurez besoin d'une boucle qui aura un impact sur les performances. Ainsi, mysqli_fetch_all() doit être utilisé dans les situations où le résultat sera transmis à une autre couche pour être traité.

Utilisation des donnés statistiques

Le pilote natif MySQL peut collecter des statistiques sur la communication entre le client et le serveur. Ces statistiques sont des trois sortes :

Si vous utilisez l'extension mysqli, ces statistiques sont disponibles via trois appels d'API :

Accéder aux statistiques client

Pour accéder aux statistiques client, vous devez appeler mysqli_get_client_stats(). L'appel à la fonction ne requiert aucun paramètre.

Cette fonction retourne un tableau associatif contenant le nom de la statistique comme clé et la donnée statistiques comme valeur.

Les statistiques client peuvent aussi être accédées via la fonction phpinfo().

Accéder aux statistiques de connexion

Pour accéder aux statistiques client, vous devez appeler mysqli_get_connection_stats(). Cette fonction prend en paramètre la ressource de connexion à la base de données.

Cette fonction retourne un tableau associatif contenant le nom de la statistique comme clé et la donnée statistiques comme valeur.

Accéder aux statistiques de cache Zval

Le pilote natif MySQL collecte aussi des statistiques sur son cache interne de Zval. Ces statistiques peuvent être accédées en utilisant mysqli_get_cache_stats().

Les statistiques de cache Zval obtenues peuvent permettre de régler avec précision un paramètre du php.ini relatif au cache Zval, aboutissant à de meilleures performances.

Statistiques retournées par le pilote natif MySQL

Le tableau suivant présente une liste des statistiques retournées par les fonction mysqli_get_client_stats(), mysqli_get_connections_stats() et mysqli_get_cache_stats().

Statistique
bytes_sent
bytes_received
packets_sent
packets_received
protocol_overhead_in
protocol_overhead_out
bytes_received_ok_packet
bytes_received_eof_packet
bytes_received_rset_header_packet
bytes_received_rset_field_meta_packet
bytes_received_rset_row_packet
bytes_received_prepare_response_packet
bytes_received_change_user_packet
packets_sent_command
packets_received_ok
packets_received_eof
packets_received_rset_header
packets_received_rset_field_meta
packets_received_rset_row
packets_received_prepare_response
packets_received_change_user
result_set_queries
non_result_set_queries
no_index_used
bad_index_used
slow_queries
buffered_sets
unbuffered_sets
ps_buffered_sets
ps_unbuffered_sets
flushed_normal_sets
flushed_ps_sets
ps_prepared_never_executed
ps_prepared_once_executed
rows_fetched_from_server_normal
rows_fetched_from_server_ps
rows_buffered_from_client_normal
rows_buffered_from_client_ps
rows_fetched_from_client_normal_buffered
rows_fetched_from_client_normal_unbuffered
rows_fetched_from_client_ps_buffered
rows_fetched_from_client_ps_unbuffered
rows_fetched_from_client_ps_cursor
rows_skipped_normal
rows_skipped_ps
copy_on_write_saved
copy_on_write_performed
command_buffer_too_small
connect_success
connect_failure
connection_reused
reconnect
pconnect_success
active_connections
active_persistent_connections
explicit_close
implicit_close
disconnect_close
in_middle_of_command_close
explicit_free_result
implicit_free_result
explicit_stmt_close
implicit_stmt_close
mem_emalloc_count
mem_emalloc_ammount
mem_ecalloc_count
mem_ecalloc_ammount
mem_erealloc_count
mem_erealloc_ammount
mem_efree_count
mem_malloc_count
mem_malloc_ammount
mem_calloc_count
mem_calloc_ammount
mem_realloc_count
mem_realloc_ammount
mem_free_count
proto_text_fetched_null
proto_text_fetched_bit
proto_text_fetched_tinyint
proto_text_fetched_short
proto_text_fetched_int24
proto_text_fetched_int
proto_text_fetched_bigint
proto_text_fetched_decimal
proto_text_fetched_float
proto_text_fetched_double
proto_text_fetched_date
proto_text_fetched_year
proto_text_fetched_time
proto_text_fetched_datetime
proto_text_fetched_timestamp
proto_text_fetched_string
proto_text_fetched_blob
proto_text_fetched_enum
proto_text_fetched_set
proto_text_fetched_geometry
proto_text_fetched_other
proto_binary_fetched_null
proto_binary_fetched_bit
proto_binary_fetched_tinyint
proto_binary_fetched_short
proto_binary_fetched_int24
proto_binary_fetched_int
proto_binary_fetched_bigint
proto_binary_fetched_decimal
proto_binary_fetched_float
proto_binary_fetched_double
proto_binary_fetched_date
proto_binary_fetched_year
proto_binary_fetched_time
proto_binary_fetched_datetime
proto_binary_fetched_timestamp
proto_binary_fetched_string
proto_binary_fetched_blob
proto_binary_fetched_enum
proto_binary_fetched_set
proto_binary_fetched_geometry
proto_binary_fetched_other

mysqli
PHP Manual