Problème pour experts!
15 messages
• Page 1 sur 1
Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics
- chameau
- Nouveau WRInaute

- Messages: 34
- Inscription: 16 Mar 2004
Problème pour experts!
Voila j'ai développé un jeu en php. Il y a une section marché qui permet de vendre et acheter des objets. Elle fonctionne bien tant qu'il n'y a pas trop d'utilisateur. Le nombre d'achats est limité à 20 par jour par utilisateur.
Un problème surgit quand il y a beaucoup d'utilisateurs connectés (+250), et que le serveur subit quelques ralentissement. Si quelqu'un clique frenetiquement sur le lien des dizaines de foi avant le chargement de la page, il arrive à faire plus de 20 achats!
dans ma bd, nbachats arrive à des résultats négatif.
succintement, voici le code:
Comment cela est-il possible?
Y a-t-il une solution?
Merci
Un problème surgit quand il y a beaucoup d'utilisateurs connectés (+250), et que le serveur subit quelques ralentissement. Si quelqu'un clique frenetiquement sur le lien des dizaines de foi avant le chargement de la page, il arrive à faire plus de 20 achats!
dans ma bd, nbachats arrive à des résultats négatif.
succintement, voici le code:
- Code: Tout sélectionner
$query = "SELECT nbachats FROM utilisateur WHERE id='$idmembre'";
$result= mysql_query($query);
$row = mysql_fetch_row($result);
if($row[0]<20){
$query = "UPDATE utilisateur SET nbachats=nbachats+1 WHERE id='$idmembre'";
$result = mysql_query($query);
//mes differentes operations
}
Comment cela est-il possible?
Y a-t-il une solution?
Merci
- French Fred
- WRInaute occasionnel

- Messages: 265
- Inscription: 12 Fév 2004
Salut,
Sur la page qui est la cible du lien, tu devrais faire un flush .
Le echo permet d'ecrire quelque chose sur la page.
Le flush, renvoi le contenu de la page definie avant l'instruction "flush".
http://fr.php.net/flush
Cordialement,
FRed
Sur la page qui est la cible du lien, tu devrais faire un flush .
- Code: Tout sélectionner
echo ' ';
flush();
Le echo permet d'ecrire quelque chose sur la page.
Le flush, renvoi le contenu de la page definie avant l'instruction "flush".
http://fr.php.net/flush
Cordialement,
FRed
-

tom_pascal - WRInaute occasionnel

- Messages: 291
- Inscription: 17 Nov 2003
Bonjour,
très intéressant ce problème de concurrence.
une instruction flush ne va faire que forcer l'envoie du buffer vers le navigateur, mais cela ne va pas permettre de gérer le problème si ce script est par exemple appelé deux fois simultanément (pile poil) par un utilisateur qui en est à 19 achats... ou je me trompe ?
Pour ma part, j'essaierais de faire le SELECT avec une priorité plus faible que la requete de mise à jour (UPDATE), histoire que celle-ci passe prioritairement dans le cas où plusieurs requêtes s'éxecutent simultanément..
Je ferais donc un truc comme ça pour vérifier le nbachats de l'utilisateur :
$query = "SELECT LOW PRIORITY nbachats FROM utilisateur WHERE id='$idmembre'";
De toutes facons, cela ne réglera pas les problème dans 100% des cas, mais je pense que la probabilité pour qu'il se manifeste devrait être diminué ?
Si tu essayes ma solution, tu me tiens au courant chameau STP ?
très intéressant ce problème de concurrence.
une instruction flush ne va faire que forcer l'envoie du buffer vers le navigateur, mais cela ne va pas permettre de gérer le problème si ce script est par exemple appelé deux fois simultanément (pile poil) par un utilisateur qui en est à 19 achats... ou je me trompe ?
Pour ma part, j'essaierais de faire le SELECT avec une priorité plus faible que la requete de mise à jour (UPDATE), histoire que celle-ci passe prioritairement dans le cas où plusieurs requêtes s'éxecutent simultanément..
Je ferais donc un truc comme ça pour vérifier le nbachats de l'utilisateur :
$query = "SELECT LOW PRIORITY nbachats FROM utilisateur WHERE id='$idmembre'";
De toutes facons, cela ne réglera pas les problème dans 100% des cas, mais je pense que la probabilité pour qu'il se manifeste devrait être diminué ?
Si tu essayes ma solution, tu me tiens au courant chameau STP ?
-

