Forum schneller machen ?

VanHellsehn

Erfahrenes Mitglied
Hat einer von euch eine Idee wie man ein Forum schneller bekommen könnte ? ^^

Die Lage ist die:
Ich habe mir ein Forum geschrieben stelle aber fest das er die beiträge nur recht langsam ausgibt...
Was kann man ändern bzw. verbessern ?
 
Mit diesen spärlichen Informationen wird das nichts mit Tipps geben.
Wie sieht die Ausgabe der Beiträge denn aus? Wie sieht die Datenbankstruktur aus? Man kann nichts verbessern, was man nicht sieht :)
 
Meine Tabellen ;) :

  • kategorien (Die Kategorien)
    • id (Die Kategorien ID)
    • name (Der Name der Kategorie, wie zb. Programmieren)
  • foren (Die Foren wie zb. PHP)
    • id (ID des Forums)
    • kategorien_id (zu welcher Kategorie es gehört)
    • name (Name / Titel )
    • beschreibung (Beschreibung / Erklärung)
    • geperrt (Gesperrt ( 1 oder 0 ))
  • post (Posts)
    • id (ID des Posts)
    • foren_id (ID des Forum in dem es gepostet wurde)
    • thread_id (ID des Thread in dem es gepostet wurde)
    • erstellung (Timestamp)
    • text (Text des Post)
    • user_id (ID des User der den Post gemacht hat)
    • smiley (Smileys bei dem Post Aktivieren ? ( 1 oder 0 ))
    • bb (BB-Codes bei dem Post Aktivieren ? ( 1 oder 0 ))
    • signatur (Signatur bei dem Post Aktivieren ? ( 1 oder 0 ))
    • last_edit (Letzter Edit (Timestamp))
    • last_edit_id (Der User des letzten Edits)
    • edit ( wie oft wurde er editiert)
  • thread (Threads)
    • id (Thread ID)
    • foren_id (FOrum ID)
    • name (Name / Titel)
    • user_id (User der den Thread erstellt hat)
    • erstellung (Timestamp)
    • last_post (Timestamp)
    • views (Views / Klicks)
    • wichtig (Wichtiger Thread ?)
    • gesperrt (Gesperrter Thread?)

Ich rufe sie immer mit mysql_fetch_obj(); auf..
 
Auch diese Angaben sind nicht besonders aussagekräftig... wie wäre es z.B. mit der Funktion die auf die Datenbank zugreift? z.B. könnte es ja sein, dass die schlecht programmiert ist und zu einer Query-Flut führt.
Du solltest wirklich viel, viel präziser werden! Das Ganze ist in etwa so aussagekräftig, wie wenn du sagst, dein Auto (welches einen 6Zylinder-Motor hat und blau lackiert ist) fährt zu langsam und möchtest gerne, dass es schneller fährt.
Aber selbst wenn du hier dein ganzes Forum posten würdest, bezweifel ich doch stark, dass dir jemand darauf antworten würde, wie du es schneller machen könntest ;)
Schaue dir doch einfach mal andere Boards an z.B. das phpbb (liefert auch eine gute Doku!)

EDIT: Du weißt übrigens schon, dass du mit diesem Thread gegen die Board-Regeln verstößt? Du solltest sie dir einmal durchlesen, damit du keinen ärger mit Mods bekommst ;)
 
Zuletzt bearbeitet:
Ein Grund dürfte wohl die Benutzung von [phpf]mysql_fetch_object[/phpf] sein. Die Funktion sollte m. E. nach gemieden werden bei prozeduraler Programmierung. Bewegt man sich nun in einem strikten OOP Raum und eine Klasse verarbeitet die Daten weiter, ist die Benutzung eines Objekts natürlich sinnvoller.

Einen Datensatz aus einem Result Set laden
Bitte auch die Kommentare lesen ;)
 
Weiters interresant were zu wissen wie dein Sql abfragen ausehen. Ruft du alles auf einmal ab oder stück für stück. Welches system verwendest du für die Forum ausgabe.
Nested Sets ?

Desweiteren kanst du auch noch die Db Optimieren bwz Datenbank caching einsetzen.
Man kann immer was optimieren auch wenn es manchmal bedeuted viel um zu schreiben.

Als ersterst mußt du mal versuchen rauszubekommen wo die Geschwindigkeits bremse liegt.Verschieden Testdurchläufe durchführen (Zeit messen) unsw,

Mfg Splasch
 
@Felix Jacobi: Soll ich die Daten lieber in einer Array ausgeben lassen?

Hier mal ein Beispiel zu meinen Abfragen:

PHP:
$connect = mysql_connect("localhost", "user", "pw");
mysql_select_db("db");

$forum_1 =  stripslashes($_GET['category']);
$foren_query_1 = mysql_query("SELECT * FROM foren WHERE name LIKE '".$forum_1."'");


