TourDeJeu, le portail des jeux en ligne alternatifs, les articles 
TourDeJeu, le réseau des jeux en ligne alternatifs : jeux web multijoueurs, jeux par forum. En savoir +
En ligne : 518 jeux, 7177 news, 26754 commentaires
 

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

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 : découverte du JpC
PHP : accès base de données
PHP : structure du site
Ludique : JpC et Temps réel
Jeux de rôles sans règles
Humour : astrologie du JpC
Tech. : Bases de données
MJ : les joueurs multiples
PHP : utilité pour un JpC
PHP : c'est quoi ?
Tech. : l'analyse des ordres
Ludique : débutants et vétérans
Tech. : archi Ultraball 2100
Ludique : les jeux de pronos
Tech. : le site Web d'un JpC
Humour : football et wargame
Présentation de TourDeJeu

Devenir un développeur écologiste

Ameliorez vos requêtes et votre code

Optimiser ses requêtes
MySQL propose un certain nombre de fonctions qui accélèrent grandement son usage : apprenez à les connaître en consultant la documentation ! Supposons par exemple que vous souhaitiez connaître 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 connaître le nombre d'enregistrements retournés. C'est malin, sauf que vous avez chargé l'intégralité de la table dans la mémoire, et qu'il existe une fonction spécialement optimisée de mySQL pour connaître le nombre d'enregistrements : "SELECT COUNT(*) FROM jeu_joueurs". Au lieu de charger 800 lignes de données, vous ne chargez qu'un simple chiffre (récupérable dans un tableau par un mysql_fetch_row(), mais ce n'est pas le sujet), d'où une économie monumentale. Je vous invite, dès qu'un problème se pose, à vérifier si la doc mySQL ne propose pas LA solution.

Dans le même ordre d'idées, évitez à tout prix les requêtes mySQL successives (par exemple dans une boucle for ou foreach portant sur chaque joueur). Chaque accès à une base demande quelques millisecondes précieuses, même si la requête est rapide. Il vaut mieux donc trouver la bonne clause WHERE qui englobe tous les joueurs concernés que de répéter la même action pour chacun, mais j'y reviendrai plus bas.

Recycler son code
Tout comme le tri des déchets ménagers, 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é, réutilisé, compacté. Quelques exemples :

Diviser pour mieux ranger
Les frames, c'est une chienlit. Pour la gestion des liens, pour la mémoire des sessions, c'est une torture. Pour répondre à ce problème, PHP permet de gérer l'affichage conditionnel des éléments d'une page. Par exemple, une structure IF ($inv== 1) print $inventaire autorise l'affichage des seuls éléments dont on a besoin dans la page. Il est commode de tout réunir dans une seule page, d'empiler les lignes de code dans un fichier bien dense où la logique apparaît nettement. Pourtant, dans bien des cas, cela entraîne des gâchis. La solution s'appelle include(). En subdivisant votre code en petites pages dédiées à un affichage spécifique, 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 nécessaire) tout en évitant leurs inconvénients.

Vive les fonctions !
La fonction, c'est le Graal du compactage. C'est vrai pour les fonctions spécifiques 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(), spécialement dédiée à cet effet. C'est vrai également des fonctions utilisateur, que vous créer pour automatiser une tâche répétitive.

Quand faut-il créer une fonction ? C'est simple, dès que vous utilisez une même action deux fois de suite, avec quelques paramètres qui changent. Il faut être attentif à tous les endroits où l'on peut réduire le nombre de variables différentes et créer une fonction. Il peut être très économique de créer des fonctions pour les requêtes SQL. Ainsi, la fonction message (de qui, à qui, texte) appellera la requête mySQL appropriée, en calculant la date et tout ce qu'il faut.

Au delà de l'économie, les fonctions assurent une cohérence au code (les messages seront toujours écrits de la même manière) et simplifient la mise à jour (si l'on ajoute une colonne à notre table de messages, il suffira de modifier la requête mySQL dans la fonction, et pas à chaque appel).

Vérifier 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 vérifier pour chacun des 500 joueurs s'il a joué depuis 24h et, le cas échéant, afficher son id. Il y a deux manières de procéder :

Le programmeur bête et obéissant réunit la liste des joueurs (il l'a déjà obtenue dans un tableau $joueur[$id]). Il lance donc un foreach() qui va vérifier pour chaque joueur la date entrée dans la base et la comparer à la date actuelle. LE SERVEUR MEURT.

Le programmeur écologiste, plus fûté, a compris comment rationaliser cette situation. Il calcule la date moins 24h ($hier), puis exécute une simple requête mysql_query ("SELECT id FROM jeu_persos WHERE date>$hier"). Il n'a plus qu'a lancer l'affichage pour chacun des résultats. LE SERVEUR RIT.

Dans le premier exemple, c'est la répétition de requêtes minimes qui a surchargé le serveur : cela s'explique par le fait que toute requête, même portant sur une seule entrée, suppose un balayage d'une bonne partie de la table pour rapporter une seule info. Il vaut mieux récupérer beaucoup d'infos une seule fois qu'une seule info 500 fois. Cette logique s'applique dès qu'une opération répétitive apparaît dans le code. Tous les while, for, foreach doivent faire l'objet d'une enquête 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 utilisées dans le code peut augmenter l'occupation de mémoire et ralentir d'autant le serveur. Ce nombre devrait être réduit en réutilisant les "déchets". 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 passée dans un mysql_fetch_array() ou mysql_fetch_row() pour être utilisable, elle devient inutile et encombre donc la mémoire pour rien. Il y a deux solutions : si le résultat de la requête ne fait qu'une ligne (par exemple le chargement des valeurs du joueur principal), vous pouvez réutiliser la même variable pour en faire un tableau * : $sql = mysql_fetch_array($sql). Si le résultat de la requête comporte plusieurs lignes, il ne peut pas être réutilisé directement puisqu'il faut créer un tableau et repasser la valeur pour chaque ligne. La solution : réutiliser la variable $sql dans les prochaines requêtes SQL. Cette variable est donc à usage multiple ; on garde son nom mais on efface son contenu pour le remplacer par un nouveau. * Ça peut paraître illogique que a=truc(a) mais rappelez vous que le signe "=" ne représente pas une égalité mais une affectation : dès que la partie droite est calculée, la variable est créée avec la valeur calculée.

Retour au sommaire de l'article 

(c) TourDeJeu 2000-2024