2016-02-07 3 views
0

Je suis nouveau au codage php et je suis en train de coder un site web (avec des forums) pour apprendre.messages du forum affichage chargement lent

Actuellement, j'ai une page dynamique qui gère tous les aspects du forum d'affichage des sujets, tous les forums, puis chaque message lui-même.

Chacun de ces sujets/forums et messages sont conservés dans mySQL et sont accessibles en cas de besoin.

les deux premières sections (Voir tous les sujets et Afficher tous les forums) charges parfaitement bien cependant lorsque nous arrivons à la troisième section (Afficher tous les messages du forum) le chargement est très lent. Ma page de test a seulement 16 messages et très peu de texte prend du temps à charger.

J'ai pagination de sorte que chaque page ne contient que 25 messages, mais il est lent à 16 avec peu de texte si difficile à l'image de 25 messages avec beaucoup de textes/images.

Merci pour toute aide et suggestions à l'avance :).

Voici un code réduit de la page des forums (Afficher uniquement les pièces nécessaires):

<?php 
$topicID = $_GET['topicID']; 
$forumID = $_GET['forumID']; 
include_once '../includes/forumsData.php'; 

sec_session_start(); 

$username = $_SESSION['username']; 
include_once 'header.php'; 
include_once 'navbar.php'; 
?> 
     <div class="bg">   
      <!-- Body --> 
      <div class='body'> 
       <div class="forum-title">Forums</div> 
