login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Forum index traag

Offline Voldemort - 05/02/2006 21:14
Avatar van VoldemortPHP ver gevorderde 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.

25 antwoorden

Gesponsorde links
Offline Gerard - 05/02/2006 21:16
Avatar van Gerard Ouwe rakker Optimaliseren van de queries is een goed idee dan maar.
Hoeveel queries worden er uitgevoerd op jouw index?
Offline Voldemort - 05/02/2006 21:19 (laatste wijziging 05/02/2006 21:27)
Avatar van Voldemort PHP ver gevorderde 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:

  1. <?php
  2. //Haal de hoofdcategorieën uit de DB
  3. $query2 = "SELECT * FROM `forum_cat1`";
  4. $result2 = mysql_query($query2) or die(mysql_error());
  5.  
  6. //Fetchen in de while
  7. while($fetch2 = mysql_fetch_array($result2))
  8. {
  9. if(empty($fetch['groepen']) || $fetch['groepen'] == 0)
  10. {
  11. //Haal de subcategorieën uit de DB
  12. $query3 = "SELECT `id`, `naam`, `beschrijving` FROM `forum_cat2` WHERE `cat1`='".$fetch2['id']."' && `soort`!='2'";
  13. $result3 = mysql_query($query3) or die(mysql_error());
  14. }
  15. else
  16. {
  17. //Haal de subcategorieën uit de DB
  18. $query3 = "SELECT `id`, `naam`, `beschrijving` FROM `forum_cat2` WHERE `cat1`='".$fetch2['id']."'";
  19. $result3 = mysql_query($query3) or die(mysql_error());
  20. }
  21.  
  22. //Geef het begin van de tabel weer
  23. echo "<table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_tblr'>
  24. <tr>
  25. <td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='80%'>
  26. ".$fetch2['naam']."
  27. </td>
  28. <td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='10%'>
  29. Topics
  30. </td>
  31. <td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='10%'>
  32. Posts
  33. </td>
  34. </tr>
  35. </table>";
  36.  
  37. //In de while
  38. while($fetch3 = mysql_fetch_array($result3))
  39. {
  40. $query9 = "SELECT COUNT(`topicid`) FROM `forum_gelezen` WHERE `lidid`='".$_COOKIE['id']."' && `catid`='".$fetch3['id']."'";
  41. $result9 = mysql_query($query9) or die(mysql_error());
  42. $m_result9 = mysql_result($result9,0);
  43.  
  44. //Tel de topics
  45. $query7 = "SELECT COUNT(`id`) FROM `forum_topics` WHERE `catid`='".$fetch3['id']."'";
  46. $result7 = mysql_query($query7) or die(mysql_error());
  47. $m_result7 = mysql_result($result7,0);
  48.  
  49. //Tel de berichten, dit moet in een join omdat anders de catid van de post niet bepaald kan worden
  50. $query8 = "SELECT COUNT(b.id) FROM forum_berichten b LEFT JOIN forum_topics t ON(b.topicid = t.id) WHERE t.catid='".$fetch3['id']."'";
  51. $result8 = mysql_query($query8) or die(mysql_error());
  52. $m_result8 = mysql_result($result8,0);
  53.  
  54. //De posts bij de reacties optellen om alles te vinden
  55. $tel_posts = $m_result7 + $m_result8;
  56. $freeres8 = mysql_free_result($result8);
  57.  
  58. $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='' />";
  59.  
  60. echo "<table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_lrb'>
  61. <tr>
  62. <td width='10%' valign='middle'>
  63. ".$bij."
  64. </td>
  65. <td width='70%' valign='top'>
  66. <a href='categorie.php?id=".$fetch3['id']."'>- ".$fetch3['naam']."</a><br />
  67. <div class='klein'>".$fetch3['beschrijving']."</div>
  68. </td>
  69. <td width='10%' valign='top'>
  70. ".$m_result7."
  71. </td>
  72. <td width='10%' valign='top'>
  73. ".$tel_posts."
  74. </td>
  75. </tr>";
  76.  
  77. $freeres7 = mysql_free_result($result7);
  78.  
  79. }
  80.  
  81. echo "</table><br />";
  82. $freeres3 = mysql_free_result($result3);
  83. }
  84.  
  85. $freeres2 = mysql_free_result($result2);
  86. ?>


