Devrais-je utiliser php PDO ou mysql_connect normal pour exécuter des requêtes de base de données en PHP?
Lequel est le plus rapide?
L'un des principaux avantages de PDO est que l'interface est cohérente sur plusieurs bases de données . Il existe également des fonctions intéressantes pour les instructions préparées, qui simplifient énormément la tâche d'échapper à toutes vos chaînes de requête. La portabilité de PDO est supérieure à mysql_connect.
Donc, devrais-je utiliser PDO pour ces raisons ou rester fidèle à mysql_connect?
PDO est un peu plus lent que le mysql _ * Mais sa portabilité est excellente. PDO fournit une interface unique sur plusieurs bases de données. Cela signifie que vous pouvez utiliser plusieurs bases de données sans utiliser mysql_query pour mysql, mssql_query pour MS sql, etc. Utilisez simplement quelque chose comme $ db-> query ("INSERT INTO ...") toujours. Peu importe le pilote de base de données que vous utilisez.
Donc, pour un projet plus grand ou portable, PDO est préférable. Même le framework zend utilise PDO.
Certains timings rapides indiquent que PDO est légèrement plus rapide à la connexion.
$start = microtime(true);
for($i=0; $i<10000; ++$i) {
try {
$db = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage()."\n";
}
$db = null;
}
$pdotime = microtime(true) - $start;
echo "PDO time: ".$pdotime."\n";
$start = microtime(true);
for($i=0; $i<10000; ++$i) {
$db = mysql_connect($Host, $user, $password);
if(!$db) {
echo "Connection failed\n";
}
if(!mysql_select_db($schema, $db)) {
echo "Error: ".mysql_error()."\n";
}
mysql_close($db);
}
$rawtime = microtime(true) - $start;
echo "Raw time: ".$rawtime."\n";
Donne des résultats comme
PDO time: 0.77983117103577
Raw time: 0.8918719291687
PDO time: 0.7866849899292
Raw time: 0.8954758644104
PDO time: 0.77420806884766
Raw time: 0.90708494186401
PDO time: 0.77484893798828
Raw time: 0.90069103240967
La différence de vitesse sera de toute façon négligeable. établir une connexion réseau prendra probablement BEAUCOUP plus longtemps que tout temps système engendré par le PDO, en particulier si le serveur mysql est sur un autre hôte.
Vous avez mentionné toutes les raisons d'utiliser vous-même PDO. En réalité, n'utilisez jamais les fonctions mysql_ * directement, utilisez PDO, ou utilisez someotherlibrary .
Je ne pense pas que la vitesse soit ce que les gens recherchent lorsqu'ils utilisent AOP - je ne sais pas s'il existe une différence, et honnêtement, je m'en fiche: tant que je pose quelques questions à une base de données lors de la génération d’une page, quelques millisecondes du côté PHP ne changeront rien.
Il y a deux/trois grandes choses avec PDO, par rapport à mysql_*
:
mysql_*
, pg_*
, oci_*
, ...mysqli_*
a une API OO, mais pas mysql_*
)mysqli_*
, mais pas mysql_*
, encore une fois)BTW: J'utilise généralement PDO - soit "à la main", soit intégré dans/utilisé par Zend Framework et/ou Doctrine .
Comme note: Même si vous n’utilisez pas PDO, notez qu’il est recommandé d’utiliser mysqli au lieu de mysql.
Voir cette page du manuel PHP , à ce sujet.
J'ai effectué des tests de performance pour comparer les fonctions Mysqli aux fonctions PDO en utilisant à la fois des instructions préparées et des requêtes directes régulières (testées à l'aide d'instructions select sur les tables Mysqlnd et MyISAM).
J'ai trouvé que les requêtes PDO sont légèrement plus lentes que Mysqli, mais seulement légèrement. Cela est logique puisque PDO utilisé à cette fin est principalement un wrapper qui appelle des fonctions Mysqli. L'utilisation de PDO présente l'avantage de faciliter la migration vers une base de données différente, car les noms de fonction ne sont pas spécifiques à MySQL.
La réelle différence de performances réside dans le fait que vous utilisiez des requêtes préparées. Il existe une performance importante et significative pénalité à l’utilisation de requêtes préparées. D'autres personnes qui les ont testées ont trouvé les mêmes résultats.
Les requêtes préparées sont les plus rapides si vous la préparez une fois puis que vous la soumettez des milliers de fois avec différentes valeurs de données. Sinon, il est toujours plus rapide d'utiliser mysqli :: query () ou PDO :: query (). Mais il est important de savoir que ces fonctions n'échappent pas aux données, vous devez donc vous rappeler d'utiliser mysqli :: real_ escape_ string () ou PDO :: quote () sur les variables de données.
Je recommanderais généralement d’utiliser PDO sauf s’il existe une raison particulière pour laquelle vous ne pouvez pas. S'il n'y a pas une petite différence entre les deux et que vous n'avez aucune raison de ne pas utiliser PDO, je pense qu'il serait préférable de commencer à utiliser l'abstraction de base de données dans vos applications plutôt que d'utiliser mysql_ * simplement parce qu'il existe déjà. Je dirais que la meilleure pratique gagne.
PDO fournit plus de fonctionnalités avec moins de lignes de codes Exemple:
les deux la même fonctionnalité mais vous comparez pour les codes PDO est plus humainement lisible :).
Dans les deux cas, vous appelez le même serveur MySQL depuis le même serveur Php ... afin que vous ne remarquiez pas beaucoup de différence.
Si vous voulez de bonnes performances, pensez au cache (memcache ou fichier Php simple ...) et créez une bonne structure de base de données (INDEX ...)
Si les performances ne sont pas un "vrai problème" pour vous, vous devez utiliser PDO. Les performances diffèrent par petites marges, et PDO possède une interface très agréable et portable, qui permet de gérer plusieurs bases de données, ce qui vous évite des soucis si vous devez utiliser plusieurs pilotes de base de données.
Quelques avantages du PDO: