Quelle bibliothèque d'abstraction de base de données (SGDB) choisir ?

ADOdb Database Abstraction Library for PHP (and Python)

Pilotes ADOdb :

La version actuelle de PHP supporte de nombreuses base de données : (Liste complète des bases de données supportées par ADOdb)

  • MySQL
  • PostgreSQL
  • Interbase
  • Firebird
  • Informix
  • Oracle
  • MS SQL
  • Foxpro
  • Access
  • ADO
  • Sybase
  • FrontBase
  • DB2
  • SAP DB
  • SQLite
  • Netezza
  • LDAP
  • ODBC
  • ODBTP

PDO (PHP Data Objects)

Pilotes PDO :

  • MS SQL Server (PDO) — Microsoft SQL Server et Fonctions Sybase (PDO_DBLIB)
  • Firebird/Interbase (PDO) — Fonctions Firebird/Interbase (PDO_FIREBIRD)
  • IBM (PDO) — Fonctions IBM (PDO_IBM)
  • Informix (PDO) — Fonctions Informix (PDO_INFORMIX)
  • MySQL (PDO) — Fonctions MySQL (PDO_MYSQL)
  • Oracle (PDO) — Fonctions Oracle (PDO_OCI)
  • ODBC et DB2 (PDO) — Fonctions ODBC et DB2 (PDO_ODBC)
  • PostgreSQL (PDO) — Fonctions PostgreSQL (PDO_PGSQL)
  • SQLite (PDO) — Fonctions SQLite (PDO_SQLITE)

PEAR

  • PEAR DB (Ce paquet a été remplacé par MDB2)
  • PEAR MDB2 est un fusion de PEAR DB et Metabase php database abstraction layers.

Pilotes PEAR MDB2 :

  • MDB2_Driver_fbsql
  • MDB2_Driver_ibase
  • MDB2_Driver_mssql
  • MDB2_Driver_mysql
  • MDB2_Driver_mysqli
  • MDB2_Driver_oci8
  • MDB2_Driver_pgsql
  • MDB2_Driver_querysim
  • MDB2_Driver_sqlite

Zend_Db de Zend Framework

Pilotes Zend_Db (avec PDO)

L'interface de la classe d'adaptateur est semblable à celle de l'extension PHP Data Objects. Zend_Db propose des classes d'adaptateurs vers les drivers PDO pour les SGBDs suivants :

  • IBM DB2 et Informix Dynamic Server (IDS), en utilisant l'extension PHP pdo_ibm.
  • MySQL, utilisant l'extension PHP pdo_mysql.
  • Microsoft SQL Server, utilisant l'extension PHP pdo_mssql.
  • Oracle, utilisant l'extension PHP pdo_oci.
  • PostgreSQL, grâce à l'extension PHP pdo_pgsql.
  • SQLite, avec l'extension PHP pdo_sqlite.

Pilotes Zend_Db (sans PDO)

De plus, Zend_Db fournit aussi des classes se connectant avec les extensions PHP propres aux SGBDs (hors PDO donc), pour les SGBDs suivants :

  • MySQL, utilisant l'extension PHP mysqli.
  • Oracle, utilisant l'extension PHP oci8.
  • IBM DB2, utilisant l'extension PHP ibm_db2.
  • Firebird/Interbase, utilisant l'extension PHP php_interbase

Mysql et PHP, quelle API choisir ?

Quelles sont les principales API PHP pour l'utilisation de MySQL ?

PHP propose 3 API natives pour Mysql :

  • PHP's MySQL Extension
  • PHP's mysqli Extension
  • PHP Data Objects (PDO)

Chacun a ses avantages et ses inconvénients. La discussion qui suit vise à donner une brève introduction aux principaux aspects de chaque API.

Qu'est-ce que PHP Extension MySQL?

Cette extension est à l'origine conçu pour vous permettre de développer des applications PHP qui interagissent avec une base de données MySQL. L'extension mysql fournit une interface de procédure et est destiné à être utilisé uniquement avec les versions plus anciennes de MySQL 4.1.3. Cette extension peut être utilisé avec les versions de MySQL 4.1.3 ou plus récent, mais pas toutes les dernières fonctionnalités serveur MySQL est disponible.

Note: Si vous utilisez MySQL version 4.1.3 ou plu, il est fortement recommandé d'utiliser plutôt l'extension MySQLi. L'extension mysqli vous permet d'accéder aux fonctionnalités fournies par MySQL 4.1 et supérieur.

Quelle est l'extension mysqli de PHP?

L'extension mysqli, ou comme il est parfois connue, l'extension améliorée de MySQL, a été conçu pour prendre avantage des nouvelles fonctionnalités dans les systèmes de versions de MySQL 4.1.3 et plus récentes. L'extension mysqli est inclus avec les versions de PHP 5 et plus