Citaat:
Opmerking door Haytjes
'k heb ik de tabs weggehaald
Offline haytjes - 05/02/2006 21:24 (laatste wijziging 05/02/2006 21:25)
Avatar van haytjes Gouden medailleGouden medaille

JS gevorderde
bv. tweakers.net

- 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.

bv. loops optimaliseren:
  1. <?
  2. foreach($array as $value)
  3. ?>

veranderen in: (als je $array oplopende nummers heeft)
  1. <?
  2. $j = count($array);
  3. for($i=0;$i<$j$i++)
  4. ?>


en
  1. <?
  2. for($i=0;$i<count($array);$i++)
  3. ?>

veranderen in:
  1. <?
  2. $j = count($array);
  3. for($i=0;$i<$j$i++)
  4. ?>


[edit]'k zal direct een keer je code onder de loep nemen
Offline Voldemort - 05/02/2006 21:28 (laatste wijziging 05/02/2006 21:37)
Avatar van Voldemort PHP ver gevorderde 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?

Edit: De volledig code is:

  1. <?php
  2. if(isset($_GET['action']) && $_GET['action'] == "mark")
  3. {
  4. $query2 = "DELETE FROM `forum_gelezen` WHERE `lidid`='".$_COOKIE['id']."'";
  5. $result2 = mysql_query($query2) or die("Query 2: ".mysql_error());
  6. $freeres2 = mysql_free_result($result2);
  7.  
  8. $query3 = "SELECT `id`, `catid` FROM `forum_topics`";
  9. $result3 = mysql_query($query3) or die("Query 3: ".mysql_error());
  10.  
  11. while($fetch3 = mysql_fetch_array($result3))
  12. {
  13. $query4 = "INSERT INTO `forum_gelezen`
  14. VALUES('".$_COOKIE['id']."', '".$fetch3['catid']."', '".$fetch3['id']."')";
  15. $result4 = mysql_query($query4) or die("Query 4: ".mysql_error());
  16. $freeres4 = mysql_free_result($result4);
  17. }
  18.  
  19. $freeres3 = mysql_free_result($result3);
  20.  
  21. exit(header("Location: index.php"));
  22. }
  23.  
  24. //Haal de hoofdcategorieën uit de DB
  25. $query2 = "SELECT * FROM `forum_cat1`";
  26. $result2 = mysql_query($query2) or die(mysql_error());
  27.  
  28. //Fetchen in de while
  29. while($fetch2 = mysql_fetch_array($result2))
  30. {
  31. if(empty($fetch['groepen']) || $fetch['groepen'] == 0)
  32. {
  33. //Haal de subcategorieën uit de DB
  34. $query3 = "SELECT `id`, `naam`, `beschrijving` FROM `forum_cat2` WHERE `cat1`='".$fetch2['id']."' && `soort`!='2'";
  35. $result3 = mysql_query($query3) or die(mysql_error());
  36. }
  37. else
  38. {
  39. //Haal de subcategorieën uit de DB
  40. $query3 = "SELECT `id`, `naam`, `beschrijving` FROM `forum_cat2` WHERE `cat1`='".$fetch2['id']."'";
  41. $result3 = mysql_query($query3) or die(mysql_error());
  42. }
  43.  
  44. //Geef het begin van de tabel weer
  45. echo "<table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_tblr'>
  46. <tr>
  47. <td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='80%'>
  48. ".$fetch2['naam']."
  49. </td>
  50. <td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='10%'>
  51. Topics
  52. </td>
  53. <td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='10%'>
  54. Posts
  55. </td>
  56. </tr>
  57. </table>";
  58.  
  59. //In de while
  60. while($fetch3 = mysql_fetch_array($result3))
  61. {
  62. $query9 = "SELECT COUNT(`topicid`) FROM `forum_gelezen` WHERE `lidid`='".$_COOKIE['id']."' && `catid`='".$fetch3['id']."'";
  63. $result9 = mysql_query($query9) or die(mysql_error());
  64. $m_result9 = mysql_result($result9,0);
  65.  
  66. //Tel de topics
  67. $query7 = "SELECT COUNT(`id`) FROM `forum_topics` WHERE `catid`='".$fetch3['id']."'";
  68. $result7 = mysql_query($query7) or die(mysql_error());
  69. $m_result7 = mysql_result($result7,0);
  70.  
  71. //Tel de berichten, dit moet in een join omdat anders de catid van de post niet bepaald kan worden
  72. $query8 = "SELECT COUNT(b.id) FROM forum_berichten b LEFT JOIN forum_topics t ON(b.topicid = t.id) WHERE t.catid='".$fetch3['id']."'";
  73. $result8 = mysql_query($query8) or die(mysql_error());
  74. $m_result8 = mysql_result($result8,0);
  75.  
  76. //De posts bij de reacties optellen om alles te vinden
  77. $tel_posts = $m_result7 + $m_result8;
  78. $freeres8 = mysql_free_result($result8);
  79.  
  80. $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='' />";
  81.  
  82. echo "<table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_lrb'>
  83. <tr>
  84. <td width='10%' valign='middle'>
  85. ".$bij."
  86. </td>
  87. <td width='70%' valign='top'>
  88. <a href='categorie.php?id=".$fetch3['id']."'>- ".$fetch3['naam']."</a><br />
  89. <div class='klein'>".$fetch3['beschrijving']."</div>
  90. </td>
  91. <td width='10%' valign='top'>
  92. ".$m_result7."
  93. </td>
  94. <td width='10%' valign='top'>
  95. ".$tel_posts."
  96. </td>
  97. </tr>";
  98.  
  99. $freeres7 = mysql_free_result($result7);
  100.  
  101. }
  102.  
  103. echo "</table><br />";
  104. $freeres3 = mysql_free_result($result3);
  105. }
  106.  
  107. $freeres2 = mysql_free_result($result2);
  108.  
  109. $query4 = "SELECT COUNT(`id`) FROM `forum_topics`";
  110. $result4 = mysql_query($query4) or die(mysql_error());
  111. $m_result4 = mysql_result($result4,0);
  112.  
  113. $query5 = "SELECT COUNT(`id`) FROM `forum_berichten`";
  114. $result5 = mysql_query($query5) or die(mysql_error());
  115. $m_result5 = mysql_result($result5,0);
  116.  
  117.  
  118. if(empty($fetch['groepen']) || $fetch['groepen'] == 0)
  119. {
  120. $query6 = "SELECT COUNT(`id`) FROM `forum_cat2` WHERE `soort`!='2'";
  121. $result6 = mysql_query($query6) or die(mysql_error());
  122. $m_result6 = mysql_result($result6,0);
  123. }
  124. else
  125. {
  126. $query6 = "SELECT COUNT(`id`) FROM `forum_cat2`";
  127. $result6 = mysql_query($query6) or die(mysql_error());
  128. $m_result6 = mysql_result($result6,0);
  129. }
  130.  
  131. echo "<table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_tblr'>
  132. <tr>
  133. <td valign='top' width='100%' style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart'>
  134. Opties
  135. </td>
  136. </tr>
  137. <tr>
  138. <td valign='top' width='100%' class='stijl_t'>
  139. <a href='?action=mark'>- Markeer alle categorieën als gelezen</a>
  140. </td>
  141. </tr>
  142. </table><br />
  143.  
  144. <table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_tblr'>
  145. <tr>
  146. <td valign='top' width='100%' style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart'>
  147. Forum statistieken
  148. </td>
  149. </tr>
  150. <tr>
  151. <td valign='top' width='100%' class='stijl_t'>
  152. Er zijn ".$m_result6." categorieën.<br />
  153. Er zijn ".$m_result4." topics.<br />
  154. Er zijn ".$m_result5." reacties.<br />
  155. </td>
  156. </tr>
  157. </table><br />";
  158.  
  159. $freeres4 = mysql_free_result($result4);
  160. $freeres5 = mysql_free_result($result5);
  161. $freeres6 = mysql_free_result($result6);
  162. ?>


