2016-02-07 2 views
0

Я новичок в кодировании php и кодирую веб-сайт (с форумами), чтобы узнать.сообщений на форуме показ по загрузке медленно

В настоящее время у меня есть одна динамическая страница, которая обрабатывает все аспекты форума, отображая темы, все форумы, а затем каждое сообщение.

Все эти темы/форумы и сообщения хранятся в mySQL и доступны по мере необходимости.

первых двух разделов (Показать все темы и отобразить все форумы) загружается отлично, но когда мы добираемся до третьего раздела (Показать все сообщения для форума), загрузка происходит очень медленно. Моя тестовая страница содержит только 16 сообщений, и очень мало текста, однако требуется, чтобы загрузить.

У меня есть подкачка, поэтому каждая страница содержит только 25 сообщений, однако она медленна на 16 с небольшим текстом, так что трудно имитировать 25 сообщений с множеством текстов/изображений.

Спасибо за любую помощь и предложения заранее :).

Вот сниженный код на странице форума (только с указанием необходимых деталей):

<?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); 

В forumsData.php я получить доступ к базе данных и поместить данные в массивы в зависимости от TopicID и forumID. например:

$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 ... что вы делаете при каждом вызове следующих функций: 'check_topic_exists()', 'get_topic_name()', 'login_check()', 'permission_check()' и т. Д. (Для всех них требуется '$ mysqli')? заключается в том, что функции получают данные непосредственно из mysql каждый раз? – Wizard

+0

Он не решает вашу проблему, но является 'ORDER BY WHERE topicidcol ...' в вашем 2-м блоке кода действующим SQL или просто опечаткой? – PerlDuck

+0

уверен? .. mysql не так быстро, для частых запросов (может быть, этого достаточно для этого примера из-за внутреннего кеша) .. но это плохая идея, вам нужно настроить флаги (и любые другие данные) перед выходом. – Wizard

ответ

2

Вопрос частично решен путем проверки прав доступа один раз вне цикла, вот часть кода:

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

Загружает почти мгновенно сейчас; Спасибо. Будут следить за любыми функциями внутри петель на остальной части веб-сайта. – Matt

+0

yep) .. если вы хотите одновременно поддерживать соединения 5-6k - вам нужно оптимизировать каждую часть веб-приложения, в худшем случае даже кэши, такие как memcache/redis, не могут помочь, но 95% случаев будут значительно ускорение с кешем. – Wizard

+0

oh .. this '$ hasPrivileges = (permission_check ($ mysqli) == 2 || permission_check ($ mysqli) == 3);' может быть изменено на '$ hasPrivileges = in_array (permission_check ($ mysqli), array (2) , 3)); ' – Wizard

0

Используйте microtime(true), чтобы получить некоторые моменты времени. Определите, какая из них является проблемой: (1) SELECT (mysqli_query звонок), (2) перемещение по строкам, (3) создание страницы или (4) материал в другом месте.

Если это SELECT, то вам, возможно, потребуется этот композитный индекс (в любом порядке):

INDEX(topicidcol, forumidcol) 

Кроме того, вы должны лавировать на и ORDER BY и LIMIT 25, даже если есть только 16 (с вы не знаете, что их всего 16).

25 строк не должно быть проблемой. 100-я страница из 25 сообщений будет проблемой, но вы вернетесь позже, чтобы спросить, почему.