Ik heb een forum (zelf gemaakt) en de index is erg traag. Het is een forum zoals een ander, het heeft hoofdcategorieën (categorieën) en subcategorieën (forums).µ
Alleen sinds kort zijn er veel meer topics waardoor het laden van de index een hele poos vraagt. Kennen jullie enkele tips om de snelheid weer wat hoger te krijgen?
PS: Bij cache, zeg dan ook hoe het moet en wat er in dat bestandje moet staat + hoe het best toe te passen.
Er is een while lus in een while lus. Ik gok het op zo'n 30 queries voor alles weer te geven + 5 tot 10 om het ongelezen/gelezen systeem + statistieken te weergeven:
<?php
//Haal de hoofdcategorieën uit de DB
$query2 = "SELECT * FROM `forum_cat1`";
$result2 = mysql_query($query2) or die(mysql_error());
//Fetchen in de while
while($fetch2 = mysql_fetch_array($result2))
{
if(empty($fetch['groepen']) || $fetch['groepen'] == 0)
{
//Haal de subcategorieën uit de DB
$query3 = "SELECT `id`, `naam`, `beschrijving` FROM `forum_cat2` WHERE `cat1`='".$fetch2['id']."' && `soort`!='2'";
$result3 = mysql_query($query3) or die(mysql_error());
}
else
{
//Haal de subcategorieën uit de DB
$query3 = "SELECT `id`, `naam`, `beschrijving` FROM `forum_cat2` WHERE `cat1`='".$fetch2['id']."'";
$result3 = mysql_query($query3) or die(mysql_error());
}
//Geef het begin van de tabel weer
echo "<table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_tblr'>
<tr>
<td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='80%'>
".$fetch2['naam']."
</td>
<td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='10%'>
Topics
</td>
<td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='10%'>
Posts
</td>
</tr>
</table>";
//In de while
while($fetch3 = mysql_fetch_array($result3))
{
$query9 = "SELECT COUNT(`topicid`) FROM `forum_gelezen` WHERE `lidid`='".$_COOKIE['id']."' && `catid`='".$fetch3['id']."'";
$result9 = mysql_query($query9) or die(mysql_error());
$m_result9 = mysql_result($result9,0);
//Tel de topics
$query7 = "SELECT COUNT(`id`) FROM `forum_topics` WHERE `catid`='".$fetch3['id']."'";
$result7 = mysql_query($query7) or die(mysql_error());
$m_result7 = mysql_result($result7,0);
//Tel de berichten, dit moet in een join omdat anders de catid van de post niet bepaald kan worden
$query8 = "SELECT COUNT(b.id) FROM forum_berichten b LEFT JOIN forum_topics t ON(b.topicid = t.id) WHERE t.catid='".$fetch3['id']."'";
$result8 = mysql_query($query8) or die(mysql_error());
$m_result8 = mysql_result($result8,0);
//De posts bij de reacties optellen om alles te vinden
$tel_posts = $m_result7 + $m_result8;
$freeres8 = mysql_free_result($result8);
$bij = ($m_result9 == $m_result7) ? "<img src='../../images/gel_open.gif' width='40' height='23' border='0' align='left' alt='' />" : "<img src='../../images/ong_open.gif' width='40' height='23' border='0' align='left' alt='' />";
echo "<table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_lrb'>
<tr>
<td width='10%' valign='middle'>
".$bij."
</td>
<td width='70%' valign='top'>
<a href='categorie.php?id=".$fetch3['id']."'>- ".$fetch3['naam']."</a><br />
<div class='klein'>".$fetch3['beschrijving']."</div>
</td>
<td width='10%' valign='top'>
".$m_result7."
</td>
<td width='10%' valign='top'>
".$tel_posts."
</td>
</tr>";
$freeres7 = mysql_free_result($result7);
}
echo "</table><br />";
$freeres3 = mysql_free_result($result3);
}
$freeres2 = mysql_free_result($result2);
?>
- daar wordt de front-pagina veel bekeken, dus hebben ze besloten om de html code te genereren. Zodat er geen tijd verloren gaat met de pagina te genereren.
werking:
- cronjob, om de 10/5 minuten, ofzo...
- die cronjob roept dan een php scriptje aan
- die php script maakt de voorpagina en zet het in index.html
- de mensen roepen index.html aan en de code is al voorgekauwd
Maar 'k denk niet dat dat jouw probleem is. 'k Denk dat jouw probleem is, dat je je code moet optimaliseren. Niet te veel query's en loops nemen.
Ik gebruik een while lus. Dus daar moet de functie wel tussen de (). En er moeten 2 while lussen of de boel flipt helemaal. Kan je een concreet voorbeeld op mijn code geven?
Op m'n site zelf (je moet wel lid zijn). Mijn site zie je in mijn profiel (anders overtreed ik de regel "Reclame" nog ). Je moet je via het linker menu aanmelden, activeren, inloggen en dan via rechter menu op Grote Zaal klikken.
Moet ik je het bestand anders ff mailen (pm dan even je mailadres, dan kan het in de bijlage van een gewone mail)?
Ik heb voor de aantallen een nieuwe tabel gemaakt en die erin gezet. HTML buiten PHP gezet. Ik heb van voor mysql_free_result() de $varnaam = gehaald. Er is geen verschil qua laadtijd.
echo'<script>window.status = "This part created in: '.round(array_sum(explode(' ',microtime()))-$exectime_start,4).' seconds";</script>';
?>
je zet deze dingen rondom je code en probeer zo uit te vissen waar de bottle-neck precies zit. Dus eerst rond heel de code. Dan de bovenste helft. daarna de onderste helft. Kijken wat er het traagst gaat en dan weer delen in 2 en kijken wat er het snelst gaat.
zet je bevindingen dan hier, 'k ga je dan wel meehelpen om het op te lossen ...
Thomas - 08/02/2006 11:25 (laatste wijziging 08/02/2006 11:27)
Moderator
Het helpt enorm als je een INDEX aanmaakt op een of meer tabellen, daar maakt dit forum ook gebruik van.
Het reduceren van het aantal queries helpt natuurlijk ook...
Die code werkt enkel in IE waar het dus sneller gaat. Als ik het rond de volledige code zet (if(isset($_GET['action']) && $_GET['action'] == "mark") tot waar het sluit niet meegerekend: 3,7755 sec)
- Zonder de 2 while: 0,0002 sec
- Beide while lussen: 3,8094 sec
- Binnenste while ($fetch3 = ), er rond dus: 0,6607 (maal 5 omdat er 5 hoofdcategorieën staat en het dus in die while staat, het script zal dus 5 keer heropgeroepen worden).
wrm duurt het dan zolang als je naar de index.php gaat, zonder ?action=mark???
dus zou je beter willen speciefieren?? Misschien de code posten die het traagst gaat. En gelieve dan een stuk code te geven dat maar 1 à 2 queries bevat.
* Maakt je forum gebruik van FULLTEXT kolommen?
Gebruik een INDEX (dit is iets anders dan een PRIMARY KEY)
* Sla het categorie-id op bij reacties, anders moet je allemaal tabellen aan elkaar gaan hangen om uit te vinden tot welke categorie een reactie hoort.
<?php
//dit is dan een deel van je index
include("nieuwe_berichten.htm"); //dit doe je op de plaats van je tabel
?>
<?php
//dit is dan een deel van je index
include("nieuwe_berichten.htm");//dit doe je op de plaats van je tabel
?>
dit is maar een heel simpel voorbeeldje maar als ik lange loadtime heb gebruik ik dit principe. je kunt dit ook in combinatie met cronjobs gebruiken. hierdoor zijn er een stuk minder query's.
@Voldemort: Als je zo'n tabel als aan de rechterkant van sima gebruikt dan kost dat heel veel loadtime omdat er veel query's worden gebruikt. Daarom moet je ervoor zorgen dat de query's niet in het script worden uitgevoerd maar daarbuiten.
even een voorbeeldje:
<table>
<tr>
<td>head van tabel (bijv. actieve forumberichten)</td>
</tr>
<?php
include("nieuwe_berichten.htm");//hier include je de inhoud van de tabel.
?>
</table>
<table>
<tr>
<td>head van tabel (bijv. actieve forumberichten)</td>
</tr>
<?php
include("nieuwe_berichten.htm");//hier include je de inhoud van de tabel.
?>
</table>
Vantevoren worden dan de query's uitgevoerd en de uitvoer wordt dan in nieuwe_berichten.htm geschreven. Het schrijven kun je bijvoorbeeld met een cronjob laten uitvoeren.
@kokx: Een pagina in cache zetten en elke 5 minuten met een cronjob laten updaten? Bedoel je dat?
@FangorN:
Citaat:
* Sla het categorie-id op bij reacties, anders moet je allemaal tabellen aan elkaar gaan hangen om uit te vinden tot welke categorie een reactie hoort.
Ben ik nu met bezig .
@FangorN:
Citaat:
*zucht*
> CREATE INDEX
> JOIN SYNTAX (hoe je INDEXen moet gebruiken)
Kan je een link naar een NL artikel geven?
Update: De forum index gaat nu zo'n 5 seconden sneller door FangorN zijn oplossing:
Citaat:
* Sla het categorie-id op bij reacties, anders moet je allemaal tabellen aan elkaar gaan hangen om uit te vinden tot welke categorie een reactie hoort.
Alleen kan het nog sneller denk ik (2 seconden doet ie er nu over in FF). Kunnen jullie nog even op die indexeren en cache vragen antwoorden?
Update 2: Leden vinden dat het nog sneller moet.
Update 3: Ik heb het indexeren dmv phpmyadmin gedaan met behulp van een vriend die me vertelde over de versnelde WHERE en de vertraagde UPDATE, INSERT en DELETE en je het daarom niet allemaal mag doen. Het forum is weer super snel.
Enige vraag nog:
@kokx: Een pagina in cache zetten en elke 5 minuten met een cronjob laten updaten? Bedoel je dat?
weer bijgeleerd, 'k wist langs geen kanten van die forum index,
leuk dat ik weer bijleer en dat het is opgelost.
[edit] 'k vind dat je in die post van "Forum index weer snel & Terrein van Zweinstein" toch wel iets kan vermelden van die vriend, miss ook van sima? ...
Het is niet echt een vriend, meer iemand die ik al even via MSN ken. Het is een lid op sima (klik).
Iedereen bedankt voor de hulp, ik heb weer nieuwe SQL technieken geleerd en ingezien dat zo'n simpele join heel veel kan vertragen, nu zal ik hopelijk nog betere scripts kunnen maken ;).