Kan je dat ongelezen/gelezen gedoe dan ook eens verbeteren, want ik weet geen andere manier.
Offline haytjes - 05/02/2006 21:38
Avatar van haytjes Gouden medailleGouden medaille

JS gevorderde
'k zal een keer kijken, maar dit gaat niet in 1,2,3 gaan, hoor.

heb je ook een voorbeeldje, ofzo online staan, zodat ik precies weet wat de code doet...
Offline Voldemort - 05/02/2006 21:42 (laatste wijziging 05/02/2006 21:42)
Avatar van Voldemort PHP ver gevorderde 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)?
Offline haytjes - 05/02/2006 21:48 (laatste wijziging 05/02/2006 21:57)
Avatar van haytjes Gouden medailleGouden medaille

JS gevorderde
1 iets dat ik nu al zie:
  1. Er zijn ".$m_result6." categorieën.<br />
  2. Er zijn ".$m_result4." topics.<br />
  3. Er zijn ".$m_result5." reacties.<br />


ik zou dat helemaal anders doen:
- nieuwe database maken:
Citaat:
CREATE TABLE `forum_aantal` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(250) NOT NULL default '',
`aantal` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
);
INSERT INTO `forum_aantal` VALUES (1, 'categorieën', 0);
INSERT INTO `forum_aantal` VALUES (2, 'topics' 0);
INSERT INTO `forum_aantal` VALUES (3, 'reacties' 0);

