Traîtement d'une base trop long (>30sec)

Fermé
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 - 22 juin 2009 à 08:18
dodoecchi Messages postés 454 Date d'inscription samedi 9 septembre 2006 Statut Membre Dernière intervention 26 avril 2012 - 26 juin 2009 à 14:11
Bonjour à tous les gens !

Je compte effectuer dans ma base de données un traitement consistant à supprimer dans un enregistrement tel que "88 88 88 88 88" les espaces pour donner "8888888888".
J'utilise la fonction php str_replace.

Malheureusement ma requête s'effectuant sur environ 1700 enregistrement n'est jamais accomplie en totalité.
En effet, au bout de 30 secondes, une erreur Mysql apparaît m'indiquant que le temps de requête a dépassé 30 secondes.
La page traite correctement jusqu'à 800 enregistrements maximum avant de s'arrêter.

Quelqu'un aurait une solution pour découper cette requête en 3 parties ?
Ou pour accélérer le temps de traîtement ?
Ou pour augmenter le délai maximum de requête ?

D'avance merci à tous !

Momo

10 réponses

dodoecchi Messages postés 454 Date d'inscription samedi 9 septembre 2006 Statut Membre Dernière intervention 26 avril 2012 29
22 juin 2009 à 17:40
ta méthode ne doit pas être adaptée.......
tu fais comment tes requêtes? tu sais que tu peux utiliser les expressions régulières pour cherchers des formes de texte précises?
http://dev.mysql.com/doc/refman/5.0/fr/regexp.html
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
22 juin 2009 à 20:44
Merci beaucoup pour la réponse !

Je ne peux pas vous expliquer clairement avec du code comment on a fait ça, car je ne l'ai pas sous la main quand je suis chez moi, mais demain je vais étudier le principe des expressions régulières qui à première vue m'a l'air pas mal.

Merci beaucoup beaucoup !
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
23 juin 2009 à 14:26
Rebonjour,

En fait je ne sais pas quoi faire avec ces expressions régulières !

Je vais expliquer clairement.

Je dispose d'un tableau excel contenant 1700lignes ~. J'ai besoin de l'importer dans ma base de données Mysql.
Jusque là, pas de problèmes, l'import se déroule parfaitement.

J'ai aussi besoin de transformer des enregistrements de la forme "XX XX XXXX XX" (par exemple) en "XXXXXXXXXX". (de virer les espaces automatiquement dans tous ces enregistrements en gros)