<?php  
       // No topic chosen 
       // Display all topics 
       if(!isset($topicID)) { 
        for ($x = 0; $x < count($headers); $x++) { 
          echo '<div class="forum-header">' . $headers[$x][0] . '</div>'; 
         for ($z = 0; $z < count($topics); $z++) { 
          if($topics[$z][6] == $headers[$x][1]) { 
           echo '<div class="forums"> 
             <div class="topics"> 
              <a href="?topicID=' . $topics[$z][7] . '">' . $topics[$z][0] . '</a></font> 
              <br> 
              ' . $topics[$z][1] . ' 
             </div>'; 
             if ($topics[$z][3] == ""){ 
              echo '<div class="info">No new Posts</div>'; 
             } 
             else { 
             echo '<div class="info"><a href = "../profile/?profile=' . $topics[$z][4] . '"><img src="../images/profileA/' . $topics[$z][2] . '" height="45" width="45" /></a><p><a href="?topicID=' . $topics[$z][7] . '&forumID=' . $topics[$z][8] . '">' . $topics[$z][3] . '</a><br><a href="../profile/?profile=' . $topics[$z][4] . '">' . $topics[$z][4] . '</a> - ' . get_date_diff($mysqli, $topics[$z][5]) . '</p></div>'; 
             } 
            echo '</div>'; 
          } 
         } 
        } 
       } 

       // Topic has been chosen 
       // Display all the forum posts 

       if(isset($topicID) && check_topic_exists($mysqli, $topicID) && empty($forumID)) { 
        echo '<br><a href="./">Forums</a> > <a href="./?topicID='. $topicID . '">' . get_topic_name($mysqli, $topicID) . '</a><br><br> 

        <a href="posting.php?topicID='. $topicID . '&mode=post">Create New Topic</a><br>'; 

        echo '<div class="forum-topicHeader">Topic</div> 
         <div class="forum-repliesHeader">Replies</div> 
         <div class="forum-lpHeader">Latest post</div>'; 

        if (count($forums) > 0) { 
         for ($x = 0; $x < count($forums); $x++) { 
          $replies = $forums[$x][6] -1; 
          echo ' 
          <div class="forums"> 
           <div class="topics"> 
            <a href="?topicID=' . $topicID . '&forumID=' . $forums[$x][0] . '">' . $forums[$x][2] . '</a><br><a href="../profile/?profile=' . $forums[$x][4] . '">' . $forums[$x][4] . '</a></td> 
           </div> 
           <div class="replies"> 
            ' . $replies . ' 
           </div> 
           <div class="info"> 
            <a href="../profile/?profile=' . get_latest_user_reply($mysqli, $topicID, $forums[$x][0]) . '">' . get_latest_user_reply($mysqli, $topicID, $forums[$x][0]) . '</a><br> ' . get_date_diff($mysqli, $forums[$x][5]) . ' 
           </div> 
          </div>'; 
         } 
        } 
       } 

       // Topic has been chosen 
       // Forum has been chosen 
       // Display all posts for the forum 

       if(isset($topicID) && check_topic_exists($mysqli, $topicID) && isset($forumID)) { 
        require '../BBCode/BBCodeParser.php'; 
        $bbcode = new Golonka\BBCode\BBCodeParser; 

        echo '<br><a href="./">Forums</a> > <a href="./?topicID='. $topicID . '">' . get_topic_name($mysqli, $topicID) . '</a> > <a href="./?topicID='. $topicID . '&forumID=' . $forumID . '">' . get_forum_name($mysqli, $topicID, $forumID) . '</a>'; 
        echo '<br><br> 
        <a href="posting.php?topicID='. $topicID . '&forumID=' . $forumID . '&mode=post">Post New Reply</a> 
        <div class="post-title ">' . get_forum_name($mysqli, $topicID, $forumID) . '</div><br>'; 
        if (count($posts) > 0) { 
         for ($x = 0; $x < count($posts); $x++) { 
          echo ' 
          <div class="post-header">' . $posts[$x][3] . '<text style="float:right">#' . ($x+1) . '</text></div> 
          <div class="post"> 
           <div class="post-user ">'; 
           if(login_check($mysqli) && (permission_check($mysqli) == 2 || permission_check($mysqli) == 3 || $username == $posts[$x][5])) { 
            echo '<a href="posting.php?topicID='. $topicID . '&forumID=' . $forumID . '&postID=' . $posts[$x][1] . '&mode=edit">Edit</a><br>'; 
           } 
           echo '<a href="../profile/?profile="' . $posts[$x][5] . '">' . $posts[$x][5] . '</a> 
           <br> 
           <a href="#">Add img here soon</a> 
           <br> 
           Other user infos? 
           </div> 
           <div class="post-text">' . $bbcode->parse($posts[$x][4]) . '</div> 
          </div><br>'; 
         } 
        } 
        echo '<a href="posting.php?topicID='. $topicID . '&forumID=' . $forumID . '&mode=post">Post New Reply</a><br><br>'; 
       } 

       // If we have selected a topic that doesn't exist 
       if(!empty($topicID) && !check_topic_exists($mysqli, $topicID)) 
       { 
        include_once 'topicnotfound.php'; 
       } 
?> 
      </div> 
     </div> 
    </body> 
</html> 

<?php 
mysqli_close($mysqli); 

Dans le forumsData.php j'accéder à la base de données et mettre les données dans des tableaux en fonction de la TopicID et ForumID. par exemple:

$nquery = 'SELECT * FROM tableexample WHERE topicidcol = ' . $topicID . ' AND forumidcol = ' . $forumID; 
    $ndata = mysqli_query($mysqli, $nquery); 
    while($row = mysqli_fetch_array($ndata)) 
    { 
     // insert date into array 
     $myarray[$z] = array($row['datacol1'], $row['datacol2']); 
     $z++ 
    } 
+0

mmm ... que faites-vous tous les appels des fonctions suivantes: 'check_topic_exists()', 'get_topic_name()', 'login_check()', 'permission_check()' et etc (tous nécessitent '$ mysqli')? est-ce que les fonctions obtiennent des données directement à partir de mysql à chaque fois? – Wizard

+0

Il ne résout pas votre problème, mais est 'ORDER BY WHERE topicidcol ...' dans votre 2ème bloc de code valide SQL ou juste une faute de frappe? – PerlDuck

+0