- dan vanaf dat je daardan iets verander:
Citaat:
UPDATE `forum_aantal`SET aantal = aantal+1 WHERE name= "reacties";


[edit]
en zoals ik het nu zie, zou ik dat bij alle categoriën doen:
Citaat:
CREATE TABLE `forum_aantal` (
`id` int(10) unsigned NOT NULL auto_increment,
`cat` varchar(250) NOT NULL default '',
`posts` int(10) unsigned NOT NULL default '0',
`topics` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
);

en dan voor die laatste ze wel optellen;-)
Offline nemesiskoen - 05/02/2006 21:53
Avatar van nemesiskoen Gouden medaille

PHP expert
En wat duidelijkere variabel namen werkt soms ook wel;)

  1. <?php
  2. if(isset($_GET['action']) && $_GET['action'] == "mark")
  3. {
  4. $query2 = "DELETE FROM forum_gelezen WHERE lidid= ".$_COOKIE['id'];
  5. $result2 = mysql_query($query2) or die("Query 2: ".mysql_error());
  6. $freeres2 = mysql_free_result($result2);
  7.  
  8. $query3 = "SELECT id, catid FROM forum_topics";
  9. $result3 = mysql_query($query3) or die("Query 3: ".mysql_error());
  10.  
  11. while($fetch3 = mysql_fetch_array($result3))
  12. {
  13. $query4 = "INSERT INTO forum_gelezen
  14. VALUES('".$_COOKIE['id']."', '".$fetch3['catid']."', '".$fetch3['id']."')";
  15. $result4 = mysql_query($query4) or die("Query 4: ".mysql_error());
  16. $freeres4 = mysql_free_result($result4);
  17. }
  18.  
  19. $freeres3 = mysql_free_result($result3);
  20.  
  21. exit(header("Location: index.php"));
  22. }
  23.  
  24. //Haal de hoofdcategorieën uit de DB
  25. $query2 = "SELECT * FROM forum_cat1";
  26. $result2 = mysql_query($query2) or die(mysql_error());
  27.  
  28. //Fetchen in de while
  29. while($fetch2 = mysql_fetch_array($result2))
  30. {
  31. if(empty($fetch['groepen']) || $fetch['groepen'] == 0)
  32. {
  33. //Haal de subcategorieën uit de DB
  34. $query3 = "SELECT id, naam, beschrijving FROM forum_cat2 WHERE cat1= ".$fetch2['id']." AND soort!=2";
  35. $result3 = mysql_query($query3) or die(mysql_error());
  36. }
  37. else
  38. {
  39. //Haal de subcategorieën uit de DB
  40. $query3 = "SELECT id, naam, beschrijving FROM forum_cat2 WHERE cat1='".$fetch2['id']."'";
  41. $result3 = mysql_query($query3) or die(mysql_error());
  42. }
  43.  
  44. //Geef het begin van de tabel weer
  45. ?><table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_tblr'>
  46. <tr>
  47. <td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='80%'>
  48. <?php echo $fetch2['naam']; ?>
  49. </td>
  50. <td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='10%'>
  51. Topics
  52. </td>
  53. <td style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart' width='10%'>
  54. Posts
  55. </td>
  56. </tr>
  57. </table><?php
  58.  
  59. //In de while
  60. while($fetch3 = mysql_fetch_array($result3))
  61. {
  62. $query9 = "SELECT COUNT(topicid) FROM forum_gelezen WHERE lidid=".$_COOKIE['id']." && catid=".$fetch3['id'];
  63. $result9 = mysql_query($query9) or die(mysql_error());
  64. $m_result9 = mysql_result($result9,0);
  65.  
  66. //Tel de topics
  67. $query7 = "SELECT COUNT(id) FROM forum_topics WHERE catid=".$fetch3['id'];
  68. $result7 = mysql_query($query7) or die(mysql_error());
  69. $m_result7 = mysql_result($result7,0);
  70.  
  71. //Tel de berichten, dit moet in een join omdat anders de catid van de post niet bepaald kan worden
  72. $query8 = "SELECT COUNT(b.id) FROM forum_berichten b LEFT JOIN forum_topics t ON(b.topicid = t.id) WHERE t.catid='".$fetch3['id']."'";
  73. $result8 = mysql_query($query8) or die(mysql_error());
  74. $m_result8 = mysql_result($result8,0);
  75.  
  76. //De posts bij de reacties optellen om alles te vinden
  77. $tel_posts = $m_result7 + $m_result8;
  78.  
  79. $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='' />";
  80.  
  81. ?><table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_lrb'>
  82. <tr>
  83. <td width='10%' valign='middle'>
  84. <?php echo $bij; ?>
  85. </td>
  86. <td width='70%' valign='top'>
  87. <a href='categorie.php?id=".$fetch3['id']."'>- ".$fetch3['naam']."</a><br />
  88. <div class='klein'><?php echo $fetch3['beschrijving']; ?></div>
  89. </td>
  90. <td width='10%' valign='top'>
  91. <?php echo $m_result7; ?>
  92. </td>
  93. <td width='10%' valign='top'>
  94. <?php echo $tel_posts; ?>
  95. </td>
  96. </tr><?php
  97.  
  98. }
  99.  
  100. ?></table><br /><?php
  101. $freeres3 = mysql_free_result($result3);
  102. }
  103.  
  104. $freeres2 = mysql_free_result($result2);
  105.  
  106. $query4 = "SELECT COUNT(id) FROM forum_topics";
  107. $result4 = mysql_query($query4) or die(mysql_error());
  108. $m_result4 = mysql_result($result4,0);
  109.  
  110. $query5 = "SELECT COUNT(id) FROM forum_berichten";
  111. $result5 = mysql_query($query5) or die(mysql_error());
  112. $m_result5 = mysql_result($result5,0);
  113.  
  114.  
  115. if(empty($fetch['groepen']) || $fetch['groepen'] == 0)
  116. {
  117. $query6 = "SELECT COUNT(id) FROM forum_cat2 WHERE soort!='2'";
  118. $result6 = mysql_query($query6) or die(mysql_error());
  119. $m_result6 = mysql_result($result6,0);
  120. }
  121. else
  122. {
  123. $query6 = "SELECT COUNT(id) FROM forum_cat2";
  124. $result6 = mysql_query($query6) or die(mysql_error());
  125. $m_result6 = mysql_result($result6,0);
  126. }
  127.  
  128. ?><table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_tblr'>
  129. <tr>
  130. <td valign='top' width='100%' style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart'>
  131. Opties
  132. </td>
  133. </tr>
  134. <tr>
  135. <td valign='top' width='100%' class='stijl_t'>
  136. <a href='?action=mark'>- Markeer alle categorieën als gelezen</a>
  137. </td>
  138. </tr>
  139. </table><br />
  140.  
  141. <table cellspacing='0' cellpadding='1' align='center' width='96%' border='0' class='stijl_tblr'>
  142. <tr>
  143. <td valign='top' width='100%' style=\"background-image:url('../../images/menukopjes.gif')\" class='zwart'>
  144. Forum statistieken
  145. </td>
  146. </tr>
  147. <tr>
  148. <td valign='top' width='100%' class='stijl_t'>
  149. Er zijn <?php echo $m_result6; ?> categorieën.<br />
  150. Er zijn <?php echo $m_result4; ?> topics.<br />
  151. Er zijn <?php echo $m_result5; ?> reacties.<br />
  152. </td>
  153. </tr>
  154. </table><br />