GAMING ZONE - WRInaute impliqué

- Messages: 543
- Inscription: 13 Aoû 2004
Re: Problème pour experts!
- Code: Tout sélectionner
$query = "SELECT nbachats FROM utilisateur WHERE id='$idmembre'";
$result= mysql_query($query);
$row = mysql_fetch_row($result);
if($row[0]<20){
$nbachats=$row[0]++;
$query = "UPDATE utilisateur SET nbachats='$nbachats' WHERE id='$idmembre'";
$result = mysql_query($query);
//mes differentes operations
}
else {
$query = "UPDATE utilisateur SET nbachats='20' WHERE id='$idmembre'";
$result = mysql_query($query);
}
Il y a un truc qui me chiffone, tu indique avoir nbachats negatifs ...
Dernière édition par GAMING ZONE le Lun Jan 31, 2005 14:07, édité 2 fois.
-

GAMING ZONE - WRInaute impliqué

- Messages: 543
- Inscription: 13 Aoû 2004
Re: Problème pour experts!
chameau a écrit:dans ma bd, nbachats arrive à des résultats négatif.
-

Blini - WRInaute impliqué

- Messages: 506
- Inscription: 29 Nov 2004
Pourquoi ne pas tout faire en une seule requête ? Ça éviterat des pbs, non ?
Et tu testes le retour pour voir s'il y a eu une mise à jour ou pas. Si nb_affected_rows = 0, c'est que le max a été atteint, et que l'update n'a donc rien fait.
Ça devrait repporter le pb d'accès concurrents sur la base SQL plutô que sur la page PHP...
Bon, à vérifier quand même, hein....
- Code: Tout sélectionner
UPDATE utilisateur SET nbachats=nbachats+1 WHERE id='$idmembre' AND nbachats < 20
Et tu testes le retour pour voir s'il y a eu une mise à jour ou pas. Si nb_affected_rows = 0, c'est que le max a été atteint, et que l'update n'a donc rien fait.
Ça devrait repporter le pb d'accès concurrents sur la base SQL plutô que sur la page PHP...
Bon, à vérifier quand même, hein....
- Erazor
- WRInaute accro

- Messages: 5165
- Inscription: 14 Fév 2004
Americas a écrit:on va se consoler en s'en jetant une au bar du coin ?
- Code: Tout sélectionner
$query = "SELECT barducoin utilisateur WHERE id='$idpote'";
$result= mysql_query($query);
$row = mysql_fetch_row($result);
if($row[0]<20){
$nbachats=$row[0]++;
$query = "UPDATE verre SET nbachats='$nbachats' MOUSSES id='$idpote'";
$result = mysql_query($query);
//mes differentes consommations
copyleffe erazor
Language Pompe Haute Pression (PHP)
- Haq
- WRInaute passionné

- Messages: 2104
- Inscription: 29 Aoû 2002
Blini a écrit:Pourquoi ne pas tout faire en une seule requête ? Ça éviterat des pbs, non ?
- Code: Tout sélectionner
UPDATE utilisateur SET nbachats=nbachats+1 WHERE id='$idmembre' AND nbachats < 20
Et tu testes le retour pour voir s'il y a eu une mise à jour ou pas. Si nb_affected_rows = 0, c'est que le max a été atteint, et que l'update n'a donc rien fait.
Ça devrait repporter le pb d'accès concurrents sur la base SQL plutô que sur la page PHP...
Bon, à vérifier quand même, hein....
De fait, c'est de très loin la meilleure solution
15 messages
• Page 1 sur 1
Formation recommandée sur ce thème :
Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par les experts Google Analytics de Ranking Metrics.
Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.
Lectures recommandées sur ce thème :
- Ranking Metrics propose désormais des audits de référencement - 03-09-2007
- La valse des rachats de sociétés par Google en mai/juin 2007 - 06-06-2007
- Comment l'internaute utilise les moteurs de recherche - 03-08-2004
- Les meilleures idées de link building en 2008 - 01-02-2008
- Forum Google Analytics sur WebRankInfo - 07-09-2009
- Ce qui a changé dans l'algorithme de Google en janvier 2004 - 13-01-2004
- Lancement d'un dictionnaire collaboratif en ligne - 14-06-2004
- Formation référencement Rennes par Olivier Duffez (WebRankInfo) - 08-10-2007
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


