Page 1 sur 1

Optimisation de script

Posté : 20 oct. 2019, 20:53
par Vincent GLUTEN
Bonjour ! :)
Je passe par ici car j'aurai besoin de conseils pour optimiser mes scripts. D'habitude je poste sur un autre forum mais là ça ne veut pas poster mon sujet (ils me sortent un truc du genre "vous avez été bloqué car sinon vous allez détruire le forum", du coup je viens annihiler ce forum-là car les gens savent pas encore à quel point je suis dangereux :twisted: )
Heureusement que j'ai pris l'habitude d'enregistrer les messages juste avant de les poster quand j'ai mis genre une demie-heure à les taper. Donc je vous copie colle tout ci-dessous.
Et sinon petite présentation rapide : je suis débutant en php, je code juste pour le fun et j'ai fait un site web mais très moche et pas vraiment fonctionnel ^^
Bonjour ! :)
Ce coup-ci je poste pas parce-que je suis devant un problème qui me tourmente depuis des heures mais plutôt parce-que je suis en manque de problèmes on va dire ^^ Je suis encore débutant en php mais j'ai fini par réussir à taper tout le code que je voulais faire jusqu'à présent pour mon site. Je pense maintenant à optimiser le tout car je me retrouve avec de belles tartines de code et n'ayant pas encore connaissance de toutes les bonnes pratiques, je dois sûrement pouvoir optimiser tout ça.

J'aimerai donc pouvoir supprimer un maximum de lignes de mon code histoire de m'y retrouver un peu, et aussi augmenter la rapidité d'exécution de mes scripts (pour l'instant ça ne pose pas problème, mais autant s'y intéresser maintenant afin de prendre de bonnes habitudes ^^).
Je suis preneur de toutes les bonnes astuces. En fouillant mon code j'ai trouvé quelques pistes d'amélioration mais je ne suis pas certain d'y gagner en rapidité, je ne m'y connais pas assez pouvoir savoir quelle méthode s'exécute plus rapidement que l'autre, d'où ce sujet ^^

Idée 1 :
Pour m'y retrouver dans mes calculs php, j'ai pris pour habitude de stocker dans des variables ce que je vais chercher dans la base de données.

Code : Tout sélectionner

$reqnb2 = mysqli_query($base, 'SELECT * FROM defense WHERE login="'.$_SESSION['login'].'"') or die('Erreur Nb2D : '.mysqli_error($base)); $DEF = mysqli_fetch_array($reqnb2); $DEFRO = $DEF['Robot']; $DEFAW = $DEF['AWINT']; $DEFBW = $DEF['BWINT']; $DEFXW = $DEF['XWINT']; $DEFVO = $DEF['VORTEX'];

Est-ce-que le script gagnerait en rapidité si je réutilisais directement $DEF['Robot'] dans tous mes calculs au lieu de créer $DEFRO ?


Idée 2 :
Histoire de gagner du temps quand je tape mon code, j'utilise parfois la notation abrégée quand je veux utiliser echo dans du html.

Code : Tout sélectionner

<td> <input type="text" name="DefRobot" value="<?=$DEFRO;?>" class="placement" size="4" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = '';" onblur="if(this.value == '') this.value = this.defaultValue;" /> </td>

Au niveau rapidité d'exécution, c'est plus rapide ou plus lent qu'écrire :

Code : Tout sélectionner

<td> <input type="text" name="DefRobot" value="<?php echo $DEFRO; ?>" class="placement" size="4" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = '';" onblur="if(this.value == '') this.value = this.defaultValue;" /> </td>

Idée 3 :
Il est conseillé de séparer le CSS du fichier html et de l'appeler à l'aide de la balise link. C'est ce que je fais. De même j'utilise require et include pour appeler des fichiers php. Cependant, on peut très bien dans les 2 cas taper tous ces fichiers directement dans le fichier html. Certes ça sera un peu fouillis, mais dans le cas des "petits" include, le code ne sera pas rallongé de beaucoup. Est-ce-que dans ce cas là le script gagnera en rapidité ou j'y perdrai sur les deux tableaux ?


Voici le code de la page d'où j'ai extrait tout ça, si jamais vous voyez d'autres améliorations n'hésitez pas ^^

Code : Tout sélectionner