Offline Voldemort - 07/02/2006 20:02
Avatar van Voldemort PHP ver gevorderde 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.
Offline haytjes - 07/02/2006 20:52 (laatste wijziging 07/02/2006 20:55)
Avatar van haytjes Gouden medailleGouden medaille

JS gevorderde
'k heb nog een keer gekeken en i.v.m. dat ik de vorige keer al een inschattingsfout heb gemaakt, zou ik willen dat je het volgende doe:

  1. <?php
  2. # Exectime start...
  3. $exectime_start = array_sum(explode(' ', microtime()));
  4.  
  5. # Show exectime...
  6. echo '<script>window.status = "This part created in: '.round(array_sum(explode(' ', microtime())) - $exectime_start, 4).' seconds";</script>';
  7. ?>


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 ...
Offline Thomas - 08/02/2006 11:25 (laatste wijziging 08/02/2006 11:27)
Avatar van Thomas 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...
Offline Voldemort - 08/02/2006 14:58
Avatar van Voldemort PHP ver gevorderde 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).

Nog dingen bevindingen nodig?
Offline haytjes - 08/02/2006 21:08
Avatar van haytjes Gouden medailleGouden medaille

JS gevorderde
dus je bedoeld dat dit het langst duurt?
  1. if(isset($_GET['action']) && $_GET['action'] == "mark")
  2. {
  3. $query2 = "DELETE FROM `forum_gelezen` WHERE `lidid`='".$_COOKIE['id']."'";
  4. $result2 = mysql_query($query2) or die("Query 2: ".mysql_error());
  5. mysql_free_result($result2);
  6.  
  7. $query3 = "SELECT `id`, `catid` FROM `forum_topics`";
  8. $result3 = mysql_query($query3) or die("Query 3: ".mysql_error());
  9.  
  10. while($fetch3 = mysql_fetch_array($result3))
  11. {
  12. $query4 = "INSERT INTO `forum_gelezen`
  13. VALUES('".$_COOKIE['id']."', '".$fetch3['catid']."', '".$fetch3['id']."')";
  14. $result4 = mysql_query($query4) or die("Query 4: ".mysql_error());
  15. $freeres4 = mysql_free_result($result4);
  16. }
  17.  
  18. mysql_free_result($result3);
  19.  
  20. exit(header("Location: index.php"));
  21. }


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.
Offline Voldemort - 09/02/2006 16:56 (laatste wijziging 09/02/2006 16:57)
Avatar van Voldemort PHP ver gevorderde Ik denk het, maar het is een while in een while, dus echt specifiek is het niet. Zeker niet omdat de while 5 keer herhaalt wordt en de code dus ook.

