Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Оптимизация index.php

Проблемы с установкой или работой phpBB 2.0.x? Ищите ответы здесь!
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет
Поблагодарили: 2 раза
Контактная информация:

Оптимизация index.php

Сообщение Xpert »

Некоторый собственный опыт по оптимизации главного файла форума - index.php

Disclaimer: Данная модификация проверена автором и по крайней мере у него она превосходно работает.
Убедительная просьба сообщать результаты вашего тестирования.


С чего начнем? Прежде всего избавимся от двух довольно тяжелых запросов по получению списка модераторов. Что касается самого списка, то встречающаяся мне рекомендация по вводу списка модераторов в описание форума верна лишь частично - имена (групп) модераторов нельзя делать ссылками, так как к ним не применяется стандартная обработка ссылок phpBB.

Итак:

Код: Выделить всё

# 
#-----[ FIND ]------------------------------------------ 
# 

	//
	// Obtain list of moderators of each forum
	// First users, then groups ... broken into two queries
	//

# 
#-----[ BEFORE, ADD ]------------------------------------ 
# 

/*/ 

# 
#-----[ FIND ]------------------------------------------ 
# 

   // 
   // Find which forums are visible for this user 
   // 

# 
#-----[ BEFORE, ADD ]------------------------------------ 
# 

/*/ 

# 
#-----[ FIND ]------------------------------------------ 
# 

'L_MODERATOR' => $lang['Moderators'], 

# 
#-----[ REPLACE WITH ]------------------------------------ 
# 

// 'L_MODERATOR' => $lang['Moderators'], 

# 
#-----[ FIND ]------------------------------------------ 
# 

if ( count($forum_moderators[$forum_id]) > 0 ) 
{ 
   $l_moderators = ( count($forum_moderators[$forum_id]) == 1 ) ? $lang['Moderator'] : $lang['Moderators']; 
   $moderator_list = implode(', ', $forum_moderators[$forum_id]); 
} 
else 
{ 
   $l_moderators = ' '; 
   $moderator_list = ' '; 
} 

# 
#-----[ REPLACE WITH ]------------------------------------ 
# 

/* 
if ( count($forum_moderators[$forum_id]) > 0 ) 
{ 
   $l_moderators = ( count($forum_moderators[$forum_id]) == 1 ) ? $lang['Moderator'] : $lang['Moderators']; 
   $moderator_list = implode(', ', $forum_moderators[$forum_id]); 
} 
else 
{ 
   $l_moderators = ' '; 
   $moderator_list = ' '; 
} 
*/ 

# 
#-----[ FIND ]------------------------------------------ 
# 

'MODERATORS' => $moderator_list, 

# 
#-----[ REPLACE WITH ]------------------------------------ 
# 

// 'MODERATORS' => $moderator_list, 

# 
#-----[ FIND ]------------------------------------------ 
# 

'L_MODERATOR' => $l_moderators, 

# 
#-----[ REPLACE WITH ]------------------------------------ 
# 

// 'L_MODERATOR' => $l_moderators,
Далее стоит несколько пересмотреть код, отвечающий за вывод форумов и категорий. По умолчанию код проверки отображения категорий следующий:

Код: Выделить всё

		//
		// Should we display this category/forum set?
		//
		$display_forums = false;
		for($j = 0; $j < $total_forums; $j++)
		{
			if ( $is_auth_ary[$forum_data[$j]['forum_id']]['auth_view'] && $forum_data[$j]['cat_id'] == $cat_id )
			{
				$display_forums = true;
			}
		}
Что нас в нем не устраивает? Прежде всего то, что он выполняется для каждой категории, то есть в общей сложности c*f раз, где c - число категорий, f - число форумов.

Перед:

