Sonik_Blast Публикувано Март 7, 2007 Report Share Публикувано Март 7, 2007 Всички започваме от малки форумчета, продължаваме да ги развиваме докато в един момент не се окаже, че форума е станал голям - пораснал с много бръмчащи и жужащи пчелички (потребители) в него и когато това стане се получава голямо натоварване и кошера (базата данни и форума) се препълва особено на крехки дръвчета (сървър). Всичко това води до забавяне на отварането на страницата ви. В тази тема ще предложа няколко начина на тунинговане, които да помогнат на големите ви форуми. - Index page По подразбиране phpBB събира информация за всички нови теми след последното ви влизане. Когато форума ви има околу 50 000 нови теми на ден тази процедура отнема околу 10 секунди и повече. За да се справим с проблема намираме следния код:if ( $userdata['session_logged_in'] ) { $sql = "SELECT t.forum_id, t.topic_id, p.post_time FROM " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p WHERE p.post_id = t.topic_last_post_id AND p.post_time > " . $userdata['user_lastvisit'] . " AND t.topic_moved_id = 0"; if ( !($result = $db->sql_query($sql)) ) { message_die(GENERAL_ERROR, 'Could not query new topic information', '', __LINE__, __FILE__, $sql); } $new_topic_data = array(); while( $topic_data = $db->sql_fetchrow($result) ) { $new_topic_data[$topic_data['forum_id']][$topic_data['topic_id']] = $topic_data['post_time']; } }И го заменяме с този:$sql = "SELECT f.*, p.post_time, p.post_username, u.username, u.user_id FROM (( " . FORUMS_TABLE . " f LEFT JOIN " . POSTS_TABLE . " p ON p.post_id = f.forum_last_post_id ) LEFT JOIN " . USERS_TABLE . " u ON u.user_id = p.poster_id ) ORDER BY f.cat_id, f.forum_order"; if ( !($result = $db->sql_query($sql)) ) { message_die(GENERAL_ERROR, 'Could not query forums information', '', __LINE__, __FILE__, $sql); } $forum_data = array(); while( $row = $db->sql_fetchrow($result) ) { $forum_data[] = $row; if ($row['post_time'] > $userdata['user_lastvisit']) $new_topic_data[$row['forum_id']][$row['topic_id']] = $row['post_time']; } - Users Online Индекса на форума също така сканира за потребителите и сесиите в него, което при 1000 активни потребители води до сериозно забавяне. За да се справим с проблема намираме следния код:$user_forum_sql = ( !empty($forum_id) ) ? " WHERE session_page = " . intval($forum_id) : ''; $sql = "SELECT u.username, u.user_id, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_ip FROM ".USERS_TABLE." u, ".SESSIONS_TABLE." s WHERE u.user_id = s.session_user_id AND s.session_time >= ".( $board_config['time_now'] - 300 ) . " $user_forum_sql ORDER BY u.username ASC, s.session_ip ASC";и го заместваме с:$user_forum_sql = ( !empty($forum_id) ) ? " WHERE session_page = " . intval($forum_id) : ''; $sql = "SELECT * FROM " . $session_table_name . $user_forum_sql; - Viewtopic.php За да отпуснем системата от огромно количество заявки правим следното просто трикче, намираме този код:$sql = "SELECT u.username, u.user_id, u.user_posts, u.user_from, u.user_website, u.user_email, u.user_icq, u.user_aim, u.user_yim, u.user_regdate, u.user_msnm, u.user_viewemail, u.user_rank, u.user_sig, u.user_sig_bbcode_uid, u.user_avatar, u.user_session_time, u.user_allow_viewonline, u.user_allowsmile, p.*, pt.post_text, pt.post_subject, pt.bbcode_uid FROM " . POSTS_TABLE . " p, " . USERS_TABLE . " u, " . POSTS_TEXT_TABLE . " pt WHERE p.post_id in p.topic_id = $topic_id $limit_posts_time AND pt.post_id = p.post_id AND u.user_id = p.poster_id ORDER BY p.post_time $post_time_order LIMIT $start, ".$board_config['posts_per_page'];и го заместваме с:$p_array = array(); $sql = "SELECT p.post_id FROM " . POSTS_TABLE . " p WHERE p.topic_id = $topic_id $limit_posts_time LIMIT $start, " . $board_config['posts_per_page']; if ( !($result = $db->sql_query($sql)) ) { message_die(GENERAL_ERROR, "Could not obtain post index information.", '', __LINE__, __FILE__, $sql); } while (list($p_id) = $db->sql_fetchrow($result)) { $p_array[] = $p_id; } $post_index = implode(",",$p_array); Надявам се да съм ви бил полезен!Автор Sonik_Blast by webleit.com Цитирай Link to comment Сподели другаде More sharing options...
Препоръчан пост