<?php // Toujours un max de php au début avec session_start obligé session_start(); $base = mysqli_connect('localhost', 'id1904253_cyril', 'cyril', 'id1904253_base') or die (mysqli_error ($base)); require_once 'Fonctions.php'; require_once 'ActuRessou.php'; // Récupération du nombre de robots et vaisseaux. Nouvelles variables pour le traitement de la disposition. $REQTOTNPRO = mysqli_query($base, 'SELECT * FROM protection WHERE login="'.$_SESSION['login'].'"') or die('erreur Nb1D : '.mysqli_error($base)); $TOTNPRO = mysqli_fetch_array($REQTOTNPRO); $PRORO = $TOTNPRO['Robot']; $PROAW = $TOTNPRO['AWINT']; $PROBW = $TOTNPRO['BWINT']; $PROXW = $TOTNPRO['XWINT']; $PROVO = $TOTNPRO['VORTEX']; $reqnb2 = mysqli_query($base, 'SELECT * FROM defense WHERE login="'.$_SESSION['login'].'"') or die('Erreur Nb2D : '.mysqli_error($base)); $DEF = mysqli_fetch_array($reqnb2); $DEFRO = $DEF['Robot']; $DEFAW = $DEF['AWINT']; $DEFBW = $DEF['BWINT']; $DEFXW = $DEF['XWINT']; $DEFVO = $DEF['VORTEX']; $reqnb3 = mysqli_query($base, 'SELECT * FROM attaque WHERE login="'.$_SESSION['login'].'"') or die('Erreur Nb3D : '.mysqli_error($base)); $ATT = mysqli_fetch_array($reqnb3); $ATTRO = $ATT['Robot']; $ATTAW = $ATT['AWINT']; $ATTBW = $ATT['BWINT']; $ATTXW = $ATT['XWINT']; $ATTVO = $ATT['VORTEX']; // Récupération du nombre de batiments $reqg1 = mysqli_query($base, 'SELECT * FROM batiments WHERE login="'.$_SESSION['login'].'"') or die('Erreur Nb1R : '.mysqli_error($base)); $NBBAT = mysqli_fetch_array($reqg1); // Définition de variables pour l'affichage des capacités obligatoire car on ne peut pas faire de calculs dans le tableau :( $CapaCentre = $NBBAT['Centre']*20; $CapaAWint = $NBBAT['BAWINT']*30; $CapaBWint = $NBBAT['BBWINT']*30; $CapaXWint = $NBBAT['BXWINT']*25; $CapaVortex = $NBBAT['BVORTEX']*20; // Traitement de la disposition. // On teste l'existence de nos variables. NbCollect récupéré à partir de l'include fonctions. if ( isset($_POST["ProRobot"]) && isset($_POST["DefRobot"]) && isset($_POST["AttRobot"]) ) { if ( ($_POST["ProRobot"]) == 0 ) { $msgro = '<h2>Vous devez laisser au moins 1 robot en protection.</h2>'; } elseif ( ($_POST["ProRobot"])+($_POST["DefRobot"])+($_POST["AttRobot"]) == $NbCollect ) { mysqli_query($base,"UPDATE protection SET Robot='".$_POST["ProRobot"]."' WHERE login='".$_SESSION["login"]."'"); mysqli_query($base,"UPDATE defense SET Robot='".$_POST["DefRobot"]."' WHERE login='".$_SESSION["login"]."'"); mysqli_query($base,"UPDATE attaque SET Robot='".$_POST["AttRobot"]."' WHERE login='".$_SESSION["login"]."'"); $PRORO = $_POST["ProRobot"]; $DEFRO = $_POST["DefRobot"]; $ATTRO = $_POST["AttRobot"]; $msgro = '<h1>Disposition enregistrée</h1>'; } else { $msgro = '<h2>Nombre de robots non égal à celui existant.</h2>'; } } // On teste l'existence de nos variables. if ( isset($_POST['ProAWINT']) && isset($_POST['DefAWINT']) && isset($_POST['AttAWINT']) ) { if ( ($_POST["ProAWINT"])+($_POST["DefAWINT"])+($_POST["AttAWINT"]) == $TOTNPRO['TotAWINT'] ) { mysqli_query($base,"UPDATE protection SET AWINT='".$_POST["ProAWINT"]."' WHERE login='".$_SESSION["login"]."'"); mysqli_query($base,"UPDATE defense SET AWINT='".$_POST["DefAWINT"]."' WHERE login='".$_SESSION["login"]."'"); mysqli_query($base,"UPDATE attaque SET AWINT='".$_POST["AttAWINT"]."' WHERE login='".$_SESSION["login"]."'"); $PROAW = $_POST["ProAWINT"]; $DEFAW = $_POST["DefAWINT"]; $ATTAW = $_POST["AttAWINT"]; $msgaw = '<h1>Disposition enregistrée</h1>'; } else { $msgaw = '<h2>Nombre de A-Wint non égal à celui existant.</h2>'; } } // On teste l'existence de nos variables. if ( isset($_POST['ProBWINT']) && isset($_POST['DefBWINT']) && isset($_POST['AttBWINT']) ) { if ( ($_POST["ProBWINT"])+($_POST["DefBWINT"])+($_POST["AttBWINT"]) == $TOTNPRO['TotBWINT'] ) { mysqli_query($base,"UPDATE protection SET BWINT='".$_POST["ProBWINT"]."' WHERE login='".$_SESSION["login"]."'"); mysqli_query($base,"UPDATE defense SET BWINT='".$_POST["DefBWINT"]."' WHERE login='".$_SESSION["login"]."'"); mysqli_query($base,"UPDATE attaque SET BWINT='".$_POST["AttBWINT"]."' WHERE login='".$_SESSION["login"]."'"); $PROBW = $_POST["ProBWINT"]; $DEFBW = $_POST["DefBWINT"]; $ATTBW = $_POST["AttBWINT"]; $msgbw = '<h1>Disposition enregistrée</h1>'; } else { $msgbw = '<h2>Nombre de B-Wint non égal à celui existant.</h2>'; } } // On teste l'existence de nos variables. if ( isset($_POST['ProXWINT']) && isset($_POST['DefXWINT']) && isset($_POST['AttXWINT']) ) { if ( ($_POST["ProXWINT"])+($_POST["DefXWINT"])+($_POST["AttXWINT"]) == $TOTNPRO['TotXWINT'] ) { mysqli_query($base,"UPDATE protection SET XWINT='".$_POST["ProXWINT"]."' WHERE login='".$_SESSION["login"]."'"); mysqli_query($base,"UPDATE defense SET XWINT='".$_POST["DefXWINT"]."' WHERE login='".$_SESSION["login"]."'"); mysqli_query($base,"UPDATE attaque SET XWINT='".$_POST["AttXWINT"]."' WHERE login='".$_SESSION["login"]."'"); $PROXW = $_POST["ProXWINT"]; $DEFXW = $_POST["DefXWINT"]; $ATTXW = $_POST["AttXWINT"]; $msgxw = '<h1>Disposition enregistrée</h1>'; } else { $msgxw = '<h2>Nombre de X-Wint non égal à celui existant.</h2>'; } } // On teste l'existence de nos variables. if ( isset($_POST['ProVORTEX']) && isset($_POST['DefVORTEX']) && isset($_POST['AttVORTEX']) ) { if ( ($_POST["ProVORTEX"])+($_POST["DefVORTEX"])+($_POST["AttVORTEX"]) == $TOTNPRO['TotVORTEX'] ) { mysqli_query($base,"UPDATE protection SET VORTEX='".$_POST["ProVORTEX"]."' WHERE login='".$_SESSION["login"]."'"); mysqli_query($base,"UPDATE defense SET VORTEX='".$_POST["DefVORTEX"]."' WHERE login='".$_SESSION["login"]."'"); mysqli_query($base,"UPDATE attaque SET VORTEX='".$_POST["AttVORTEX"]."' WHERE login='".$_SESSION["login"]."'"); $PROVO = $_POST["ProVORTEX"]; $DEFVO = $_POST["DefVORTEX"]; $ATTVO = $_POST["AttVORTEX"]; $msgvo = '<h1>Disposition enregistrée</h1>'; } else { $msgvo = '<h2>Nombre de Frégate Vortex non égal à celui existant.</h2>'; } } // Affichage stylé des ressources $SuperNRCar = floor($NRCar*100)/100; $SuperNRFer = floor($NRFer*100)/100; $SuperNRAci = floor($NRAci*100)/100; $SuperNRGold = floor($NRGold*100)/100; $SuperNREsp = floor($NREsp*100)/100; $SuperNREst = floor($NREst*100)/100; ?> <!DOCTYPE html> <html lang="fr"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Espace membre</title> <link rel="stylesheet" type="text/css" href="INDISPENSABLE.css"> <link rel="stylesheet" type="text/css" href="CSS/CSSGESTION.css"> </head> <body> <?php require_once 'Accès.php'; ?> <div id="contenu"> <table id="stock"><thead> <tr><th> Carbone </th> <th> Fer </th> <th> Acier </th> <th> Or </th> <th> Espace </th> <th> Espace total</th> <th> Collecteurs </th> </tr> </thead><tbody> <tr><td> <?=$SuperNRCar?> </td> <td> <?=$SuperNRFer?> </td> <td> <?=$SuperNRAci?> </td> <td> <?=$SuperNRGold?> </td> <td> <?=$SuperNREsp?> </td> <td> <?=$SuperNREst?> </td> <td> <?=$NbCollect?> </td> </tr> </tbody></table> <h1>Gestion</h1> <?php if ( isset($msgro) ) { echo $msgro; } if ( isset($msgaw) ) { echo $msgaw; } if ( isset($msgbw) ) { echo $msgbw; } if ( isset($msgxw) ) { echo $msgxw; } if ( isset($msgvo) ) { echo $msgvo; } ?> <h2>Entrez les taux de production</h2> <form method="post" action="Ressources4.php"> <table id="taux"> <tr> <td><label for="carbone">Carbone</label></td> <td><label for="fer">Fer</label></td> <td><label for="acier">Acier</label></td> <td><label for="gold">Or</label></td> <td></td> </tr> <tr> <td> <input type="text" pattern="([1][0][0]|[0-9]{1,2})" size="1" name="Carbone" class="cadence" value= "<?=$APCarbone?>" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" maxlength="3" style="border:solid 1px red; box-shadow:0 0 12px red inset;" /> <b> %</b> </td> <td> <input type="text" pattern="([1][0][0]|[0-9]{1,2})" size ="1" name="Fer" class="cadence" value="<?=$APFer?>" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" maxlength="3" style="border:solid 1px black; box-shadow:0 0 12px black inset;" /> <b> %</b> </td> <td> <input type="text" pattern="([1][0][0]|[0-9]{1,2})" size="1" name="Acier" class="cadence" value="<?=$APAcier?>" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" maxlength="3" style="border:solid 1px blue; box-shadow:0 0 12px blue inset;" /> <b> %</b> </td> <td> <input type="text" pattern="([1][0][0]|[0-9]{1,2})" size="1" name="Gold" class="cadence" value="<?=$APGold?>" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" maxlength="3" style="border:solid 1px gold; box-shadow:0 0 12px gold inset;" /> <b> %</b> </td> <td> <input type="submit" value="Ok !" style="padding:5px 20px; background-color:lightsteelblue; border:dotted 2px grey; border-radius:5px;" /> </td> </tr> </table> </form> <br> <form method="post" action="Gestion4.php"> <table id="position"> <thead> <tr> <th>Hangars</th> <th>Protection</th> <th>Défense</th> <th>Attaque</th> <th></th> </tr> </thead> <tbody> <tr> <td><b><?=$NBBAT['Centre']?> Centre de collecte</b> <?php echo"$NbCollect / $CapaCentre"; ?></td> <td> <input type="text" name ="ProRobot" class="placement" size="4" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = '';" onblur="if(this.value == '') this.value = this.defaultValue;" value="<?=$PRORO;?>" /> </td> <td> <input type="text" name="DefRobot" value="<?=$DEFRO;?>" class="placement" size="4" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = '';" onblur="if(this.value == '') this.value = this.defaultValue;" /> </td> <td> <input value="<?=$ATTRO;?>" type="text" name="AttRobot" class="placement" size="4" pattern="\d+" onFocus="javascript:this.value=''" onBlur="javascript:if(this.value == '')this.value=this.defaultValue;" /> </td> <td></td> </tr> <?php if ($NBBAT['BAWINT'] > 0) { echo'<tr> <td> <b>'.$NBBAT['BAWINT'].' Hangar(s) A-Wint</b> '.$TOTNPRO['TotAWINT'].' / '.$CapaAWint.' </td> <td> <input value="'.$PROAW.'" type="text" name ="ProAWINT" class="placement" size="4" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td> <input value ="'.$DEFAW.'" type="text" name="DefAWINT" class="placement" size="4" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td> <input value ="'.$ATTAW.'" type="text" name="AttAWINT" class="placement" size="4" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td></td> </tr>'; } if ($NBBAT['BBWINT'] > 0) { echo'<tr> <td> <b>'.$NBBAT['BBWINT'].' Hangar(s) B-Wint</b> '.$TOTNPRO['TotBWINT'].' / '.$CapaBWint.' </td> <td> <input value="'.$PROBW.'" type="text" name ="ProBWINT" class="placement" size="4" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td> <input value ="'.$DEFBW.'" type="text" name="DefBWINT" class="placement" size="4" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td> <input value ="'.$ATTBW.'" type="text" name="AttBWINT" class="placement" size="4" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td></td> </tr>'; } if ($NBBAT['BXWINT'] > 0) { echo'<tr> <td> <b>'.$NBBAT['BXWINT'].' Hangar(s) X-Wint</b> '.$TOTNPRO['TotXWINT'].' / '.$CapaXWint.' </td> <td> <input value="'.$PROXW.'" type="text" name ="ProXWINT" size="4" pattern="\d+" class="placement" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td> <input value ="'.$DEFXW.'" type="text" name="DefXWINT" size="4" class="placement" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td> <input value ="'.$ATTXW.'" type="text" name="AttXWINT" size="4" class="placement" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td></td> </tr>'; } if ($NBBAT['BVORTEX'] > 0) { echo'<tr> <td> <b>'.$NBBAT['BVORTEX'].' Hangar(s) Frégate Vortex</b> '.$TOTNPRO['TotVORTEX'].' / '.$CapaVortex.' </td> <td> <input value="'.$PROVO.'" type="text" name ="ProVORTEX" size="4" pattern="\d+" class="placement" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td> <input value ="'.$DEFVO.'" type="text" name="DefVORTEX" size="4" class="placement" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td> <input value ="'.$ATTVO.'" type="text" name="AttVORTEX" size="4" class="placement" pattern="\d+" onfocus="if(this.value == this.defaultValue) this.value = [];" onblur="if(this.value == []) this.value = this.defaultValue;" /> </td> <td></td> </tr>'; } ?> <tr> <td></td><td></td><td></td><td></td> <td><input type="submit" value="Valider" /></td> </tr> </tbody> </table> </form> </div> </body> </html> [/quote]