if(@mysql_num_rows($foren_query_1) > 0){
$thread_1 =  stripslashes($_GET['id']);
$thread_query_1 = mysql_query("SELECT * FROM thread WHERE id = '".$thread_1."'");

if(@mysql_num_rows($thread_query_1) > 0){

$forum = $_GET['category'];
$thread_id = $_GET['id'];

$foren_query = mysql_query("SELECT * FROM foren WHERE name LIKE '".$forum."'");
$foren_obj =  mysql_fetch_object($foren_query);

$thread_query = mysql_query("SELECT * FROM thread WHERE foren_id LIKE ".$foren_obj->id." AND id LIKE '".$thread_id."'");
$thread_obj =  mysql_fetch_object($thread_query);

$thread_views = $thread_obj->views;
$thread_views++;

mysql_query("UPDATE thread SET views = '".$thread_views."' WHERE id = '".$thread_obj->id."'") or die(mysql_error());

$post_query = mysql_query("SELECT * FROM post WHERE thread_id LIKE ".$thread_obj->id." ORDER BY erstellung");

Und ausgeben tue ich sie so:

PHP:
 while($post_obj =  mysql_fetch_object($post_query)){

// Ausgabe des Beitrags

}

Ich würde auch mal sagen das ich zu viele Querys drin habe nur ich weiß nicht wie ich das alles ändern könnte..
 
Bewegt man sich nun in einem strikten OOP Raum und eine Klasse verarbeitet die Daten weiter, ist die Benutzung eines Objekts natürlich sinnvoller.
Das ist richtig. Den Code den du gepostet hast lässt nun keine Aussage darüber zu, aber ich empfehle dennoch mysql_fetch_assoc zu benutzen, da das die schnellste der drei "fetcher" ist.
Es empfiehlt sich außerdem die SQL-Anfragen zu Limiten wenn nur ein Datensatz benötigt wird.
Und noch was:
PHP:
if(@mysql_num_rows($thread_query_1) > 0){

$forum = $_GET['category'];
$thread_id = $_GET['id'];

$foren_query = mysql_query("SELECT * FROM foren WHERE name LIKE '".$forum."'");
$foren_obj =  mysql_fetch_object($foren_query);

Das steht nicht wirklich so in deinem Code, oder?
Du fragst deine DB mit einer un-escapeden Variable ab, das sollte man aus Vorsicht vor sql-Injection niemals tun.
Also liebe mysql_real_escape_string() benutzen und dann die Frage starten.

Grüße
 
Zuletzt bearbeitet:
Das ist richtig. Den Code den du gepostet hast lässt nun keine Aussage darüber zu, aber ich empfehle dennoch mysql_fetch_assoc zu benutzen, da das die schnellste der drei "fetcher" ist.
Es empfiehlt sich außerdem die SQL-Anfragen zu Limiten wenn nur ein Datensatz benötigt wird.
Und noch was:
PHP:
if(@mysql_num_rows($thread_query_1) > 0){

$forum = $_GET['category'];
$thread_id = $_GET['id'];

$foren_query = mysql_query("SELECT * FROM foren WHERE name LIKE '".$forum."'");
$foren_obj =  mysql_fetch_object($foren_query);

Das steht nicht wirklich so in deinem Code, oder?
Du fragst deine DB mit einer un-escapeden Variable ab, das sollte man aus Vorsicht vor sql-Injection niemals tun.
Also liebe mysql_real_escape_string() benutzen und dann die Frage starten.

Grüße

Das sind schon mal zwei wichtige Tipps die ich verwerten werde..
Danke ich melde mich wieder wenn ich dies getan habe und es immer noch ziemlich langsam ist ;)#

Und ich werde es mit addshlashes() und mysql_real_escape_string() sicherer machen
 
Zuletzt bearbeitet:
Hallo @VanHellsehn

Was dein Forum auch weitaus schneller machen würde wären weniger sql queries !
Ein Query braucht im Vergleich zu anderen PHP Funktionen weitaus mehr Zeit und deshalb solltest du es vermeiden viele SQL Queries auf einmal durch zu führen.
Ich weiß nicht wie der Rest des Scriptes aussieht, aber 6 Queries in diesen paar Zeilen ist immens viel und wenn der Rest auch so viel enthält: Na pfiati Gott! (auf gut Tirolerisch ;) )

Mysql bietet hier Gott sei dank Abhilfe.
Schau dir mal Subqueries und Joins an.
Damit kannst du deine jetztigen Queries auf 2-3 vermindern.
Machst du dies überall dürfte das Forum weitaus schneller laufen.


-------

Hast du irgendwo noch eine Login bzw. Session Funktion davor, die den User bestimmt ?
Wenn ja, würde die mich mal interessieren, da dies auch häufig eine Fehlerquelle ist und weitaus erleichtert werden kann.

Ich hoff das war schon einmal eine Hilfe ;)

Grüße Simon :)
 
Zurück