Vos avis sur un système de forums

Merci pour ces compliments.

Ca dépend de ce que demande l’administrateur, plusieurs types de requêtes peuvent être générées.

Dans sa configuration de base.

La base de données des forums contient le nombre de posts et de topics. Ce qui permet d’éviter de générérer une requête par forum pour récupérer le nombre de page.

Idem pour les topics, chaque topic contient son nombre de posts ce qui évite de générer une requête COUNT pour obtenir le nombre de posts.

Pour afficher que les 20 premiers posts et les 20 premiers topics, c’est un simple LIMIT, ca évite de passer la table en entier. Un tout petit calcul permet de connaitre le début et le nombre de posts à afficher.
Tout ceci est ensuite passé au moteur qui va s’occuper de générer l’URL en fonction de la page demandée et vérifie si l’URL REWRITING est activé. Si tel est le cas, il génère un lien .html.

Si tu veux d’autres renseignements, n’hésites pas.

Une remarque toute bête concernant le code posté plus haut.
Tu devrais éviter d’utiliser innerHTML pour mettre à jour tes affichages, avec DOM, ça fonctionnerait sous tous les navigateurs et c’est pas beaucoup plus long à mettre en place, compte tenu de tout le boulot que t’as déjà effectué !

Merci pour ton aide.

Je ne connais absolument rien en javascript, ja vais essayer de trouver des infos sur “DOM”. J’en ai entendu parler mais j’ai trouvé innerHTML beaucoup plus simple. Ce que j’aimerais faire, c’est un code global qui récupèrerait le nom des balises DIV dans les balises XML de la réponse du serveur, ca serait beaucoup plus simple à générer.

J’ai repéré un bug!
ici : http://www.vtuning.net/index.php?forum=22

Bug : [b]Warning: array_reverse(): The argument should be an array in /home/vtuning/www/class/class_forums.php on line 120

Warning: Variable passed to each() is not an array or object in /home/vtuning/www/class/class_forums.php on line 122[/b]

:jap:

Justement… Un LIMIT c’est bien pour quelques centaines de posts, au-delà le temps de requête SQL augmente en fonction du nombre de post, et c’est de plus en plus lourd ! (en fait, le LIMIT, passe en revue TOUS les enregistrements correspondant à son champs avant d’atteindre les enregistrements demandés)

Si tu veux plus d’infos, va voir sur le topic des devs. de forums sur HFR (je ne linke pas ici, on sait jamais :whistle: )
Tu pourrais donc gagner en charge serveur et temps de génération des pages en remplaçant le LIMIT par une autre méthode (genre BETWEEN ou IN()) :wink:

Super, merci, je vais aller me renseigner la dessus. Je pensais que LIMIT serait le moins lourd et qu’il ne passait pas la table en entier.

Je viens de trouver quelques infos.

BETWEEN, que je ne connaissait pas, trouve tous les enregistrements compris entre X et Y, mais étant donné que l’on de connait pas les numéros de posts il faudrait ajouter une requete LIMIT avant.
On pourrait numéroter tous les posts, par exemple :
Post 1 du topic 10
Post 2 du topic 10
Post x du topic 10
Mais ca risque d’être le border en cas de supprétion d’un post, il faudrait exécuter une requête de “décrémentation” pour tous les post qui ont un numéro supérieur au post supprimé.


UPDATE table_des_posts SET numero_du_post = numero_du_post - 1 WHERE numero_du_post > numero_du_post_supprime

Pour IN ca serait à peu près la même chose.

Je ne peux pas afficher le forums que tu me conseilles.

Alors euh pour le BETWEEN, si tu as aussi une ID de posts pour chaque topic (en plus de l’ID général), tu peux fair eun between 0,40 puis 40,80 etc… sur le n° de post intra-topic
Mais en cas de suppression de posts, ça fera des vides sur certaines pages :confused:

Pour le IN, il faut certes un LIMIT, mais uniquement sur le champ ID; ce qui reste bien moins lourd qu’un LIMIT sur la totalité des posts

Mieux, un LIMIT sur l’ID de posts intra-topic, pour manipuler des IDs plus petits…
Ceci a été beaucoup débattu sur HFR (le forum du site hardware.fr)

Sinon la discussion sur le sujet commence et se termine une dizaine de pages plus loin :smiley:

Pour le moment les posts n’ont pas d’ordre de classement, ils ont tous un ID mais il est général. Je vais faire quelques bench pour voir ce que ca donne.

En tout cas merci.

En fait il faudrait un ID général comme c’est actuellement le cas, puis un autre ID référent à chaque sujet.
Ainsi, la masse d’IDs à traiter s’en trouvera fortement réduite !

