Jump to content

Phpbb 2.x - Тунинговане на големи форуми


Препоръчан пост

Всички започваме от малки форумчета, продължаваме да ги развиваме докато в един момент не се окаже, че форума е станал голям - пораснал с много бръмчащи и жужащи пчелички (потребители) в него и когато това стане се получава голямо натоварване и кошера (базата данни и форума) се препълва особено на крехки дръвчета (сървър). Всичко това води до забавяне на отварането на страницата ви. В тази тема ще предложа няколко начина на тунинговане, които да помогнат на големите ви форуми.

 

- 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
Сподели другаде

Гост
Отговори на тази тема

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   Не можете да качите директно снимка. Качете или добавете изображението от линк (URL)

Loading...
×
×
  • Създай ново...