L'extension mysqli a un certain nombre de prestations, les principales améliorations de l'extension mysqli sont :

  • Object-oriented interface
  • Support for Prepared Statements
  • Support for Multiple Statements
  • Support for Transactions
  • Enhanced debugging capabilities
  • Embedded server support

Note: Si vous utilisez MySQL version 4.1.3 ou plus tard, il est fortement recommandé d'utiliser cette extension.

Pour de plus amples informations sur l'extension mysql, voir mysqli.

Qu'est-ce que PDO?

PHP Data Objects, ou PDO est une couche d'abstraction de base de données spécifiquement pour les applications PHP. PDO fournit une API pour votre application PHP, quel que soit le type de serveur de base de données de votre application se connecte à. En théorie, si vous utilisez l'API PDO, vous pouvez changer le serveur de base de données que vous avez utilisé, de dire Firebird à MySQL, et seulement besoin de faire des modifications mineures à votre code PHP.

D'autres exemples de couches d'abstraction de base de données JDBC pour les applications Java et Perl pour DBI.

Alors que PDO a ses avantages, comme un propre, simple, portable API, son principal inconvénient est qu'il ne vous permet pas d'utiliser toutes les fonctionnalités avancées qui sont disponibles dans les dernières versions du serveur MySQL. Par exemple, PDO ne vous permet pas d'utiliser MySQL pour le soutien de multiples déclarations (Statements).

Quel est le pilote PDO MYSQL?

Le PDO MYSQL driver n'est pas une API en tant que tel, au moins à partir du programmeur PHP's perspective. En fait, le PDO MYSQL conducteur se trouve dans la couche ci-dessous PDO lui-même et fournit des fonctionnalités spécifiques à MySQL. Le programmeur appelle encore l'API PDO, mais PDO utilise PDO MYSQL pour procéder à la communication avec le serveur MySQL.

Le pilote PDO MYSQL est l'un des pilotes disponibles de PDO. Les autres pilotes PDO disponibles sont notamment ceux de la Firebird et de serveurs de bases de données PostgreSQL.

Le driver PDO MYSQL est mis en œuvre en utilisant un framework d'extension PHP.

Pour de plus amples informations sur le pilote PDO MYSQL, voir MySQL (PDO).

Qu'est-ce que PHP MySQL Native Driver?

Afin de communiquer avec le serveur de la base de données les pilotes MySQL extension mysql, mysqli et PDO MYSQL utilisent chacun, un bas niveau de la bibliothèque qui implémente le protocole. Dans le passé, la seule bibliothèque a été la bibliothèque du client MySQL, autrement connu sous le nom de libmysql.

Toutefois, l'interface présentée par libmysql n'est pas optimisé pour la communication avec les applications PHP, comme libmysql a été initialement conçu pour les applications C à l'esprit. Pour cette raison, le pilote natif MySQL, mysqlnd, a été développé comme une alternative à libmysql pour applications PHP.

L'extension mysql, les pilotes mysqli extension et PDO MySQL peut être individuellement configuré pour utiliser soit libmysql ou mysqlnd. Comme mysqlnd est conçu spécifiquement pour être utilisés dans le système PHP il dispose de nombreuses améliorations de la mémoire et de vitesse sur libmysql. Vous êtes fortement encouragés à profiter de ces améliorations.

Note: Le pilote natif MySQL ne peut être utilisé qu'avec le serveur MySQL versions 4.1.3 et ultérieures.

Comparaison des Fonctionnalités

Le tableau suivant compare les fonctionnalités des trois principales méthodes de connexion à MySQL de PHP:

  PHP's mysqli Extension PDO (Using PDO MySQL Driver and MySQL Native Driver) PHP's MySQL Extension
PHP version introduced 5.0 5.0 Prior to 3.0
Included with PHP 5.x yes yes Yes
Comes with PHP 6.0 Yes Yes Yes
MySQL development status Active development Active development as of PHP 5.3 Maintenance only
Recommended by MySQL for new projects Yes - preferred option Yes No
API supports Charsets Yes Yes No
API supports server-side Prepared Statements Yes Yes No
API supports client-side Prepared Statements No Yes No
API supports Stored Procedures Yes Yes No
API supports Multiple Statements Yes Most No
Supports all MySQL 4.1+ functionality Yes Most No

Ressources

PDO offre l'avantage d'être développée en C, directement par l'équipe de développement de PHP. Elle profite donc non seulement de performances inaccessibles aux couches d'abstraction écrites en PHP, comme PEAR::DB ou AdoDB, mais elle permet également aux développeurs d'implémenter plus rapidement des pilotes de bases, grâce à ce nouveau socle commun et standard à PHP 5. De fait, c'est aujourd'hui la méthode recommandée d'accès aux bases de données pour toute application utilisant PHP 5.1+. A terme, une application PHP 5 ne sera plus liée à une seule base (le plus souvent MySQL), mais à PDO, et donc potentiellement à n'importe quel SGBD adéquat parmi SQLite (activé par défaut), MySQL, PostgreSQL, Oracle, Sybase, SQL Server, ...