Re: Optimisation de script

Posté : 20 oct. 2019, 21:13
par or 1
1 non
2 pareil pour un si faible nombre
3 l'include fait perdre un temps négligeable

$base = mysqli_connect('localhost', 'id1904253_cyril', 'cyril', 'id1904253_base') or die (mysqli_error ($base));
c'est à mettre dans un fichier inclus, sinon, il faut modifier plusieurs fichiers quand on passe sur le vrai serveur

pas sur que récupérer les données dans 4 tables soit l'idéal. s'il est possible de n'avoir qu'une seule table, alors là, la différence est moins négligeable entre 4 select et 1 select. il faudrait savoir si les select utilisent bien un index pour savoir si les requêtes sont bien optimisées.

UPDATE protection SET Robot='".$_POST["ProRobot"]."' WHERE login='".$_SESSION["login"]."'
si les ' ne sont pas transformés, alors cela peut donner :
UPDATE protection SET Robot='1' where 1 -- '
ou
UPDATE protection SET Robot='1', VORTEX=2 where 1 -- '

Re: Optimisation de script

Posté : 20 oct. 2019, 22:21
par Vincent GLUTEN
Salut :)
Alors pour la variable de connexion je comprends pas trop, faire un fichier pour une seule ligne de code ça me semble pas top... Et puis je n'ai jamais rien eu besoin de modifier d'autre pour que ça fonctionne.
Diminuer les requêtes semble pas mal, il y a déjà beaucoup de colonnes dans mes tables ce qui fait que j'en ais fait plusieurs histoires de me retrouver, après je peux peut-être en fusionner une ou deux.
Pour mon idée numéro n°1, ça serait quelle méthode la plus rapide du coup, c'est le même temps ? Si je peux supprimer quelques lignes de code au passage ça m'arrangerait, à force de stocker tout ça dans des variables ça commence à faire pas mal de lignes ^^
Pour l'histoire des guillemets, j'ai vraiment passé vite fait pour apprendre les requêtes, du coup il y a peut-être trop de guillemets, mais vu que ça marchait j'ai laissé comme ça ^^ Il faudrait faire quoi comme transformation ?