Wrm het zo lang duurt, daar probeer ik hier achter te komen .
Offline Thomas - 09/02/2006 18:10
Avatar van Thomas Moderator * 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.
Offline Voldemort - 09/02/2006 20:03
Avatar van Voldemort PHP ver gevorderde FULLTEXT moet wel vanwege een zoekfunctie.

Ik zal kijken naar dat categorie-id doen zodat het niet te veel aan elkaar hangt.
Offline kokx - 09/02/2006 20:38 (laatste wijziging 09/02/2006 20:43)
Avatar van kokx Onbekend Om meer loadtime te besparen kun je ipv iedere keer dezelfde query's te draaien ook delen includen. zo:
  1. <?php
  2. //zet dit in een update pagina
  3. function forum_berichten($text, $id){ //hier evt. meer veldnamen
  4. $file = "<tr><td>";//begin een nieuw veld
  5. $file .= "<a href=\"topic.php?id=". $id ."\">". $text ."</a>";
  6. $file .= "</td></tr>";
  7. $fp = fopen("a", "nieuwe_berichten.htm");
  8. fwrite($fp, $file);
  9. fclose($fp);
  10. }
  11. ?>


  1. <?php
  2. //dit is dan een deel van je index
  3. include("nieuwe_berichten.htm"); //dit doe je op de plaats van je tabel
  4. ?>

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.
Offline Thomas - 10/02/2006 15:32
Avatar van Thomas Moderator *zucht*