Speed comparison (see end for summary)

Library/Function		Time		Absolute Difference
Direct database functions	3.6526100635529	0
ADOdb + ADOdb/extension	4.2841749191284	0.6315648
PDO				4.287976026535	0.6353659
ADOdb (w/o extension)		5.3411331176758	1.688523
PEAR::DB			6.5583028793335	2.9056928
If performance is critical, don’t consider ADOdb unless an optimizer such as APC is installed. Even then, I do not recommend ADOdb unless ADOdb offers some critical feature that is missing in PDO. Even with APC installed the best run of ADOdb was 225% slower than with PDO.

Why? PDO is a native compiled library and not loaded at runtime.


** Benchmark comparing the performance of the PDO and ADOdb Database Abstraction Libraries for PHP (2008)

The Result

In the case of Benchmarking PDO vs ADOdb, I saw benchmarks using the flawed benchmark methodology which put PDO at only a 125% speedup over the ADOdb library.

When I benchmarked (see full benchmark here) the PDO library provide as much as a 2840% speedup over the ADOdb Library.

My conclusion - load time inclusion times in web languages makes a huge difference.
I found that PDO was slower than mysqli in every test except prepared inserts

Cherchant également une bibliothèque d'abstraction de base de données, j'ai trouvé http://dotclear.placeoweb.com/post/ADOdb-PDO-PEAR-MDB2-Zend_Db-Benchmark parlant de ADOdb, PDO, PEAR MDB2, Zend_Db.

Notes

Tel que l'indique zend.db.adapter.adapter-notes, faites attention aux clés primaires auto-incrémentées.

Oracle

Cet adaptateur utilise l'extension PHP oci8.
Oracle ne supporte pas les clé auto-incrémentées, donc vous devriez spécifier un paramètre de séquence à lastInsertId() ou lastSequenceId().
L'extension Oracle ne supporte pas les paramètres positionnés (?). Vous devez utiliser des paramètres nommés (:name).
Actuellement l'option Zend_Db::CASE_FOLDING n'est pas supportée par l'adaptateur Oracle. Pour l'utiliser, vous devez utiliser l'adaptateur basé sur PDO et OCI.

PDO MySQL

Cet adaptateur utilise les extensions PHP pdo et pdo_mysql.
MySQL ne supporte pas les séquences, ainsi lastInsertId() ignore les paramètres qu'on lui passe et retourne toujours la valeur de la dernière clé auto-incrémentée. lastSequenceId() retourne toujours null.

PDO Oracle

Cet adaptateur utilise les extensions PHP pdo et pdo_oci.
Oracle ne supporte pas les clé auto-incrémentées, donc vous devriez spécifier un paramètre de séquence à lastInsertId() ou lastSequenceId().

PDO PostgreSQL

Cet adaptateur utilise les extensions PHP pdo et pdo_pgsql.
PostgreSql supporte les séquences et les clés auto-incrémentées. Les arguments de lastInsertId() sont donc optionnels. Si vous ne passez pas de paramètres, alors l'adaptateur retourne la dernière valeur de clé auto- incrémentée. Sinon, il retourne la dernière valeur de la séquence passée en paramètre, en se référant à la convention 'table_colonne_seq'.

PDO SQLite

Cet adaptateur utilise les extensions PHP pdo et pdo_sqlite.
SQLite ne supporte pas les séquences, ainsi lastInsertId() ignore les paramètres qu'on lui passe et retourne toujours la valeur de la dernière clé auto-incrémentée. lastSequenceId() retourne toujours null.
Pour vous connecter à une base de données SQLite2, spécifiez le paramètre 'sqlite2'=>true dans le tableau d'options passé à l'adaptateur, lors de la création de l'instance de Pdo_Sqlite Adapter.
Pour vous connecter à une base de données SQLite en mémoire, spécifiez le paramètre 'dsnprefix'=>':memory:' dans le tableau d'options passé à l'adaptateur, lors de la création de l'instance de Pdo_Sqlite Adapter.
Les anciennes versions du driver SQLite pour PHP ne semblent pas supporter les commandes PRAGMA nécessaires pour s'assurer que les colonnes ayant un nom court soient utilisées dans les résultats. Si vous avez des problèmes, tels que vos enregistrements sont retournés avec une forme "nomtable.nomcolonne" lors de vos jointures, vous devriez alors mettre à jour votre version de PHP.

Bilan

Au final,