Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/08/2011, 18h15   #1
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Par défaut [PHP 5.3] Remplissage d'une table

Bonjour à tous.

A des fins de tests de performances, j'ai écrit un script qui me permet de remplir une table MySQL (innoDB) avec des données aléatoires. Ce script prépare une requête d'insertion qui est exécutée 500.000x, or les insertions s'arrêtent au bout de 4096 lignes alors que le retour de PDOStatement::execute lui est toujours true...

J'ai vérifié l'algorithme de génération aléatoire et il n'y a pas de redondance, la table porte un index unique sur l'intégralité de ses champs (sauf la clé) mais la probabilité de générer un triplet existant est quasi-nulle.

Bref, je me retrouve devant un comportement que je n'ai jamais remarqué en production où il est courant de traiter des batchs de plusieurs dizaines de milliers de lignes...

Je précise que les tests se déroulent sur un environement WAMP avec MySQL 5.1, PHP 5.3 et Apache 2.2.

Avez-vous déjà rencontré ce problème ? D'où peut-il bien venir ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 18h39   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
montre pour voir
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 18h49   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Je me permet de masquer certaines données.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
set_time_limit(0);
define('NUM', 500 * 1000);
 
function generate_random_string ($maxlength = 10, $chars = "abcdefghijklmnopqrstuvwxyz0123456789") {
    $str = "";
    $c = strlen($chars) -1;
    do {
        $str .= $chars[mt_rand(0, $c)];
    } while (strlen($str) < $maxlength);
    return $str;
}
 
$pdo = new PDO('mysql:dbname=xxxxxxx;host=xxxxxxx', 'xxxxxxx', 'xxxxxxx');
$stmt = $pdo->prepare('REPLACE INTO `xxxxxxx` (`xxxxxxx`,`xxxxxxx`,`xxxxxxx`) VALUES (:xxxxxxx,:xxxxxxx,:xxxxxxx)');
 
$l = strlen((string)NUM);
for ($i = 0; $i < NUM; $i++) {
    $p = array(
    	'xxxxxxx' => generate_random_string(15, '123456789'),
        'xxxxxxx' => '+33' . generate_random_string(9, '0123456789'),
        'xxxxxxx' => generate_random_string(16, '0123456789')
    );
    $r = $stmt->execute($p);
    echo '[' . str_pad($i +1, $l, '0', STR_PAD_LEFT) . '/' . NUM . '] > Insert ' . $p['xxxxxxx'] . ':' . $p['xxxxxxx'] . ':' . $p['xxxxxxx'] . ' ' . ($r ? 'OK' : 'NOK') . "\n";
}
 
echo "Done.";
Exécuté en mode CLI.

Allez savoir pourquoi mais maintenant ça fonctionne depuis que j'ai remplacé l'usage de rand par mt_rand...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 19h06   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
t'as pas activé les erreurs pour PDO ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 19h13   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Alors, comme je l'ai mentionné, le fait de mieux générer mes phrases aléatoires m'a permi de résoudre le problème. Encore que je ne comprenne pas bien pourquoi la génération de 43 parmi 10 caractères ne permette que 4096 triplets en utilisant rand()...

Le souci c'est que je n'avais pas de message d'erreur, le retour de $stmt->execute était bien true à chaque fois - donc je suppose que les entrées étaient simplement écrasées et que c'est la génération aléatoire qui était en cause.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 19h16   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
si tu veux t'as openssl_random_pseudo_bytes, mais ca marche pas très bien (assez lent sous win)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h02.


 
 
 
 
Partenaires

Hébergement Web