JeuWeb - Crée ton jeu par navigateur
php5 et SQLite - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : php5 et SQLite (/showthread.php?tid=1614)

Pages : 1 2 3


RE: php5 et SQLite - Loetheri - 20-08-2007

Les index servent dans le cas où tu cherches souvent les mêmes données.

Quand tu fais tes requêtes, tu cherches tout le temps (ou presque) les données sur les champs x,z et y. Mais ta table contient les champs a,z,x,y, b et c. S'il contient un index, il ira nettement plus vite lors la sélection x,z et y.
Comme le dit Nesper, c'est comme un index d'un livre. Maintenant, que tu recherches le pseudo Blop ou Blip ou encore Blap, cela reste un pseudo du champs pseudo. Cela n'a donc aucune importance.

Tu peux utiliser la fonction EXPLAIN, si je me souviens bien, pour savoir quelles peuvent être les choses à faire sur tes tables. Bien entendu, cela ne suffit pas ;-)


RE: php5 et SQLite - oualala - 20-08-2007

Je ne fais que deux-troix requêtes pour chaques champs.Est-ce vraiment nécessaire?
Sinon je ne peux pas réduire...C'est le fichier d'attaque donc sa prend le défenseur on va chercher dans 4 tables(4 requêtes) et 6-7 pour l'attaquand(6-7 parce-que sa depant l'attaque que le joueur fait).
Aussi si les races des joueurs sont en guerre sa rajoute 2 requêtes(chercher et changer)
Ensuite 2 requêtes pour modifier les ressources des deux joueurs.
Et pour finir enregistrement dans la table suivis(il avait combien de machin trucs chose, etc...)
Donc en tout 13-16 requêtes.Je sais c'est beaucoup mais je ne sais pas trop comment faire autrement.(de plus nous sommes hébergés avec 30-40 sites, mais prochainement 3 sites, donc beaaucoup plus de rapidité et en plus le serveur est plus puissant^^)

PS: c'est le seul script qui utilise plus de 5 requêtes.


RE: php5 et SQLite - joshua - 21-08-2007

une petite idée comme ca, tu pourrais pas passer par "une table temporaire" durant les combats qui ne contiendrait que les donénes de ceux qui combattent? ca pourrait accelerer le truc, non? une table plus light avec juste les champs necessaires.


RE: php5 et SQLite - oualala - 21-08-2007

Hum...Tout les champs sont necessaires -_-".
Et on a déjàm 17 tables avec lequelles on a essaié de réduire au max en faisant le plus de tables sa ne donne rien...
Mais si jamais c'est pas le script d'attaque qui fait lagger, mais le script de tours...Sa faisait 10 minutes pour charger...Je vous le montre:

Code PHP :
<?php 
// Je vais chercher les infos sur les membres:
$reponse_membres = mysql_query("SELECT pseudo, gald, mana, tours, temps, nombre, protection FROM membres") or die (mysql_error());

// Vérification du timestamp
$time_stocke = mysql_query("SELECT timestamp FROM temps") or die( mysql_error() );
$time_stocke = current( mysql_fetch_array( $time_stocke ) );
$heures_ecoulees = floor( ( time() - $time_stocke )/3600 );

