TourDeJeu, le réseau des jeux en ligne alternatifs : jeux web, casual MMOs, jeux par forum ou par e-mail. En savoir +
En ligne : 751 jeux, 7126 news, 26537 commentaires
 

Recherche de jeu par critères - Un jeu au hasard !

Le guide des jeux en ligne alternatifs

Comment crer son jeu et le grer ?

Les Focus

Tech. : Le programmeur cologique
Tech. : automatisation et mails
Salon MondeDuJeu 2002
Revue de presse des JpC
Humour : 1001 raisons pour jouer
Ludique : le joueur parfait
Ludique : dcouverte du JpC
PHP : accs base de donnes
PHP : structure du site
Ludique : JpC et Temps rel
Jeux de rles sans rgles
Humour : astrologie du JpC
Tech. : Bases de donnes
MJ : les joueurs multiples
PHP : utilit pour un JpC
PHP : c'est quoi ?
Tech. : l'analyse des ordres
Ludique : dbutants et vtrans
Tech. : archi Ultraball 2100
Ludique : les jeux de pronos
Tech. : le site Web d'un JpC
Humour : football et wargame
Prsentation de TourDeJeu

Devenir un dveloppeur cologiste

Ameliorez vos requtes et votre code

Optimiser ses requtes
MySQL propose un certain nombre de fonctions qui acclrent grandement son usage : apprenez les connatre en consultant la documentation ! Supposons par exemple que vous souhaitiez connatre le nombre de joueurs dans votre table. Si vous ne connaissez que la syntaxe SELECT de base, vous pourriez arriver mysql_query("SELECT * FROM jeu_joueurs") puis utiliser mysql_affected_rows() pour connatre le nombre d'enregistrements retourns. C'est malin, sauf que vous avez charg l'intgralit de la table dans la mmoire, et qu'il existe une fonction spcialement optimise de mySQL pour connatre le nombre d'enregistrements : "SELECT COUNT(*) FROM jeu_joueurs". Au lieu de charger 800 lignes de donnes, vous ne chargez qu'un simple chiffre (rcuprable dans un tableau par un mysql_fetch_row(), mais ce n'est pas le sujet), d'o une conomie monumentale. Je vous invite, ds qu'un problme se pose, vrifier si la doc mySQL ne propose pas LA solution.

Dans le mme ordre d'ides, vitez tout prix les requtes mySQL successives (par exemple dans une boucle for ou foreach portant sur chaque joueur). Chaque accs une base demande quelques millisecondes prcieuses, mme si la requte est rapide. Il vaut mieux donc trouver la bonne clause WHERE qui englobe tous les joueurs concerns que de rpter la mme action pour chacun, mais j'y reviendrai plus bas.

Recycler son code
Tout comme le tri des dchets mnagers, l'cologie du code est une astreinte pour le concepteur, mais un soulagement pour l'environnement (des joueurs). Il faut donc s'organiser et avoir une vision assez claire du "strict minimum" et du superflu. Et il y a plein d'endroits o le code, mine de rien, pourrait tre recycl, rutilis, compact. Quelques exemples :

Diviser pour mieux ranger
Les frames, c'est une chienlit. Pour la gestion des liens, pour la mmoire des sessions, c'est une torture. Pour rpondre ce problme, PHP permet de grer l'affichage conditionnel des lments d'une page. Par exemple, une structure IF ($inv== 1) print $inventaire autorise l'affichage des seuls lments dont on a besoin dans la page. Il est commode de tout runir dans une seule page, d'empiler les lignes de code dans un fichier bien dense o la logique apparat nettement. Pourtant, dans bien des cas, cela entrane des gchis. La solution s'appelle include(). En subdivisant votre code en petites pages ddies un affichage spcifique, le code ne sera charg par le serveur que si la condition du IF est remplie. Vous conservez la flexibilit des frames (on n'affiche que le ncessaire) tout en vitant leurs inconvnients.

Vive les fonctions !
La fonction, c'est le Graal du compactage. C'est vrai pour les fonctions spcifiques du code PHP : avant de taper dix lignes de code pour chercher les valeurs uniques dans un tableau, mieux vaut consulter la doc et constater qu'il existe array_unique(), spcialement ddie cet effet. C'est vrai galement des fonctions utilisateur, que vous crer pour automatiser une tche rptitive.

Quand faut-il crer une fonction ? C'est simple, ds que vous utilisez une mme action deux fois de suite, avec quelques paramtres qui changent. Il faut tre attentif tous les endroits o l'on peut rduire le nombre de variables diffrentes et crer une fonction. Il peut tre trs conomique de crer des fonctions pour les requtes SQL. Ainsi, la fonction message (de qui, qui, texte) appellera la requte mySQL approprie, en calculant la date et tout ce qu'il faut.

Au del de l'conomie, les fonctions assurent une cohrence au code (les messages seront toujours crits de la mme manire) et simplifient la mise jour (si l'on ajoute une colonne notre table de messages, il suffira de modifier la requte mySQL dans la fonction, et pas chaque appel).

Vrifier AVANT de calculer
Il y a des structures a priori innocentes, qui, prises dans le mauvais sens, peuvent mettre genoux un serveur. Supposons que vous vouliez vrifier pour chacun des 500 joueurs s'il a jou depuis 24h et, le cas chant, afficher son id. Il y a deux manires de procder :

Le programmeur bte et obissant runit la liste des joueurs (il l'a dj obtenue dans un tableau $joueur[$id]). Il lance donc un foreach() qui va vrifier pour chaque joueur la date entre dans la base et la comparer la date actuelle. LE SERVEUR MEURT.

Le programmeur cologiste, plus ft, a compris comment rationaliser cette situation. Il calcule la date moins 24h ($hier), puis excute une simple requte mysql_query ("SELECT id FROM jeu_persos WHERE date>$hier"). Il n'a plus qu'a lancer l'affichage pour chacun des rsultats. LE SERVEUR RIT.

Dans le premier exemple, c'est la rptition de requtes minimes qui a surcharg le serveur : cela s'explique par le fait que toute requte, mme portant sur une seule entre, suppose un balayage d'une bonne partie de la table pour rapporter une seule info. Il vaut mieux rcuprer beaucoup d'infos une seule fois qu'une seule info 500 fois. Cette logique s'applique ds qu'une opration rptitive apparat dans le code. Tous les while, for, foreach doivent faire l'objet d'une enqute attentive : qu'est-ce qu'on peut sortir de la boucle ? Qu'est-ce qui peut tre calcul UNE SEULE FOIS au lieu de 500 fois ?

Recycler ses emballages de variables
A priori anecdotique, le nombre de variables utilises dans le code peut augmenter l'occupation de mmoire et ralentir d'autant le serveur. Ce nombre devrait tre rduit en rutilisant les "dchets". C'est surtout valable avec les appels $sql = mysql_query(), qui renvoient dans la variable $sql une ressource de taille souvent importante. Comme cette ressource est passe dans un mysql_fetch_array() ou mysql_fetch_row() pour tre utilisable, elle devient inutile et encombre donc la mmoire pour rien. Il y a deux solutions : si le rsultat de la requte ne fait qu'une ligne (par exemple le chargement des valeurs du joueur principal), vous pouvez rutiliser la mme variable pour en faire un tableau * : $sql = mysql_fetch_array($sql). Si le rsultat de la requte comporte plusieurs lignes, il ne peut pas tre rutilis directement puisqu'il faut crer un tableau et repasser la valeur pour chaque ligne. La solution : rutiliser la variable $sql dans les prochaines requtes SQL. Cette variable est donc usage multiple ; on garde son nom mais on efface son contenu pour le remplacer par un nouveau. * a peut paratre illogique que a=truc(a) mais rappelez vous que le signe "=" ne reprsente pas une galit mais une affectation : ds que la partie droite est calcule, la variable est cre avec la valeur calcule.

Retour au sommaire de l'article