sûr? .. mysql n'est pas si rapide, pour des requêtes fréquentes (peut-être cela suffit pour cet exemple en raison d'un cache interne) .. mais c'est une mauvaise idée, vous devez paramétrer des flags (et d'autres données) avant la sortie. – Wizard

Répondre

2

Question partiellement résolu par la vérification des autorisations une fois en dehors de la boucle, voici la partie du code:

  // Topic has been chosen 
      // Forum has been chosen 
      // Display all posts for the forum 

      if(isset($topicID) && check_topic_exists($mysqli, $topicID) && isset($forumID)) { 
       require '../BBCode/BBCodeParser.php'; 
       $bbcode = new Golonka\BBCode\BBCodeParser; 

       echo '<br><a href="./">Forums</a> > <a href="./?topicID='. $topicID . '">' . get_topic_name($mysqli, $topicID) . '</a> > <a href="./?topicID='. $topicID . '&forumID=' . $forumID . '">' . get_forum_name($mysqli, $topicID, $forumID) . '</a>'; 
       echo '<br><br> 
       <a href="posting.php?topicID='. $topicID . '&forumID=' . $forumID . '&mode=post">Post New Reply</a> 
       <div class="post-title ">' . get_forum_name($mysqli, $topicID, $forumID) . '</div><br>'; 
       if (count($posts) > 0) { 


        // checking user login & privileges 
        $isLogged = login_check($mysqli); 
        $hasPrivileges = (permission_check($mysqli) == 2 || permission_check($mysqli) == 3); 


        for ($x = 0; $x < count($posts); $x++) { 
         echo ' 
         <div class="post-header">' . $posts[$x][3] . '<text style="float:right">#' . ($x+1) . '</text></div> 
         <div class="post"> 
          <div class="post-user ">'; 

          // changed condition, avoiding frequent mysql request 
          if($isLogged && ($hasPrivileges || $username == $posts[$x][5])) { 


           echo '<a href="posting.php?topicID='. $topicID . '&forumID=' . $forumID . '&postID=' . $posts[$x][1] . '&mode=edit">Edit</a><br>'; 
          } 
          echo '<a href="../profile/?profile="' . $posts[$x][5] . '">' . $posts[$x][5] . '</a> 
          <br> 
          <a href="#">Add img here soon</a> 
          <br> 
          Other user infos? 
          </div> 
          <div class="post-text">' . $bbcode->parse($posts[$x][4]) . '</div> 
         </div><br>'; 
        } 
       } 
       echo '<a href="posting.php?topicID='. $topicID . '&forumID=' . $forumID . '&mode=post">Post New Reply</a><br><br>'; 
      } 
+0

Charge presque instantanément maintenant; Je vous remercie. Gardera un œil sur d'autres fonctions à l'intérieur des boucles dans le reste du site. – Matt

+0

yep) ..si vous voulez tenir 5-6k connexions en même temps - vous devez optimiser chaque partie de l'application web, dans le pire des cas, même les caches comme memcache/redis ne peuvent pas aider, mais 95% des cas vont considérablement accélérer avec cache. – Wizard

+0

oh .. this '$ hasPrivileges = (permission_check ($ mysqli) == 2 || permission_check ($ mysqli) == 3);' peut être changé en $ hasPrivileges = in_array (permission_check ($ mysqli), array (2 , 3)); ' – Wizard

0

Utilisez microtime(true) pour obtenir des timings. Déterminez lequel est le problème: (1) SELECT (mysqli_query appel), (2) en boucle à travers les lignes, (3) la construction de la page, ou (4) choses ailleurs.

Si c'est le SELECT, alors vous devez peut-être cet indice composite (soit dans l'ordre):

INDEX(topicidcol, forumidcol) 

En outre, vous devriez virer de bord sur et ORDER BY et un LIMIT 25, même s'il n'y a que 16 (depuis vous ne savez pas qu'il n'y en a que 16).

25 lignes ne devraient pas poser de problème. La 100ème page de 25 messages sera un problème, mais vous reviendrez plus tard pour demander pourquoi.