Ouaip, je confirme.Envoyé par XtofRoland
Ouaip, je confirme.Envoyé par XtofRoland
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework - Cours et tutoriels pour apprendre PHP - Forum PHP
Un truc tout bete d'optimisation, installer un cache du script compilé genre eaccelerator et les perfs seront grandement améliorée.
Donc c'est bien d'optimiser a mort le code, faudrait aussi que ça soit le cas du coté du serveur![]()
yep, mais ça c'est bien souvent l'hebergeur qui le controle.Envoyé par chaced
Et puis sur un truc codé comme un goret, le cache d'OpCode ne changera pas grand chose : phpBB est lent qu'eAccelerator soit installé ou non.![]()
Troll spottedEnvoyé par Kioob
Sérieusement, heureusement que phpBB met en cache pas mal de trucs (ex. : nombre de posts par user), sans quoi ce serait encore plus lent (et pourtant, ce serait la "bonne" méthode à utiliser).
Vivent les index ?
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework - Cours et tutoriels pour apprendre PHP - Forum PHP
Je sens un bon gain en perf, mais j'ai un forum Skyomatic, pas de phpbbEnvoyé par Kioob
![]()
Il me semble qu'un objet est libéré automatiquement a sa derniere utilisation...Envoyé par ermelir
Une optimisation qui peut également apporter d'énorme gain de temps d'exéctution lors de nombreuses requetes de selection dans une base de donnée et la mise en cache des résultats dans un fichier local. Le gain n'est évidemment sensible que si les données sélectionnées évoluent peu au cours du temps. Cette astuce dans sa forme actuelle est toutefois à employer avec précaution car tant que le fichier cache n'aura pas été supprimer, cela masquera les données réellement présentes dans la base.
Dans mon cas, il s'agit d'une gallerie photo. Si elle est mise à jour toutes les semaines c'est énhooooorme.
Pour mesurer l'ecart de performences, j'ai utilisé le bench fourni par iubito et effectué 5000 itérations
Voici les résultats que j'ai obtenu
La différence est phénoménale dans mon cas, ca va entre 8 et 9 fois plus viteRequete simple sur deux tables simultanées
SELECT a.id, a.filename, a.title, a.author, a.description, a.added, b.folder FROM MySite_pictures a,MySite_albums b WHERE (a.idalbum=55 AND b.id=55) LIMIT 0,9
Durée: 11.16851 s, Vitesse: 448 requetes par seconde
Requete simple sur deux tables simultanées, cache active
SELECT a.id, a.filename, a.title, a.author, a.description, a.added, b.folder FROM MySite_pictures a,MySite_albums b WHERE (a.idalbum=55 AND b.id=55) LIMIT 0,9
Durée: 1.48137 s, Vitesse: 3375 requetes par seconde
Requete AVEC JOIN
SELECT a.id, a.filename, a.title, a.author, a.description, a.added, b.folder FROM MySite_pictures a, MySite_albums b JOIN MySite_albums ON a.idalbum=b.id WHERE a.idalbum=55 LIMIT 0,9
Durée: 13.16669 s, Vitesse: 380 requetes par seconde
Requete AVEC JOIN et cache
SELECT a.id, a.filename, a.title, a.author, a.description, a.added, b.folder FROM MySite_pictures a, MySite_albums b JOIN MySite_albums ON a.idalbum=b.id WHERE a.idalbum=55 LIMIT 0,9
Durée: 1.30094 s, Vitesse: 3843 requetes par seconde
Voici le code que j'ai utilisé, pour ceux que ca interesse. Il n'a subit aucune optimisation particulière; il devrait donc être encore possible d'améliorer le résultat.
Code de Test
(Il y a la même chose avec la deuxieme requête)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 echo '<h2>Requete simple sur deux tables simultanées</h2>'; $SQL = "SELECT a.id, a.filename, a.title, a.author, a.description, a.added, b.folder FROM $Table_Pictures a,$Table_Albums b WHERE (a.idalbum=$Album_ID AND b.id=$Album_ID) LIMIT $FirstPic,$galPicturesPerPage"; echo $SQL.'<br>'; start(); for ($i=0; $i<5000; $i++){ $myPictures = $myDB->Query($SQL); }; stop(); echo resultat(5000, 'requetes'); echo '<h2>Requete simple sur deux tables simultanées, cache active</h2>'; $SQL = "SELECT a.id, a.filename, a.title, a.author, a.description, a.added, b.folder FROM $Table_Pictures a,$Table_Albums b WHERE (a.idalbum=$Album_ID AND b.id=$Album_ID) LIMIT $FirstPic,$galPicturesPerPage"; echo $SQL.'<br>'; start(); for ($i=0; $i<5000; $i++){ $myPictures = $myDB->Query($SQL, true); }; stop(); echo resultat(5000, 'requetes');
La suite, le code de ma classe qui effectue la requeteET enfin, les deux procedures que j'ai écrite pour stocker mes array dans des fichiers et les recharger par après
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 /********************************************************************** * Generic SQL query. *********************************************************************** * @param $query * @retrun : **********************************************************************/ function Query($query, $Cache = false){ //Create the name of the file wich could contain the values $filename = $_SERVER['DOCUMENT_ROOT'].'/cache/'.md5($query).'.txt'; if (!(strpos($query, 'SELECT') === false) && ($Cache == true) && file_exists($filename) && is_readable($filename)){ $result = array(); $result = $this->LoadArrayFromFile($result, $filename); return $result; } else { //If there's no existing connection to the server, //let's try to create one. if (!$this->dbConnected){ $this->Connect();}; //If there's a connection to the server and if we can acces the //database we can execute our query if ($this->dbConnected && $this->OpenDataBase()){ //Construct the query $myQuery = $query; $this->LastQuery = $myQuery; if ($res = mysql_query($myQuery)){ $result = array(); $i = 0; while ($data = mysql_fetch_row($res)){ $j = 0; foreach ($data as $item){ $result[$i][mysql_field_name($res,$j)] = $data[$j]; $j++; } $i++; }; if (!(strpos($query, 'SELECT') === false) && ($Cache = true)){ //Store the result in the file for the next time $this->SaveArrayToFile($result, $filename); }; return $result; } else { $this->errorMessage = '<i>'.$myQuery.'</i><br/>'.mysql_error(); $this->errorNumber = mysql_errno(); if ($this->Debug){ $this->GetLastError();}; }; }; }; }
En modifiant ces deux dernières fonctions pour sérializer/desérialiser le tableau, on perd un peu en performance mais on gagne en souplesse
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 /********************************************************************** * Save an array in a text file. An implicit conversion from each item * in the array to string must be possible otherwise it shouldn't work. * The array may contain arrays but those cannot. *********************************************************************** * @param &$array : pointer to the array to store * @param $filename : name of the file where the value must be saved * @retrun : / **********************************************************************/ function SaveArrayToFile(&$array, $filename){ $Header = implode(', ',array_keys($array[0]))."\r\n"; $Content = ''; foreach ($array as $item){ //Pour chaque photo $Content .= implode(', ',$item)."\r\n"; }; $handle = fopen($filename, "w+"); fwrite($handle, $Header.$Content); fclose($handle); } /********************************************************************** * Load an array form a text file. An implicit conversion from string * to the original type must be possible otherwise it shouldn't work. *********************************************************************** * @param $filename : name of the file where the value has been saved * @retrun : loaded array **********************************************************************/ function LoadArrayFromFile($filename){ $handle = fopen($filename, "r"); $Text = fread($handle, filesize($filename)); fclose($handle); $Content = explode("\r\n", $Text); //Recuperer les index des champs $i = 0; foreach(explode(", ", $Content[0]) as $item){ $Keys[$i] = $item; $i++; }; $Text_Count = count($Text); for($i=1; $i<$Text_Count; $i++){ $j = 0; foreach(explode(", ", $Content[$i]) as $item){ $array[$i-1][$Keys[$j]] = $item; $j++; }; }; } };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 /********************************************************************** * Save an array in a text file. *********************************************************************** * @param &$array : pointer to the array to store * @param $filename : name of the file where the value must be saved * @retrun : / **********************************************************************/ function SaveArrayToFile(&$array, $filename){ $handle = fopen($filename, "w+"); fwrite($handle, serialize($array)); //fwrite($handle, $Header.$Content); fclose($handle); } /********************************************************************** * Load an array form a text file. *********************************************************************** * @param $filename : name of the file where the value has been saved * @retrun : loadded array **********************************************************************/ function LoadArrayFromFile($filename){ $handle = fopen($filename, "r"); $Text = fread($handle, filesize($filename)); fclose($handle); $array = unserialize($Text); } };Requete simple sur deux tables simultanées
SELECT a.id, a.filename, a.title, a.author, a.description, a.added, b.folder FROM MySite_pictures a,MySite_albums b WHERE (a.idalbum=55 AND b.id=55) LIMIT 0,9
Durée: 11.7862 s, Vitesse: 424 requetes par seconde
Requete simple sur deux tables simultanées, cache active
SELECT a.id, a.filename, a.title, a.author, a.description, a.added, b.folder FROM MySite_pictures a,MySite_albums b WHERE (a.idalbum=55 AND b.id=55) LIMIT 0,9
Durée: 1.48182 s, Vitesse: 3374 requetes par seconde
Requete AVEC JOIN
SELECT a.id, a.filename, a.title, a.author, a.description, a.added, b.folder FROM MySite_pictures a, MySite_albums b JOIN MySite_albums ON a.idalbum=b.id WHERE a.idalbum=55 LIMIT 0,9
Durée: 13.24316 s, Vitesse: 378 requetes par seconde
Requete AVEC JOIN et cache
SELECT a.id, a.filename, a.title, a.author, a.description, a.added, b.folder FROM MySite_pictures a, MySite_albums b JOIN MySite_albums ON a.idalbum=b.id WHERE a.idalbum=55 LIMIT 0,9
Durée: 1.51247 s, Vitesse: 3306 requetes par seconde
bonjour: svp mon français est trop faible mais j'essaye de m'exprimer pour mieux poser ma question .
dans un forum ou chat on trouve généralement une zone de texte je veux copier coller
dans cette zone une application visual basic et dans cette application un bouton si on clic sur ce bouton un texte apparait. b1 sur ce texte est préalablement programmer dans l'application par l'utilisateur de application et pas par l'utilisateur du chat ou du forum ,j'espère que c'est clair merci de votre compréhension .
Bonjour,
Cette approche bien qu'elle soit juste dans l'intention n'est pas bonne du tout dans la forme, car c'est ainsi que fonctionnent la plupart des CMS et qui dans le cas présent constiste à utiliser la BD pour faire de la persistance de classe ce qui est à proscrire dans un contexte où les performances et la disponibilité en charge doivent être garantis.Envoyé par alekusu
Dans le cas d'un site ecommerce il faut que la BD soit fortement normalisée et par conséquent qu'elle intègre les spécificités métier et fonctionnelles de l'applicatif Web.
Pour ce qui est de l'affichage, appliquer votre vision est la bonne méthode à ceci près qu'il faille le faire avec des vues, bien qu'avec MySQL des requêtes dédiées soient le plus souvent les plus appropriées.
++
_______________________________________
Azure Data Engineer & Azure DBA
Blog TSE sur developpez.com : Architectures web hautes performances en PHP
Les meilleurs tutoriels PHP sur developpez.com
Je rajoute un lien discuté très recemment qui concerne également ce topic
http://www.developpez.net/forums/d12...njections-sql/
++
_______________________________________
Azure Data Engineer & Azure DBA
Blog TSE sur developpez.com : Architectures web hautes performances en PHP
Les meilleurs tutoriels PHP sur developpez.com
Partager