Код: Выделить всё

	//
	// Okay, let's build the index
	//
	for($i = 0; $i < $total_categories; $i++)
	{
Добавим:

Код: Выделить всё

	//
	// Let's decide which categories we should display
	//

	$display_categories = array();

	for ($i = 0; $i < $total_categories; $i++ )
	{
		$display_categories[$category_rows[$i]['cat_id']] = FALSE;
	}

	for ($i = 0; $i < $total_forums; $i++ )
	{
		if ( $is_auth_ary[$forum_data[$i]['forum_id']]['auth_view'] )
		{
			$display_categories[$forum_data[$i]['cat_id']] = TRUE;
		}
	}
Далее заменим:

Код: Выделить всё

		//
		// Should we display this category/forum set?
		//
		$display_forums = false;
		for($j = 0; $j < $total_forums; $j++)
		{
			if ( $is_auth_ary[$forum_data[$j]['forum_id']]['auth_view'] && $forum_data[$j]['cat_id'] == $cat_id )
			{
				$display_forums = true;
			}
		}

		//
		// Yes, we should, so first dump out the category
		// title, then, if appropriate the forum list
		//
		if ( $display_forums )
		{
На:

Код: Выделить всё

		//
		// Yes, we should, so first dump out the category
		// title, then, if appropriate the forum list
		//
		if ( $display_categories[$cat_id] )
		{
В результате получаем c+f итераций, что уже гораздо лучше. :) Актульно для форумов с большим количеством разделов и форумов.

Следующий код, который нам предстоит подкорректировать - отображение наличия новых сообщений в форумах. Корректируем.

Найти:

Код: Выделить всё

										$forum_last_post_time = 0;

										while( list($check_topic_id, $check_post_time) = @each($new_topic_data[$forum_id]) )
										{
											if ( empty($tracking_topics[$check_topic_id]) )
											{
												$unread_topics = true;
												$forum_last_post_time = max($check_post_time, $forum_last_post_time);

											}
											else
											{
												if ( $tracking_topics[$check_topic_id] < $check_post_time )
												{
													$unread_topics = true;
													$forum_last_post_time = max($check_post_time, $forum_last_post_time);
												}
											}
										}

										if ( !empty($tracking_forums[$forum_id]) )
										{
											if ( $tracking_forums[$forum_id] > $forum_last_post_time )
											{
												$unread_topics = false;
											}
										}

										if ( isset($HTTP_COOKIE_VARS[$board_config['cookie_name'] . '_f_all']) )
										{
											if ( $HTTP_COOKIE_VARS[$board_config['cookie_name'] . '_f_all'] > $forum_last_post_time )
											{
												$unread_topics = false;
											}
										}
Заменить на:

Код: Выделить всё

										while( list($check_topic_id, $check_post_time) = @each($new_topic_data[$forum_id]) )
										{
											if ( intval($tracking_topics[$check_topic_id]) < $check_post_time )
											{
												$unread_topics = true;
												break;
											}
										}

										if ( !empty($tracking_forums[$forum_id]) )
										{
											if ( $tracking_forums[$forum_id] > $forum_data[$j]['post_time'] )
											{
												$unread_topics = false;
											}
										}

										if ( isset($HTTP_COOKIE_VARS[$board_config['cookie_name'] . '_f_all']) )
										{
											if ( $HTTP_COOKIE_VARS[$board_config['cookie_name'] . '_f_all'] > $forum_data[$j]['post_time'] )
											{
												$unread_topics = false;
											}
										}
Теперь немного побалуемся. :) Наверное, на форуме, перед владельцем которого встает проблема оптимизации, больше одного пользователя и больше одного сообщения. А посему, в самом начале файла...

Найти:

Код: Выделить всё

if( $total_posts == 0 )
{
	$l_total_post_s = $lang['Posted_articles_zero_total'];
}
else if( $total_posts == 1 )
{
	$l_total_post_s = $lang['Posted_article_total'];
}
else
{
	$l_total_post_s = $lang['Posted_articles_total'];
}

if( $total_users == 0 )
{
	$l_total_user_s = $lang['Registered_users_zero_total'];
}
else if( $total_users == 1 )
{
	$l_total_user_s = $lang['Registered_user_total'];
}
else
{
	$l_total_user_s = $lang['Registered_users_total'];
}
Заменить на:

Код: Выделить всё

$l_total_post_s = $lang['Posted_articles_total'];
$l_total_user_s = $lang['Registered_users_total'];
Можно пойти еще дальше и передать языковые переменные в шаблон без промежуточных переменных.

Жду ваших мнений...
Продолжение следует...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет
Поблагодарили: 2 раза
Контактная информация:

Сообщение Xpert »

Небольшое добавление. В стандартном index.php присутствует баг, из-за которого число категорий получается на одну выше реального.

Найти:

Код: Выделить всё

while( $category_rows[] = $db->sql_fetchrow($result) );
Заменить на:

Код: Выделить всё

$category_rows = $db->sql_fetchrowset($result);
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
YarNET
phpBB 2.0.6
Сообщения: 518
Стаж: 19 лет 4 месяца

Сообщение YarNET »

Код: Выделить всё

# 
#-----[ FIND ]------------------------------------------ 
# 

   // 
   // Obtain list of moderators of each forum 
   // First users, then groups ... broken into two queries 
   // 

# 
#-----[ BEFORE, ADD ]------------------------------------ 
# 

/*/ 

# 
#-----[ FIND ]------------------------------------------ 
# 

   // 
   // Find which forums are visible for this user 
   // 

# 
#-----[ BEFORE, ADD ]------------------------------------ 
# 

/*/
######## Может немного по-другому это выглядеть должно? ########

Код: Выделить всё

# 
#-----[ FIND ]------------------------------------------ 
# 

   // 
   // Obtain list of moderators of each forum 
   // First users, then groups ... broken into two queries 
   // 

# 
#-----[ BEFORE, ADD ]------------------------------------ 
# 

/*

# 
#-----[ FIND ]------------------------------------------ 
# 

   // 
   // Find which forums are visible for this user 
   // 

# 
#-----[ AFTER, ADD ]------------------------------------ 
# 

*/

Слишком опасные эксперименты. Если список модераторов действительно не нужен на главной страннице, то все остальное вполне корректно и допустимо, не думаю, что есть смысл производить другие изменения.
Проверь, за что ты платишь деньги провайдеру?
Тестирование скорости соединения с INNTERNET
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет
Поблагодарили: 2 раза
Контактная информация:

Сообщение Xpert »

Может выглядеть и так, и так.
Так это "корректное и допустимое" можно заставить работать быстрее, почему бы и нет? Не у всех есть возможность устранить тормоза наращиванием железной мощи, иногда приходится и код редактировать. :)
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 5270
Стаж: 19 лет 2 месяца
Откуда: Питер
Благодарил (а): 188 раз
Поблагодарили: 800 раз
Контактная информация:

Сообщение Siava »

Xpert
Корректней всего каждую строчку комментировать как // :roll:
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb 2.0.x 3.5.x)
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет
Поблагодарили: 2 раза
Контактная информация:

Сообщение Xpert »

Siava
Это не мой рецепт, я проверил - работает - выложил...
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
YarNET
phpBB 2.0.6
Сообщения: 518
Стаж: 19 лет 4 месяца

Сообщение YarNET »

Siava, в этом случаи комментарии // почему-то не работают. Уже пробовалось на чем-то аналогичном. А /* и */ удачно срабатывает. Сам только почему не знаю... :roll:
Проверь, за что ты платишь деньги провайдеру?
Тестирование скорости соединения с INNTERNET
Splurov
phpBB 1.4.4
Сообщения: 138
Стаж: 19 лет 4 месяца
Откуда: Россия, Москва
Контактная информация:

Сообщение Splurov »

Xpert
Никаких глюков замечено не было. Огромное спасибо за оптимизацию. Продолжай в том же духе :-)
(Модераторов скрывать не стал. Хочу сделать кэширование в файлах.)

Добавлено спустя 5 минут 47 секунд:

Ах да. На счёт самой оптимизации. Раньше в среднем время генерации страницы было 0,5-0,7 секунд. Сейчас в среднем 0,3-0,6
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет
Поблагодарили: 2 раза
Контактная информация:

Сообщение Xpert »

Если еще у кого есть идеи по поводу index.php - с удовольствием выслушаю.

Splurov
Я тоже подумал о кешировании в папке cache, но в силу необходимости провести оптимизацию максимально быстро (на вышеприведенное ушло порядка часа "от корки до корки"), просто избавился от них. Буду рад увидеть вариант с кешированием или как минимум обсудить его.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Thoral

Сообщение Thoral »

не совсем по индексу, но..

у многих используются фиксированные стили .css, прописаные в overall_header.tpl, что избавляет загрузки лишних 10 кб при вызове любой из страниц форума.

однако тем не менее при этом постоянно продолжают генерироваться соответствия таблицы стилей к значениям. то есть, мы удалили "вирус" только снаружи, а его корень остался.

так вот, хорошо бы избавить борду от генерации соответствий таблицы стилей, чтобы просто тупо брало цсс и все дела..

но как это сделать.. :)
Splurov
phpBB 1.4.4
Сообщения: 138
Стаж: 19 лет 4 месяца
Откуда: Россия, Москва
Контактная информация:

Сообщение Splurov »

Xpert
http://www.phpbbguru.net/community/viewtopic.php?t=1393
модераторов я кэширую примерно так же. на том же принципе и в этот же файл. (serialize массива в файл, обновление раз в сутки (т.к. модераторы меняются редко - то если ты их и поменял в течении дня - то можно ручками файл стереть)). сейчас среднее время 0,3-0,5 главной. 15 запросов к бд с кэшированием.
я понимаю что мой способ далеко не идален но лучше не вижу...

Добавлено спустя 2 минуты 34 секунды:

Сейчас подумываю о кэширование всего списка форумов - т.е. полностью всего не особо динамического контента на главной...
Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 5270
Стаж: 19 лет 2 месяца
Откуда: Питер
Благодарил (а): 188 раз
Поблагодарили: 800 раз
Контактная информация:

Сообщение Siava »

YarNET
У меня установлен тяжёлый мод Categories hierarchy 2.0.4 (2.0.5 и 2.1.0 не ставились из-за несовместимости со многими модами).. так при его установке в index.php комментируется почти половина кода, причём по умолчанию как /* */, а автор советует каждую строчку ещё комментировать как //
Забавно, что после выполнения его совета время генерации главной страницы уменьшилось на примерно 0.2с :shock: :D
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb 2.0.x 3.5.x)
Аватара пользователя
Coagulant
Former team member
Сообщения: 955
Стаж: 19 лет 2 месяца
Откуда: Москва
Контактная информация:

Сообщение Coagulant »

YarNet писал(а):А /* и */ удачно срабатывает. Сам только почему не знаю...
Собственно, почему бы им не работать, это ведь стандартное обозначение комментирования? :)

На небольшой борде (1250 постингов, 4 раздела) с парой тяжеленьких модов вообще не почувствовал выйгрыша от оптимизации. Хотя как знать, может виноват сервак.
Splurov
phpBB 1.4.4
Сообщения: 138
Стаж: 19 лет 4 месяца
Откуда: Россия, Москва
Контактная информация:

Сообщение Splurov »

[offtopic]
Теоретически "/* */" будет медленнее "//" - т.к. интерпретируется интерпретатором сложнее... А как на практике сделано в php - не знаю.
Аватара пользователя
YarNET
phpBB 2.0.6
Сообщения: 518
Стаж: 19 лет 4 месяца

Сообщение YarNET »

А помоему что // так, что так /* */ эквивалентно. Разницы быть не должно. Это уже субъективное восприятие диктует разницу. Нарпимер, если выполнить подобную оптимизацию самому, то можно заметить прирост в скорости генерации страниц, а если ее кто-то другой сделает, и вы об этом знать не будите, то ничего не почувствуете.
Проверь, за что ты платишь деньги провайдеру?
Тестирование скорости соединения с INNTERNET
Закрыто

Вернуться в «Поддержка phpBB 2.0.x»