if(
$heures_ecoulees >= 1 )
{
// gestion de l'heure
$nouveau_time = $time_stocke + ( 3600 * $heures_ecoulees );
mysql_query( "UPDATE temps SET timestamp='".$nouveau_time."';" );

// gestion des ressources

$req = "UPDATE `membres`, `forge`, `troupes`, `troupes_attaque` SET " .
// suppression de la protection d'un membre si celle ci dépasse 4 jours
"`membres`.`protection` = ( CASE `membres`.`protection`+345600 < ".time()." WHEN 1 THEN 0 ELSE `membres`.`protection` END )," .
// rajout de 3 fleches par heure par paysan
"`forge`.`fleches` = `forge`.`fleches` + $heures_ecoulees * 3* `forge`.`paysans_fleches`," .
// rajout de 3 lances par heure par paysan
"`forge`.`lances` = `forge`.`lances` + $heures_ecoulees * 3 * `forge`.`paysans_lances`," .
// rajout de 50'000 galds par heure
"`membres`.`gald` = `membres`.`gald` + 50000 * $heures_ecoulees," .
// rajout de 150 mana par heure par mage
"`membres`.`mana` = `membres`.`mana` + $heures_ecoulees * 150 * ( `troupes`.`mages` + `troupes_attaque`.`mages` )," .
// rajout d'un tour par heure
"`membres`.`tours` = `membres`.`tours` + $heures_ecoulees " .
" WHERE `membres`.`pseudo`=`forge`.`pseudo` AND `membres`.`pseudo`=`troupes`.`pseudo` AND `membres`.`pseudo`=`troupes_attaque`.`pseudo`;";

mysql_query($req) or die( mysql_error() . '<hr/>' . $req );

Et ça c'est notre hebergeur qui l'a fait.Car je ne comprends...Rien ou presque au code.
Et notre hebergeur a fait pour que ça lagge moin.Mais on a perdu environ la moitié de temps de chargement(enfin sa dépandait le nombre de connectés).Notre ancien script faisait une while de tout les membres donc...Sa faisait longtemps pour 2500 joueurs(on en a supprimé 1000 pour que sa lagge moin, sa marche, mais on verra si c'est mieux avec le nouveau serveur)
Donc en même temps le script d'attaque modifie que quelques trucs(6-7) mais à deux joueurs et le script de tours modifie 4 trucs, mais pour tout les membres!


RE: php5 et SQLite - joshua - 21-08-2007

Moi je ne suis pas d'accord avec ce qu'a fait ton hebergeur.
En gros a chaque rechargement, il met tout a jour si j'ai bien compris....
Normalement tu mets dans des variables de sessions et tu fais une mise a jour en php, MAIS on ne fait la mise à jour en base que lorsque l'utilisateur utilise ces valeurs.
En gros, ca sert a rien de mettre a jour la valeur de fleches en base si le joueur ne l'utilise aps. un timestamp et l'ancienne valeur suffisent.

rondidju c'est du travail de sagouin!


RE: php5 et SQLite - uriak - 21-08-2007

certes, mais je vais être tôt ou tard confronté à un cas similaire et je me vois mal utiliser les timestamp...

Dans mon système de jeu, une fois par jour, il faut
->mettre à jour la production
->déplacer les stocks d'un lieu à un autre
->executer les actions "en attente" des joueurs dont le résultat dépendra notamment de la présence ou non de matériaux sur place. Matériaux qui peuvent provenir de n'importe qui !

Dans ce cas la mise à jour centralisée à du sens, et elle n'a lieu qu'une fois par jour

Pour ma part, je pense parcourir une liste d'actions en attente, et faire n requêtes, tout en bloquant l'accès au jeu des joueurs durant la tranche de "maintenance" et en prolongeant la durée max d'execution. Seules des actions très simples (redonner leurs PA aux joueurs) seront faites directement sur l'ensemble d'une table.

EDIT : ha oui je viens de voir le problème, effectivement c'est une solution de goret qu'à proposé l'hébergeur ^^ Si tu veux avoir des ressources qui se mettent à jour en permanence, la solution de joshua est la bonne.


RE: php5 et SQLite - joshua - 21-08-2007

oui je te comprends uriak et dans ton cas la solution est adaptée.
Mais quand il s'agit d'un joueur qui voit a chaque rechargement ses valeurs se mettre a jour, c'est un peu chaud...
J'ai meme vu pire: un gars qui faisait un refresh des ressources pour tous ses joueurs a toutes les heures. Alors que les ressources ne pouvaient meme pas etre volées.....
Du coup je vous parle pas des ralentissement de base. En plus, avec les comptes fantomes, c'était fun :p


RE: php5 et SQLite - oualala - 21-08-2007

Si jamais juste comme ça, sa actualise toutes les heures.De plus je ne vois pas pourquoi je ferais chaques fois que le joueur en a besoin vu que toutes les heures les comptes reçoivent 50000 de ressources.C'est le but du jeu...Chaques heures il y a des pillages, ensuite pendant 30 minutes il n'y a rien.Je ne vois pas pourquoi je ferai dans des sessions car si j'ai bien compris sa actualise seulement le membre qui se connecte or il n'y aurait plus trop de pillages...Soit j'ai mal compris soit j'ai mal expliqué, mais on est en quelque sorte oubligé de le faire.
On a vidé les comptes inactifs depuis 1 semaine donc sa fait quand même un peu nul de suprimé des mecs en vacances pour le bonheur des autres...(bon bien sûr on a suprimé les moin évolués, mais quand même...).


RE: php5 et SQLite - pascal - 21-08-2007

le champ pseudo est-il un champ texte ?

si oui, c'est pas terrible pour les jointures. il faut utiliser des id entier pour les jointures, c'est plus performant.

A+

Pascal


RE: php5 et SQLite - joshua - 21-08-2007

non oullaa: tu peux mettre a jour uniquement lors du pillage ou lors d'une action.
Ca t'evite des tas de mise a jours inutiles.
Si tu mets a jour un compte au moment du pillage, c'est bon pour ton jeu.
En fait c'est la tentative de pillage qui commence par declencher la mise à jour.