JeuWeb - Crée ton jeu par navigateur
Map : trop de requetes - 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 : Map : trop de requetes (/showthread.php?tid=3427)

Pages : 1 2 3


Map : trop de requetes - sagaff - 13-12-2008

Bonjour,

J'ai un gros problème, ma map possède beaucoup trop de requêtes sql, ce qui cause des problèmes, car je dépasse la limite de connexion autorisé sur l'hébergeur quand il y a plus de 15 connectés simultané.

Voila les requetes problématique :

Code PHP :
<?php 
//Récupération élément décors.
$mapquery = doquery("SELECT longitude, latitude, pic, land FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "map");

while (
$maprow = mysql_fetch_assoc($mapquery)) {

if (empty(
$TabMAP1[$maprow['longitude']][$maprow['latitude']]))
$TabMAP1[$maprow['longitude']][$maprow['latitude']] = $maprow['pic'];

}
mysql_free_result($mapquery);


//Récupération élément clans.
$clanquery = doquery("SELECT pic, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "clans_elements");

while (
$clanrow = mysql_fetch_assoc($clanquery)) {

if (empty(
$TabMAP7[$clanrow['longitude']][$clanrow['latitude']]))
$TabMAP7[$clanrow['longitude']][$clanrow['latitude']] = $clanrow['pic'];
}
mysql_free_result($clanquery);


//Récupération élément villes.
$townquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "towns");

while (
$townrow = mysql_fetch_assoc($townquery)) {

if (empty(
$TabMAP2[$townrow['longitude']][$townrow['latitude']]))
$TabMAP2[$townrow['longitude']][$townrow['latitude']] = $townrow['name'];
}
mysql_free_result($townquery);


//Récupération élément points de téléportations.
$teleportationquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "teleportations");

while (
$teleportationrow = mysql_fetch_assoc($teleportationquery)) {

if (empty(
$TabMAP9[$teleportationrow['longitude']][$teleportationrow['latitude']]))
$TabMAP9[$teleportationrow['longitude']][$teleportationrow['latitude']] = $teleportationrow['name'];
}
mysql_free_result($teleportationquery);


//Récupération élément bureaux des colis.
$officequery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "packages_offices");

while (
$officerow = mysql_fetch_assoc($officequery)) {

if (empty(
$TabMAP8[$officerow['longitude']][$officerow['latitude']]))
$TabMAP8[$officerow['longitude']][$officerow['latitude']] = $officerow['name'];
}
mysql_free_result($officequery);


//Récupération élément coffres.
$cofferquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "coffers");

while (
$cofferrow = mysql_fetch_assoc($cofferquery)) {

if (empty(
$TabMAP5[$cofferrow['longitude']][$cofferrow['latitude']]))
$TabMAP5[$cofferrow['longitude']][$cofferrow['latitude']] = $cofferrow['name'];
}
mysql_free_result($cofferquery);


//Recupération des autres joueurs
$playersquery = doquery("SELECT id, charname, avatar, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end AND id!='$userrow[id]' AND UNIX_TIMESTAMP(onlinetime) >= '".(time()-120)."' AND (currentaction='En exploration' OR currentaction='En combat') ORDER BY longitude DESC,latitude DESC LIMIT 48", "users");

while (
$playersrow = mysql_fetch_assoc($playersquery)) {
if (empty(
$TabMAP3[$playersrow['longitude']][$playersrow['latitude']]))
$TabMAP3[$playersrow['longitude']][$playersrow['latitude']] = $playersrow['avatar'];
$TabMAP4[$playersrow['longitude']][$playersrow['latitude']] = $playersrow['charname'];

}
mysql_free_result($playersquery);

Pour ceux qui comprennent pas doquery()
Code PHP :
<?php 
function doquery($query, $table) {

include(
'config.php');
$sqlquery = mysql_query(str_replace("{{table}}", $dbsettings["prefix"] . "_" . $table, $query)) or die(mysql_error());
return
$sqlquery;
}

Est ce que quelqu'un pourrait m'aider à optimiser ces requetes ?

Merci


RE: Map : trop de requetes - Sephi-Chan - 13-12-2008

Bonsoir,

Peut-être pourrais-tu nous expliquer comment sont disposés les clans, villes, coffres, etc. sur ta carte (et/ou faire une capture d'écran).

À priori, je pense que des jointures te permettraient de faire tout en une seule requête. Mais je ne me prononcerai que quand j'en saurais plus. Smile


Sephi-Chan


RE: Map : trop de requetes - Holy - 13-12-2008

Bête idée, mais ça serait pas mieux pour des éléments qui ne bougent pas trop, comme le décor par exemple, de créer un "cache".

Le principe est simple, tu récupères ta map avec les variables de décor, tu les balances dans un fichier en les formatant (serialize()), ensuite quand tu dois récupérer le décor de ta map, plutôt que de balancer une requête, tu ouvres le fichier, tu le reformates en array, et c'est bingo.

Et il y a moyen de foutre dans ça dans une seule requête avec une bonne grosse jointure, mais ça ne résoudrait que partiellement le problème. Faut amincir tout ça ^^


RE: Map : trop de requetes - Melimelo - 13-12-2008

Un peu hs mais quand même avec ton doquery tu inclu 50 fois le même fichier config.php là ...


RE: Map : trop de requetes - bigcrunch - 14-12-2008

Et il faut espérer que dans ce fichier config.php, tu n'as pas la fonction mysql_connect. Sinon c'est pas la peine de chercher plus loin ton souci.


RE: Map : trop de requetes - SeigneurMartin - 14-12-2008

Hum... ce sont tous des éléments du décors ?
Déjà, pour tes tables "ville" et "téléportation", peut-être que les regrouper en un seule te permettrait de limiter un peu le nombre de requêtes, sachant qu'apparemment elles ont les mêmes champ (name, longitude et latitude)...


RE: Map : trop de requetes - sagaff - 14-12-2008

SeigneurMartin j'ai déjà eu la même réflexion. J'aurais bien pu oui rassembler quasiment toute les requêtes en une seule. Mais voila chaque table possède entre 10 et 20 champs environ chacune, donc c'est pas la peine d'envisager cette solution.

Concernant la capture la voici :

[Image: maplk0.png]

Sinon mon fichier config de contient pas de mysql_connect, seulement un array :

Code PHP :
<?php 
$dbsettings
= Array(
"server" => "...",
"user" => "...",
"pass" => "...",
"name" => "...",
"prefix" => "...",
"prefix_forum" => "...");



RE: Map : trop de requetes - Sephi-Chan - 14-12-2008

Tu sais, faire une grosse jointure, ce n'est pas grave. Tu n'es pas non plus obligé de prendre tous les champs de chaque table où tu tapes.
Toujours est-il que c'est une bonne alternative, contrairement à ce que tu peux penser.


Sephi-Chan


RE: Map : trop de requetes - sagaff - 14-12-2008

Sephi-Chan, tu pourrais m'aider pour ce genre de jointure ?


RE: Map : trop de requetes - sagaff - 14-12-2008

Le site ne tourne pas uniquement avec 7 requetes. Pour la map, il y a plus de 7 requetes, il y en a 10 en tout, sans compter la récupération des infos des joueurs, et infos du jeu.

Donc pour chaque déplacement sur la map, on peut globalement dire qu'il y a 12 requetes d'éxécuter, contrairement aux autres page du site, ou j'en ai entre 2 et 4 maxi.

C'est vraiment la map qui me "bouffe" tout.