Ah, ok je crois qu’on ne parlait pas de la meme chose.

Les topics ont un ID général et un ID de topic, quant le forum affiche un topic, il génère la requête :


SELECT post_id, etc... FROM table_des_posts WHERE topic_id=numero_du_topic LIMIT 0, 20

Ca lui évite de parcourrir toute la table pour ne trouver que les posts correspondant au topic.

J’ai commencé quelques bench avec BETWEEN et c’est vrai que le mieux serait en plus de l’ID du post et de l’ID du topic, ajouter le numéro de classement du post et de faire un BETWEEN dessus.

Je viens de générer une base de données contenant plus de 12 millions d’entrées pour faire des tests.

Mais bon BETWEEN s’apparente plus à un LIKE ou un IN qu’à un LIMIT.

Oui ok pour le principe de l’ID de topic, mais il faudrait appliquer le même principe aux posts dans un topic: un ID général et un ID propre au topic.

DIsons que pour le BETWEEN, en cas de suppression de post, il faudrait donc décrémenter de 1 tous les IDs de posts intra-topic pour ne pas avoir de vides.

Edit: ah oui, tu pourras poster tes résultats de benchs stp ?

Je fais quelques tests rapides, après je pense faire des boucles envoyant 1000 fois la même requête et faisant une moyenne.

La table contient 12793739 entrées.

Alors pour la requête :


SELECT * FROM `sql` LIMIT 421247 , 30

0.1433 Secondes


SELECT * FROM `sql` LIMIT 8212470 , 30

2.3140 Secondes

Ca fait énorme quant on cherche vers la fin de la table.

La suite, BETWEEN :


SELECT * FROM `sql` WHERE sql_id BETWEEN 421247 AND 421277 

0.0005 Secondes


SELECT * FROM `sql` WHERE sql_id BETWEEN 8212470 AND 8212500 

0.0005 Secondes.

Ca fait quant même une énorme différence.

Mais bon les topics avec plus de 400 000 posts sont quant même assez rares.

Oui, mais même sur des topics plus petits ça joue, surtout pour le serveur !

En effet, voila confirmé que le BETWEEN vaut mieux que le IMIT (mais à ce point quand même :ouch: )

Merci pour les résultats :smiley:

De rien.

C’est sur que plus de 2 secondes ca fait quant même beaucoup…

Sinon c’est vrai que c’est en optimisant chaque petite chose qu’au final…

Je viens de faire des tests en remplacant BETWEEN par WHERE sql_id>‘x’ AND sql_id>‘x’. Les résultats sont les même quoique à un moment il est descendu à 0.0004 secondes.

Je ne sais pas encore ce que je fais pour le forum mais il est possible que je fasse un script que réindexe les posts en leur attribuant un ID de classement.

Sinon j’ai quelque chose que je n’arrive pas à faire en SQL, j’ai lu qu’il est possible d’inclure des clauses IF dans une requete SQL, je voudrais utiliser ca pour les tables liées, par exemple si je lie la table sessions avec la table users par le numéro du membre, je voudrais qu’il ne les lie pas si le numéro du membre est un certain chiffre. J’utilise des LEFT JOIN pour faire la liaison. J’ai réussi à inclure des AND dans un ON mais je n’arrive pas à inclure un IF.

Merci encore pour toutes ces précisions.

Je pense que ça peux t’aider : http://dev.mysql.com/doc/refman/5.0/fr/if-statement.html

Sinon bah niveau programmation c’est pas quelque chose de surnaturel, mais bravo quand même, moi j’aurais jamais l’envie de me lancer dans un forum complet :confused: !
Parcontre je te conseil, si tu ne connais pas, de jetter un coup d’oeil à SMF, c’est franchement balèze je trouve, et ça peut être constructif pour voir comment eux ils sécurisent, et construisent…

Gratuit biensure :wink: !

Bonne chance

rha mais il le lache pas son SMF lui :lol:
je l’ai installé en local et franchement je ne le trouve pas si “puissant” que ça, pour reprendre tes termes…

Venant d’un adorateur des tables SMF peut prendre tes dires comme un compliment :stuck_out_tongue: !

ah mais t’façon je m’suis mis aux divs :stuck_out_tongue:
mais pas completement… tfaçon le systeme de templates je trouve ça nul chez smf, cest trop mal foutu :o

util, tu utilises quoi comme systeme de templates sur ton forum ?

Des fonctions retournant un HEREDOC


function skin_abcd( $data )
{
    return <<<ABC

<table>
  <tr>
    <td>{$data[1]}</td>
  </tr>
<table>
<div>{$data[2]}</div>
ABC;
}

Ca à quelques avantages comme par exemple pas besoin d’échapper les " ou les '.