> CREATE INDEX
> JOIN SYNTAX (hoe je INDEXen moet gebruiken)
Offline Voldemort - 10/02/2006 17:00
Avatar van Voldemort PHP ver gevorderde @FangorN: Ik snap nooit wat van Engelse site's. Kan je even een link naar een NL site zetten over indexeren?

@kokx: Snap ik niet.

@FangorN 2e vorige bericht: Die catergorie-id, waar zouden die soms moeten?
Offline kokx - 10/02/2006 17:19 (laatste wijziging 10/02/2006 17:21)
Avatar van kokx Onbekend @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:
  1. <table>
  2. <tr>
  3. <td>head van tabel (bijv. actieve forumberichten)</td>
  4. </tr>
  5. <?php
  6. include("nieuwe_berichten.htm");//hier include je de inhoud van de tabel.
  7. ?>
  8. </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.
Offline Voldemort - 10/02/2006 17:49 (laatste wijziging 10/02/2006 20:29)
Avatar van Voldemort PHP ver gevorderde @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?
Offline haytjes - 11/02/2006 00:53 (laatste wijziging 11/02/2006 00:58)
Avatar van haytjes Gouden medailleGouden medaille

JS gevorderde
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? ...
Offline kokx - 11/02/2006 09:36
Avatar van kokx Onbekend @voldemort: Is 1 van de mogelijkheden. Je kunt het ook uitvoeren bij het toevoegen van een topic of forum etc.
Offline Voldemort - 11/02/2006 10:10
Avatar van Voldemort PHP ver gevorderde 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 ;).
Offline kokx - 11/02/2006 22:17
Avatar van kokx Onbekend @Voldemort: hier een tut over dat wat ik bedoelde: http://www.site...amp;id=255
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2025 Sitemasters.be - Regels - Laadtijd: 0.339s