Problème pour experts!
15 messages • Page 1 sur 1
Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics
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 impliqué

- Messages: 265
- Inscription: Jeu Fév 12, 2004 18:19
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 impliqué

- Messages: 278
- Inscription: Lun Nov 17, 2003 13:58
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 passionné

- Messages: 533
- Inscription: Ven Aoû 13, 2004 20:06
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 passionné

- Messages: 533
- Inscription: Ven Aoû 13, 2004 20:06
Re: Problème pour experts!
chameau a écrit:dans ma bd, nbachats arrive à des résultats négatif.
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....
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)
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 Julien Coquet, expert certifié officiellement par Google Analytics.
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
- Formation référencement Rennes par Olivier Duffez (WebRankInfo)
- Google Code Jam 2003
- La valse des rachats de sociétés par Google en mai/juin 2007
- Comment l'internaute utilise les moteurs de recherche
- La stratégie de Google 2006/2007 et au-delà
- Les meilleures idées de link building en 2008
- Forum Google Analytics sur WebRankInfo
- Référencement d'un forum phpBB
- Formation au référencement naturel à Paris par Olivier Duffez et Fabien Facéries
- L'avis des experts !
- l'avis des experts :)
- Demande l'opinion des experts
- QUESTION POUR LES EXPERTS
- Besoin de l'opinion des experts
- Question aux experts URL-RW
- Avis aux experts de PhpBB
- Demande d'avis des experts
- Site accepté... place aux experts!
- Une question pour les experts
- Experts, www.cameroun-online.com et google
- 250 experts en Référencement partagent leurs conseils
- Besoin d'avoir l'avis des EXPERTS de WRI ;)
- Google achète PeakStream : Experts programmation multicoeur
- Les experts de htaccess, SOS, rewriting classique
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités






le forum