mon codes est sous la forme:
$query="SELECT * FROM matable WHERE 1";
$result=mysql_query($query,$link) or die ("Impossible de créer la requête);
while($tableau=mysql_fetch_array($result))
{
$num_sans_espace= str_replace(' ','',$tableau[num]);
$query2="UPDATE matable SET num='$num_sans_espace' WHERE num='$tableau[num]'";
mysql_query($query2,$link) or die ("Impossible de créer la requête);
}



En gros, on prend tous les enregistrements "num" de ma table, dans la while on remplace chaque enregistrement "num" par un "num_sans_espace".

Le problème vient du fait que la page php ne parvient pas à effectuer plus de 800 modifications dans ma table (sur 1700) car au bout de 30 secondes d'éxécution -> erreur !

D'avance merci à qui pourra m'aider ! :)
0
tregate Messages postés 84 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 18 février 2011 16
23 juin 2009 à 14:39
Pauvre de toi damien :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
24 juin 2009 à 08:25
Merci pour cette réponse Ô combien utile à mon problème.

Je vais préciser autre chose maintenant.

Je pense que, si il n'éxiste aucun moyen d'effectuer le traîtement de mes 1700 enregistrements, il faudrait, lors de l'import automatique de mon tableau .csv, pouvoir le découper en 3 et l'insérer dans trois tables distinctes (1700 / 3 =~ 567, là il réussirait à le faire).
Ou alors, importer le tableau entier dans une seule table, puis découper cette table en trois pour l'insérer dans trois tables distinctes.

Ou alors, encore, importer le tableau entier dans une seule table, puis, lors du traîtement, dire au Mysql de commencer à traiter de 1 à 567, de 567 à 1134 etc ...

Mais dans les deux premiers cas, je ne sais pas vraiment par où commencer, à part pour le dernier, on pourrait mettre une clef primaire qui s'incrémente automatiquement à chaque nouvel enregistrement (lors de l'import du tableau dans la bdd, dans ce dernier cas je pourrai éventuellement essayer)
0
dodoecchi Messages postés 454 Date d'inscription samedi 9 septembre 2006 Statut Membre Dernière intervention 26 avril 2012 29
24 juin 2009 à 13:33
comme t'a pas l'air d'avoir compris les regexp, je t'ai fait une petite vidéo
http://www.4 shared.com/file/113831541/383306f1/regexp_re.html
(supprime l'espace, je suis obligé de faire ça sinon CCM bloque le lien)

comme j'ai cherché en même temps elle est un p'tit peu longue
tu peux sauter direct à la 7e minute pour voir le résultat

sinon :
WHERE name REGEXP '^:digit::digit::space::digit::digit::space::digit::digit::digit::digit::space::digit::digit:'


à toi d'adapter

Dorian
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
25 juin 2009 à 08:39
Merci d'avoir pris la peine de m'expliquer tout ça !

Le coup du REGEXP fonctionne bien, mais un problème subsiste :
Les 1700 lignes sont trop longues à traiter et la page m'affiche une erreur au bout de 30secondes.

En répétant l'opération une seconde fois (étant donné que plus de la moitié du tableau a pu être traitée en 30 secondes) cela fonctionne.

Mais j'ai besoin de quelque chose d'ergonomique. Il faudrait que l'erreur ne s'affiche pas et un système pour que la page répète deux fois l'opération de str_replace.
(lorsque la page affiche l'erreur mysql, elle bloque tout le reste du contenu, donc impossible de "copier/coller" ça deux fois dans la même page)

D'avance merci pour la solution apportée et merci pour le bon bout de solution déjà apporté !

Momo
0
dodoecchi Messages postés 454 Date d'inscription samedi 9 septembre 2006 Statut Membre Dernière intervention 26 avril 2012 29
25 juin 2009 à 11:24
x traitements
HTTP redirect
encore x traitements
si fini > on arrête
si pas fini > on re-HTTP redirect
etc...
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
26 juin 2009 à 08:55
Bonjour et merci pour la réponse, j'ai essayé de faire un code suivant vos indications comme celui-ci:

$query="SELECT * FROM matable WHERE monChamp REGEXP \"^:digit:::digit:::space::\"";
$result=mysql_query($query,$link);
$i=0;
while($tableau=mysq_fetch_array($result))
{
if($tableau[monChamp] != '')
{
      if($i<=500)
      {
       $replace = str_replace(' ','',$tableau[monChamp]);
       $query="UPDATE matable SET monChamp= '$replace' WHERE monChamp= '$tableau[monChamp]' ";
       $result=mysql_query($query,$link);
       $i++;
      }
}else header('Location:autrepage.php');
}
header('Location: pageactuelle.php');


Voilà, la page maintenant traite bien 500 enregistrements par 500, à chaque rechargement d'elle-même (le
header('Location: pageactuelle.php');
à la fin permet de se recharger elle-même.

Lorsque tous les enregistrements ont été modifiés, le
$query="SELECT * FROM matable WHERE monChamp REGEXP \"^:digit:::digit:::space::\"";
ne devrait plus rien renvoyer et, justement, lorsqu'on veut afficher son $tableau[monChamp] il n'affiche rien.
D'où le
if($tableau[monChamp] != '')



Mon problème est qu'il n'a pas l'air de comprendre que la condition n'est plus vraie car il ne charge jamais la page "autrepage.php" via le
else header('Location:autrepage.php');
.
Même lorsque tous les enregistrements sont traités, il se contente de recharger la même page indéfiniment sans jamais charger "autrepage.php"

Merci d'avance pour votre aide !
0
dodoecchi Messages postés 454 Date d'inscription samedi 9 septembre 2006 Statut Membre Dernière intervention 26 avril 2012 29
26 juin 2009 à 14:11
c'est pas comme ça que je fais un redirect moi
<head>
<meta http-equiv="refresh" content="0,url=list.php"/>
</head>


et si tu veux savoir si ta condition pass,e tu met un die(quelquechose) comme ça tu le verras clairement!
0