Как я оптимизировал скорость мода topics_anywhere
-
- phpBB 1.4.2
- Сообщения: 53
- Стаж: 20 лет 4 месяца
- Откуда: Орёл
Как я оптимизировал скорость мода topics_anywhere
Как я оптимизировал мод topics_anywhere
Структурно файл topics_anywhere.php состоит из двух частей. Одна из них позволяет создать java-скрипт, который будет помещаться на страницы: где надо отображать последние темы. Другая на основе этого скрипта формирует список тем. Все это почему-тонаходиться в одном файле, хотя следовало бы разделить на два отдельных php файла.
Так я и поступил. topics_anywhere.php был оставлен в том виде, как он дан в исходнике мода. Он нам нужен для формирования скрипта. Одновременно создаем php, который будет формировать список тем. Я его назвал topics_any.php
Находим в нем строку
function forum_select() // generates select of all available forums (modified make_jumpbox()-function)
{
global $template, $lang, $db, $SID, $nav_links, $phpEx, $hide_forums;
А затем ищем функцию function show_the_page()
В конце неё есть заключающая строка:
include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
}
Все, что стоит между function forum_select() и этой строкой удаляем. Эти функции нужны били для формирования скрипта.
Теперь чуть ниже ищум в теле программы строку
if ($HTTP_GET_VARS['mode'] == "show") // generates topics for output on any page using JavaScript document.writeln (quite heavily modified code from viewtopic.php)
{
А ещё ниже есть
else if ($HTTP_GET_VARS['mode'] == "generate") // makes and shows the code that the user has to put into the page where the topics are to be displayed
Все, что находиться первой строкой и второй выводит список тем, а вот все, что идет после второй строки с else формирует скрипт, и мы это до самого конца файла удаляем вместе с самой строкой else if.
Смотрим что получилось. Объем файла уменьшился с 74631 байта до 59893 (если я не перепутал вторую цифру, у меня их на листке бумаги много записано, поскольку после каждого действия я отмечал получившийся объем).
Смотрим дальше...
У нас в моде имеються обращения к файлам, в которых находяться текстовые константы (прошу не придираться, я понимаю, что это переменные, но де факто они для нас константы).
include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.' . $phpEx);
include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_topics_anywhere.' . $phpEx);
Кто знает тому не надо говорить, а кто не знает загляните в эти файлы. Ведь у нас стоит не просто некое обращение. За этими двумя строчками стоят масштабные операции. Транслятор php должен будет сщздать кучу переменных, проглатив 47371 байт из lang_main.php и 6983 байт из lang_topics_anywhere.php Вам для вывода затронутых тем очень нужна переменная из lang_main.php
$lang['No_searchable_forums'] = 'У вас нет доступа к поиску ни в одном из форумов на сайте';
или
$lang['Search_keywords_explain'] = 'Вы можете использовать <u>AND</u> чтобы определить слова, которые должны быть в результатах, <u>OR</u> для слов, которые могут быть в результатах, и <u>NOT</u> для слов, которых в результатах быть не должно. Используйте * в качестве шаблона для частичного совпадения.';
А ведь их там просто тьма. То же самое касается lang_topics_anywhere.php, большая часть переменных из которого нужна для формирования Вами java-скрипта.
Даже ежу очевидно, что загрузка lang_topics_anywhere.php и lang_main.php не нужна, а поэтому удаляем эти две строчки.
Смотрим, какие переменные нам требуються. А нужно из этих двух файлов только следующее:
$lang['Username'] = 'Имя';
$lang['Board_disable'] = 'Извините, форум временно отключен.';
$lang['Topic_Announcement'] = '<b>Объявление:</b>';
$lang['Topic_Sticky'] = '<b>Прилеплена:</b>';
$lang['Topic_Poll'] = '<b>Опрос</b>';
$lang['Topic_Moved'] = '<b>Перемещена</b>';
$lang['Topic_locked'] = '<b>Тема закрыта</b>';
$lang['No_topics'] = 'Ни одного заголовка там нет.';
$lang['Guest'] = 'Гость';
$lang['Lastpost_from'] = 'Последнее сообщение';
$lang['Reply'] = 'Ответ';
$lang['Replies'] = 'Ответов';
$lang['View_latest_post'] = 'Посмотреть последнее';
$lang['In'] = 'в';
Вот и подставим этот список вместо удаленных нами include.
Дальше я сделал то, что делаю всегда в таких случаях. Удалил все комментарии, но в ходе этого была замечена интересная вещь. При написании програмки автор вместо табуляции использовал пробелы. Вы только представьте себе некую строчку, находящуюся в колонке 41 или 56, но отодвинутую не табами, а пробелами. 56 пробелов - это ужасно. А ведь это не просто 56, а ещё 1517 строк, которые находяться в таком ужасном состоянии. В общем после того, как я ликвидировал это безобразие объем файла topics_any.php уменьшился с 59893 байт до 21287 байт. Теперь серверу не надо впустую таскать с диска или кэша 38 тысяч 606 пробелов. Заметьте, я не просто убирал пробелы, а заменял их табуляциями. Так что текст по прежнему остался читаемым.
Дальше мы сделаем вот что. Не знаю подойдет ли это всем, но я при выводе тем не использую <span class=""> А между тем в тексте формирование этих тэгов остается. Ищем в тексте все строки: где стоит $css. К примеру, почти в самом начале стоят проверки:
if (isset($HTTP_GET_VARS['ct']))
{
if ($HTTP_GET_VARS['ct'] != '')
{
$css_text_wrap_before = '<span class=\"' . $HTTP_GET_VARS['ct'] . '\">';
$css_text_wrap_after = '</span>';
}
else
{
$error = true;
output_die('Error: No value for argument (css_text)<br>');
}
}
В моем случае стоит обязательно удалить подобные вещи. В результате файл topics_any.php теперь уменьшился до 19891 байта.
Все это не просто сизифоф труд (особенно много времени отняли пробелы). Я ощутил реальное увеличение скорости загрузки тем на главной странице сайта. Ещё могу посоветовать грузить их не просто в ячейках таблицы, а через фрейм.
Создаем файл фрема:
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="Content-Language" content="ru">
<meta name="DOCUMENT-STATE" content="DYNAMIC">
<meta name="ROBOTS" content="index, follow">
</head>
<body link="#0000ff" vlink="#800080" lang="RU" bgcolor="#FFFFCC" topmargin="0">
<center><font font="Courier New" color="red" size="2"><b>Сейчас на форуме</b></center></font><font size="2">
<script language="JavaScript" type="text/javascript" src="http://домен.org/forum/topics_any.php?mode=show&f=
bKDEsIDMsIDQsIDUsIDcsIDgsIDksIDE0LCAxNSwgMTYsIDE3KQ
==&n=10&r=y&sr=y&a=y&s=y&m=y&so=d&b=lpi&lpb=0&lpd=2&lpi=y&t=_blank">
</script>
</body></html>
А на своей странице поместите что-то вроде:
<iframe src="forum.html" scrolling=yes style="width:100%; height:220"></iframe>
Получаеться ещё лучше. Даже если сервак с темами чуть притормознет, то загрузка в броузере страницы все равно продолжается. А когда все стоит в ячейке таблицы, то может наступить временный ступор.
Структурно файл topics_anywhere.php состоит из двух частей. Одна из них позволяет создать java-скрипт, который будет помещаться на страницы: где надо отображать последние темы. Другая на основе этого скрипта формирует список тем. Все это почему-тонаходиться в одном файле, хотя следовало бы разделить на два отдельных php файла.
Так я и поступил. topics_anywhere.php был оставлен в том виде, как он дан в исходнике мода. Он нам нужен для формирования скрипта. Одновременно создаем php, который будет формировать список тем. Я его назвал topics_any.php
Находим в нем строку
function forum_select() // generates select of all available forums (modified make_jumpbox()-function)
{
global $template, $lang, $db, $SID, $nav_links, $phpEx, $hide_forums;
А затем ищем функцию function show_the_page()
В конце неё есть заключающая строка:
include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
}
Все, что стоит между function forum_select() и этой строкой удаляем. Эти функции нужны били для формирования скрипта.
Теперь чуть ниже ищум в теле программы строку
if ($HTTP_GET_VARS['mode'] == "show") // generates topics for output on any page using JavaScript document.writeln (quite heavily modified code from viewtopic.php)
{
А ещё ниже есть
else if ($HTTP_GET_VARS['mode'] == "generate") // makes and shows the code that the user has to put into the page where the topics are to be displayed
Все, что находиться первой строкой и второй выводит список тем, а вот все, что идет после второй строки с else формирует скрипт, и мы это до самого конца файла удаляем вместе с самой строкой else if.
Смотрим что получилось. Объем файла уменьшился с 74631 байта до 59893 (если я не перепутал вторую цифру, у меня их на листке бумаги много записано, поскольку после каждого действия я отмечал получившийся объем).
Смотрим дальше...
У нас в моде имеються обращения к файлам, в которых находяться текстовые константы (прошу не придираться, я понимаю, что это переменные, но де факто они для нас константы).
include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.' . $phpEx);
include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_topics_anywhere.' . $phpEx);
Кто знает тому не надо говорить, а кто не знает загляните в эти файлы. Ведь у нас стоит не просто некое обращение. За этими двумя строчками стоят масштабные операции. Транслятор php должен будет сщздать кучу переменных, проглатив 47371 байт из lang_main.php и 6983 байт из lang_topics_anywhere.php Вам для вывода затронутых тем очень нужна переменная из lang_main.php
$lang['No_searchable_forums'] = 'У вас нет доступа к поиску ни в одном из форумов на сайте';
или
$lang['Search_keywords_explain'] = 'Вы можете использовать <u>AND</u> чтобы определить слова, которые должны быть в результатах, <u>OR</u> для слов, которые могут быть в результатах, и <u>NOT</u> для слов, которых в результатах быть не должно. Используйте * в качестве шаблона для частичного совпадения.';
А ведь их там просто тьма. То же самое касается lang_topics_anywhere.php, большая часть переменных из которого нужна для формирования Вами java-скрипта.
Даже ежу очевидно, что загрузка lang_topics_anywhere.php и lang_main.php не нужна, а поэтому удаляем эти две строчки.
Смотрим, какие переменные нам требуються. А нужно из этих двух файлов только следующее:
$lang['Username'] = 'Имя';
$lang['Board_disable'] = 'Извините, форум временно отключен.';
$lang['Topic_Announcement'] = '<b>Объявление:</b>';
$lang['Topic_Sticky'] = '<b>Прилеплена:</b>';
$lang['Topic_Poll'] = '<b>Опрос</b>';
$lang['Topic_Moved'] = '<b>Перемещена</b>';
$lang['Topic_locked'] = '<b>Тема закрыта</b>';
$lang['No_topics'] = 'Ни одного заголовка там нет.';
$lang['Guest'] = 'Гость';
$lang['Lastpost_from'] = 'Последнее сообщение';
$lang['Reply'] = 'Ответ';
$lang['Replies'] = 'Ответов';
$lang['View_latest_post'] = 'Посмотреть последнее';
$lang['In'] = 'в';
Вот и подставим этот список вместо удаленных нами include.
Дальше я сделал то, что делаю всегда в таких случаях. Удалил все комментарии, но в ходе этого была замечена интересная вещь. При написании програмки автор вместо табуляции использовал пробелы. Вы только представьте себе некую строчку, находящуюся в колонке 41 или 56, но отодвинутую не табами, а пробелами. 56 пробелов - это ужасно. А ведь это не просто 56, а ещё 1517 строк, которые находяться в таком ужасном состоянии. В общем после того, как я ликвидировал это безобразие объем файла topics_any.php уменьшился с 59893 байт до 21287 байт. Теперь серверу не надо впустую таскать с диска или кэша 38 тысяч 606 пробелов. Заметьте, я не просто убирал пробелы, а заменял их табуляциями. Так что текст по прежнему остался читаемым.
Дальше мы сделаем вот что. Не знаю подойдет ли это всем, но я при выводе тем не использую <span class=""> А между тем в тексте формирование этих тэгов остается. Ищем в тексте все строки: где стоит $css. К примеру, почти в самом начале стоят проверки:
if (isset($HTTP_GET_VARS['ct']))
{
if ($HTTP_GET_VARS['ct'] != '')
{
$css_text_wrap_before = '<span class=\"' . $HTTP_GET_VARS['ct'] . '\">';
$css_text_wrap_after = '</span>';
}
else
{
$error = true;
output_die('Error: No value for argument (css_text)<br>');
}
}
В моем случае стоит обязательно удалить подобные вещи. В результате файл topics_any.php теперь уменьшился до 19891 байта.
Все это не просто сизифоф труд (особенно много времени отняли пробелы). Я ощутил реальное увеличение скорости загрузки тем на главной странице сайта. Ещё могу посоветовать грузить их не просто в ячейках таблицы, а через фрейм.
Создаем файл фрема:
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="Content-Language" content="ru">
<meta name="DOCUMENT-STATE" content="DYNAMIC">
<meta name="ROBOTS" content="index, follow">
</head>
<body link="#0000ff" vlink="#800080" lang="RU" bgcolor="#FFFFCC" topmargin="0">
<center><font font="Courier New" color="red" size="2"><b>Сейчас на форуме</b></center></font><font size="2">
<script language="JavaScript" type="text/javascript" src="http://домен.org/forum/topics_any.php?mode=show&f=
bKDEsIDMsIDQsIDUsIDcsIDgsIDksIDE0LCAxNSwgMTYsIDE3KQ
==&n=10&r=y&sr=y&a=y&s=y&m=y&so=d&b=lpi&lpb=0&lpd=2&lpi=y&t=_blank">
</script>
</body></html>
А на своей странице поместите что-то вроде:
<iframe src="forum.html" scrolling=yes style="width:100%; height:220"></iframe>
Получаеться ещё лучше. Даже если сервак с темами чуть притормознет, то загрузка в броузере страницы все равно продолжается. А когда все стоит в ячейке таблицы, то может наступить временный ступор.
-
- phpBB 2.0.4
- Сообщения: 404
- Стаж: 20 лет 6 месяцев
- Откуда: оттуда
-
- phpBB 1.4.2
- Сообщения: 53
- Стаж: 20 лет 4 месяца
- Откуда: Орёл
Что это Вы такой злой?Как говорят у интеллигентных людей: "Тема (вырезано цензурой) не раскрыта..."
Вот возьмите и займитесь этой проблемой. Вычислите, сколько милисекунд выполняется lang_main.php?Цифры в студию. Сколько мсек. выполнялся скрипт до модификации, сколько после и масштабы наступившего счастья.
Не знаю насколько, но я не думаю, что фрагмент общим объемом в 126.747 байт (74631 - lang_main + 6983 - lang_topic_anywhere + 18 980 topic_anuwhere) быстрее, чем 18.955 байт, которые я оставил от этого толстого и жирного кода.
В конце концов дело также в рационализме, целесообразности и эстетической красоте. Програмист всегда должен стараться писать компактно. Рыхлость - плохое свойство. Хотя в отношении дикого количества пробелов, которые стояли вместо табуляций, вероятно, виноват не автор, а текстовый редактор.
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год 2 месяца
- Поблагодарили: 2 раза
Хм... довольно интересный опыт.
В случае с пробелами виноват скорее автор, в coding-guide по phpBB все зто расписано.
На мой взгляд, сам мод вообще излишне перегружен - все его настройки, да и его самого можно бы было уместить в одном файле и редактировать вручную.
В случае с пробелами виноват скорее автор, в coding-guide по phpBB все зто расписано.
На мой взгляд, сам мод вообще излишне перегружен - все его настройки, да и его самого можно бы было уместить в одном файле и редактировать вручную.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
-
- phpBB 1.4.2
- Сообщения: 53
- Стаж: 20 лет 4 месяца
- Откуда: Орёл
-
- phpBB 1.4.2
- Сообщения: 53
- Стаж: 20 лет 4 месяца
- Откуда: Орёл
Вот оно! :wink:lex писал(а):А продолжение этой темы когда будет?
недельки полторы прошли
Файл я переименовал в topics_any.php.
Из него выкинуты фрагменты, которые отвечали за генерацию JavaScripta, который затем надо размещать на странице, где будут выводиться последние поднятые темы форума.
Также все текстовые переменные не загружаются из lang_main, а прописываются непосредственно в самой програмке.
Кроме того сократил и оптимизировал тут ещё разные вещи, но от времени уже позабыл что конкретно.

После всех этих манипуляций работать стало существенно быстрее. Отмечается даже на глаз.
<?php
// topics_anywhere.php,v 1.8.0 2003/06/20
$full_url = 'http://путь к Вашему форуму';
$date_formats = array('d/m/y', 'd/m/Y', 'd/m/Y H:i:s', 'D d-M-y', 'D d-M-Y', 'D d-M-Y H:i:s', 'l d F Y', 'l d F Y H:i:s');
$bullets = array('<span class="nav1">»</span>', '<span class="nav1">»</span>', '<span class="nav1">»</span>', '<span class="nav1">»</span>', '<span class="nav1">»</span>', '<span class="nav1">»</span>', '<span class="nav1">»</span>');
$topics_anywhere_authlevel = 1;
$hide_forums = array();
define('IN_PHPBB', true);
$phpbb_root_path = './';
// Там, где многоточия введите данные из Вашего config.php
$dbname = '...';
$dbuser = '...';
$dbpasswd = '...';
$table_prefix = '...';
$db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname, false);
if(!$db->db_connect_id) {
message_die(CRITICAL_ERROR, "Could not connect to the database");
}
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
define('TA_SCRIPT_NAME', 'topics_anywhere');
function output_die($msg) {
$error = true;
$msg = '<font color="red"><b>' . $msg . '<br>Use the Topics Anywhere link builder again - browse to topics_anywhere.</b><br><br></font>';
exit("document.writeln('$msg');\n");
}
if ($HTTP_GET_VARS['mode'] == "show")
{
if ($board_config['board_disable'])
{
$msg = 'Извините, форум временно отключен.';
exit("document.writeln('$msg');\n");
}
$error = false;
$errorstring = '';
if (!isset($HTTP_GET_VARS['f']) || $HTTP_GET_VARS['f'] == '') {
$error = true;
$errorstring .= 'Error: Missing argument (forum_id)<br>';
}
else {
if (is_numeric($HTTP_GET_VARS['f']))
{
if (sizeof($hide_forums)) {
if (in_array(intval($HTTP_GET_VARS['f']), $hide_forums)) {
$error = true;
$errorstring .= 'Error: Not allowed to show topics from this forum<br>';
}
else {
$forum_id = intval($HTTP_GET_VARS['f']);
$forum_sql = "AND t.forum_id = $forum_id";
}
}
else {
$forum_id = intval($HTTP_GET_VARS['f']);
$forum_sql = "AND t.forum_id = $forum_id";
}
}
else {
if ($HTTP_GET_VARS['f'] == 'a') {
if (sizeof($hide_forums)) {
$hidelist = "(" . implode(",", $hide_forums) . ")";
$forum_sql = 'AND t.forum_id NOT IN ' . $hidelist;
}
else {
$forum_sql = '';
}
}
else
{
if (substr($HTTP_GET_VARS['f'], 0, 1) == 'b') {
$forumlist = base64_decode(substr($HTTP_GET_VARS['f'], 1));
$forum_sql = "AND t.forum_id in $forumlist";
}
else {
$error = true;
$errorstring .= 'Error: Wrong argument (forum_id)<br>';
}
}
}
}
if (!isset($HTTP_GET_VARS['n']) || $HTTP_GET_VARS['n'] == '') {
$error = true;
$errorstring .= 'Error: Missing argument (limit)<br>';
}
else {
if (is_numeric($HTTP_GET_VARS['n'])) {
$limit = intval($HTTP_GET_VARS['n']);
}
else {
$error = true;
$errorstring .= 'Error: Wrong argument (limit)<br>';
}
}
if (!$error)
{
$outputarray = array();
$target_link = ' target="_self"';
if (isset($HTTP_GET_VARS['t'])) {
if ($HTTP_GET_VARS['t'] != '') {
$target_link = ' target="' . $HTTP_GET_VARS['t'] . '"';
}
else {
$error = true;
output_die('Error: No value for argument (target_link)<br>');
}
}
if (isset($HTTP_GET_VARS['so']) && $HTTP_GET_VARS['so'] == 'd') {
if (isset($HTTP_GET_VARS['a'])) {
if ($HTTP_GET_VARS['a'] == 'y') {
$announce_sql = '';
}
else {
$error = true;
output_die('Error: Wrong value for argument (announcement)<br>');
}
}
else {
$announce_sql = 'AND t.topic_type <> ' . POST_ANNOUNCE;
}
if (isset($HTTP_GET_VARS['s'])) {
if ($HTTP_GET_VARS['s'] == 'y') {
$sticky_sql = '';
}
else {
$error = true;
output_die('Error: Wrong value for argument (sticky)<br>');
}
}
else {
$sticky_sql = "AND t.topic_type <> " . POST_STICKY;
}
if (isset($HTTP_GET_VARS['l'])) {
if ($HTTP_GET_VARS['l'] == 'y') {
$locked_sql = '';
}
else {
$error = true;
output_die('Error: Wrong value for argument (locked)<br>');
}
}
else {
$locked_sql = "AND t.topic_status <> " . TOPIC_LOCKED;
}
if (isset($HTTP_GET_VARS['m'])) {
if ($HTTP_GET_VARS['m'] == 'y') {
$locked_sql = '';
}
else {
$error = true;
output_die('Error: Wrong value for argument (moved)<br>');
}
}
else {
$moved_sql = "AND t.topic_status <> " . TOPIC_MOVED;
}
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time, f.forum_name
FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2, " . USERS_TABLE . " u2, " . FORUMS_TABLE . " f
WHERE t.topic_poster = u.user_id
$forum_sql
AND p.post_id = t.topic_first_post_id
AND p2.post_id = t.topic_last_post_id
AND t.forum_id = f.forum_id
AND u2.user_id = p2.poster_id
$announce_sql
$sticky_sql
$locked_sql
$moved_sql
ORDER BY t.topic_last_post_id DESC
LIMIT $limit";
if ( !($result = $db->sql_query($sql)) ) {
$error = true;
output_die('General Error: Could not obtain topic information (topics sql)<br>');
}
$total_topics = 0;
while( $row = $db->sql_fetchrow($result) ) {
$topic_rowset[] = $row;
$total_topics++;
}
$db->sql_freeresult($result);
}
else {
if (isset($HTTP_GET_VARS['a'])) {
if ($HTTP_GET_VARS['a'] == 'y') {
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_time, p.post_username, f.forum_name
FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . USERS_TABLE . " u2, " . FORUMS_TABLE . " f
WHERE t.topic_poster = u.user_id
$forum_sql
AND p.post_id = t.topic_last_post_id
AND p.poster_id = u2.user_id
AND t.forum_id = f.forum_id
AND t.topic_type = " . POST_ANNOUNCE . "
ORDER BY t.topic_last_post_id DESC
LIMIT $limit";
if ( !($result = $db->sql_query($sql)) ) {
$error = true;
output_die('General Error: Could not obtain topic information (announce sql)<br>');
}
$topic_rowset = array();
$total_announcements = 0;
while( $row = $db->sql_fetchrow($result) ) {
$topic_rowset[] = $row;
$total_announcements++;
}
$db->sql_freeresult($result);
}
else {
$error = true;
output_die('Error: Wrong value for argument (announce)<br>');
}
}
else {
$topic_rowset = array();
$total_announcements = 0;
}
$max = $limit - $total_announcements;
if ($max < 1) {
$max = 0;
}
if (isset($HTTP_GET_VARS['s'])) {
if ($HTTP_GET_VARS['s'] == 'y') {
$sticky_sql = '';
}
else {
$error = true;
output_die('Error: Wrong value for argument (sticky)<br>');
}
}
else {
$sticky_sql = "AND t.topic_type <> " . POST_STICKY;
}
if (isset($HTTP_GET_VARS['l'])) {
if ($HTTP_GET_VARS['l'] == 'y') {
$locked_sql = '';
}
else {
$error = true;
output_die('Error: Wrong value for argument (locked)<br>');
}
}
else {
$locked_sql = "AND t.topic_status <> " . TOPIC_LOCKED;
}
if (isset($HTTP_GET_VARS['m'])) {
if ($HTTP_GET_VARS['m'] == 'y') {
$moved_sql = '';
}
else {
$error = true;
output_die('Error: Wrong value for argument (moved)<br>');
}
}
else {
$moved_sql = "AND t.topic_status <> " . TOPIC_MOVED;
}
if (isset($HTTP_GET_VARS['rt'])) {
if ($HTTP_GET_VARS['rt'] == 'n') {
$reg_sql = "AND t.topic_type <> " . POST_NORMAL;
}
else {
$error = true;
output_die('Error: Wrong value for argument (regular topics)<br>');
}
}
else {
$reg_sql = '';
}
if ($max)
{
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_username, p2.post_username AS post_username2, p2.post_time, f.forum_name
FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2, " . USERS_TABLE . " u2, " . FORUMS_TABLE . " f
WHERE t.topic_poster = u.user_id
$forum_sql
AND p.post_id = t.topic_first_post_id
AND p2.post_id = t.topic_last_post_id
AND t.forum_id = f.forum_id
AND u2.user_id = p2.poster_id
AND t.topic_type <> " . POST_ANNOUNCE . "
$sticky_sql
$locked_sql
$moved_sql
$reg_sql
ORDER BY t.topic_type DESC, t.topic_last_post_id DESC
LIMIT $max";
if ( !($result = $db->sql_query($sql)) ) {
$error = true;
output_die('General Error: Could not obtain topic information (topics sql)<br>');
}
$total_topics = 0;
while( $row = $db->sql_fetchrow($result) ) {
$topic_rowset[] = $row;
$total_topics++;
}
$db->sql_freeresult($result);
}
$total_topics += $total_announcements;
}
// Define censored word matches
$orig_word = array();
$replacement_word = array();
obtain_word_list($orig_word, $replacement_word);
$html_list = false;
$list_wrap_before = '';
$list_wrap_after = '';
if (isset($HTTP_GET_VARS['b']))
{
if ($HTTP_GET_VARS['b'] == 'dis' || $HTTP_GET_VARS['b'] == 'cir' || $HTTP_GET_VARS['b'] == 'squ' || $HTTP_GET_VARS['b'] == 'num')
{
$html_list = true;
switch($HTTP_GET_VARS['b']) {
case "dis":
$html_wrap_before = '<ul type="disc">';
$html_wrap_after = '</ul>';
break;
case "cir":
$html_wrap_before = '<ul type="circle">';
$html_wrap_after = '</ul>';
break;
case "squ":
$html_wrap_before = '<ul type="square">';
$html_wrap_after = '</ul>';
break;
case "num":
$html_wrap_before = '<ol type="1">';
$html_wrap_after = '</ol>';
break;
default:
break;
}
}
}
if ($html_wrap_before != '') {
array_push($outputarray, $html_wrap_before);
}
if($total_topics) {
for($i = 0; $i < $total_topics; $i++)
{
$topic_id = $topic_rowset[$i]['topic_id'];
$topic_title = ( count($orig_word) ) ? preg_replace($orig_word, $replacement_word, $topic_rowset[$i]['topic_title']) : $topic_rowset[$i]['topic_title'];
$replies = $topic_rowset[$i]['topic_replies'];
$topic_type = $topic_rowset[$i]['topic_type'];
$forum_id = $topic_rowset[$i]['forum_id'];
$forum_name = $topic_rowset[$i]['forum_name'];
if( $topic_type == POST_ANNOUNCE ) {
if (isset($HTTP_GET_VARS['h'])) {
if (strstr($HTTP_GET_VARS['h'], 'a')) {
$topic_type = '';
}
else {
$topic_type = '<b>Объявление:</b> ';
}
}
else {
$topic_type = '<b>Объявление:</b> ';
}
}
else if( $topic_type == POST_STICKY )
{
if (isset($HTTP_GET_VARS['h']))
{
if (strstr($HTTP_GET_VARS['h'], 's')) {
$topic_type = '';
}
else {
$topic_type = '<b>Прилеплена:</b> ';
}
}
else {
$topic_type = '<b>Прилеплена:</b> ';
}
}
else {
$topic_type = '';
}
if( $topic_rowset[$i]['topic_vote'] ) {
if (isset($HTTP_GET_VARS['h'])) {
if (!strstr($HTTP_GET_VARS['h'], 'p')) {
$topic_type .= '<b>Опрос</b> ';
}
}
else {
$topic_type .= '<b>Опрос</b> ';
}
}
if( $topic_rowset[$i]['topic_status'] == TOPIC_MOVED )
{
if (isset($HTTP_GET_VARS['h'])) {
if (!strstr($HTTP_GET_VARS['h'], 'm')) {
$topic_type .= '<b>Перемещена</b> ';
}
}
else {
$topic_type .= '<b>Перемещена</b> ';
}
$topic_id = $topic_rowset[$i]['topic_moved_id'];
}
if( $topic_rowset[$i]['topic_status'] == TOPIC_LOCKED )
{
if (isset($HTTP_GET_VARS['h'])) {
if (!strstr($HTTP_GET_VARS['h'], 'l')) {
$topic_type .= '<b>Тема закрыта</b> ';
}
}
else {
$topic_type .= '<b>Тема закрыта</b> ';
}
}
$separator = ' - ';
if (isset($HTTP_GET_VARS['br'])) {
if ($HTTP_GET_VARS['br'] == 'y') {
$separator = '<br>';
}
}
$last_post_author = '';
if (isset($HTTP_GET_VARS['lpb']))
{
$last_post_author = ( $topic_rowset[$i]['id2'] == ANONYMOUS ) ? ( ($topic_rowset[$i]['post_username2'] != '' ) ? $topic_rowset[$i]['post_username2'] . ' ' : 'Гость ' ) : $topic_rowset[$i]['user2'];
if (is_numeric($HTTP_GET_VARS['lpb']))
{
if (intval($HTTP_GET_VARS['lpb']) == 1) {
$last_post_author = $separator . 'Последнее сообщение ' . $last_post_author;
}
else {
$last_post_author = $separator . $last_post_author;
}
}
}
$in_forum = '';
if (isset($HTTP_GET_VARS['sfn']))
{
if ($HTTP_GET_VARS['sfn'] == 'y')
{
if (isset($HTTP_GET_VARS['fnl']))
{
if ($HTTP_GET_VARS['fnl'] == 'y') {
$view_forum_url = $full_url . "/viewforum.$phpEx?" . POST_FORUM_URL . "=$forum_id";
$in_forum = ' в <a href="' . $view_forum_url . '"' . $target_link . '>' . addslashes($forum_name) . '</a>';
}
else {
$in_forum = ' в ' . addslashes($forum_name);
}
}
else {
$in_forum = ' в ' . addslashes($forum_name);
}
}
else {
$error = true;
output_die('Error: Wrong value for argument (locked)<br>');
}
}
$last_post_time = '';
if (isset($HTTP_GET_VARS['lpd']))
{
if (is_numeric($HTTP_GET_VARS['lpd']))
{
if (intval($HTTP_GET_VARS['lpd']) < count($date_formats)) {
$last_post_time = create_date($date_formats[$HTTP_GET_VARS['lpd']], $topic_rowset[$i]['post_time'], $board_config['board_timezone']);
}
else {
$last_post_time = create_date($board_config['default_dateformat'], $topic_rowset[$i]['post_time'], $board_config['board_timezone']);
}
}
else {
$last_post_time = create_date($board_config['default_dateformat'], $topic_rowset[$i]['post_time'], $board_config['board_timezone']);
}
$last_post_time = ', ' . $last_post_time;
}
if (isset($HTTP_GET_VARS['r']))
{
if ($HTTP_GET_VARS['r'] == 'y')
{
if (isset($HTTP_GET_VARS['sr']))
{
if ($HTTP_GET_VARS['sr'] == 'y') {
$replies = ' (' . $replies . ' ' . (($replies == '1')? 'Ответ' : 'Ответов' ) . ')';
}
else {
$error = true;
output_die('Error: Wrong value for argument (showrepliesword)<br>');
}
}
else {
$replies = ' (' . $replies . ')';
}
}
else {
$error = true;
output_die('Error: Wrong value for argument (replies)<br>');
}
}
else {
$replies = '';
}
$view_topic_url = $full_url . "/viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id";
$views = $topic_rowset[$i]['topic_views'];
if (isset($HTTP_GET_VARS['ch']))
{
if (is_numeric($HTTP_GET_VARS['ch']))
{
$max_title_length = intval($HTTP_GET_VARS['ch']);
if ($max_title_length > 0)
{
$trans = get_html_translation_table(HTML_ENTITIES);
$trans = array_flip($trans);
$topic_title = strtr($topic_title, $trans);
if (strlen($topic_title) > $max_title_length)
{
if (isset($HTTP_GET_VARS['chw']))
{
if ($HTTP_GET_VARS['chw'] == 'p') {
$topic_title = (strstr(strrev(substr($topic_title, 0, $max_title_length)), ' ')) ? strrev(strstr(strrev(substr($topic_title, 0, $max_title_length)), ' ')) . '...' : substr($topic_title, 0, $max_title_length) . '...';
}
else if ($HTTP_GET_VARS['chw'] == 'n') {
$topic_title_orig = $topic_title;
$topic_title = substr($topic_title_orig, 0, $max_title_length);
$lastpart = substr($topic_title_orig, strlen($topic_title));
if (strrpos(strrev($lastpart), ' ') === false) {
$topic_title = $topic_title_orig;
}
else {
$topic_title .= substr($lastpart, 0, -(strrpos(strrev($lastpart), ' '))) . '...';
}
}
else {
$topic_title = substr($topic_title, 0, $max_title_length) . '...';
}
}
else {
$topic_title = substr($topic_title, 0, $max_title_length) . '...';
}
}
$trans = array_flip($trans);
$topic_title = strtr($topic_title, $trans);
}
}
}
$item = $topic_type . '<a href="' . $view_topic_url . '"' . $target_link . '>' . addslashes($topic_title) . '</a>' . $in_forum . $replies . addslashes($last_post_author) . $last_post_time;
$last_post_url = ' <a href="' . $full_url . "/viewtopic.$phpEx?" . POST_POST_URL . '=' . $topic_rowset[$i]['topic_last_post_id'] . '#' . $topic_rowset[$i]['topic_last_post_id'] . '"' . $target_link . '><img src="' . $full_url . '/' . $images['icon_latest_reply'] . '" alt="Посмотреть последнее" title="Посмотреть последнее" border="0" /></a>';
if (isset($HTTP_GET_VARS['lpi'])) {
if ($HTTP_GET_VARS['lpi'] == 'y' && $HTTP_GET_VARS['b'] != 'lpi') {
$item = $item . $last_post_url;
}
}
if (isset($HTTP_GET_VARS['bl'])) {
if ($HTTP_GET_VARS['bl'] == 'y') {
$item = $item . '<br>';
}
}
if ($html_list) {
$item = '<li>' . $item . '</li>';
}
else
{
if (isset($HTTP_GET_VARS['b']))
{
if ($HTTP_GET_VARS['b'] == 'non') {
$item = $item . '<br>';
}
else if ($HTTP_GET_VARS['b'] == 'lpi') {
$item = $last_post_url . ' ' . $item . '<br>';
}
else if (is_numeric($HTTP_GET_VARS['b']))
{
if (intval($HTTP_GET_VARS['b']) < count($bullets)) {
$item = $bullets[intval($HTTP_GET_VARS['b'])] . ' ' . $item . '<br>';
}
else {
$error = true;
output_die('Error: Wrong value for argument (bullet)<br>');
}
}
else {
$error = true;
output_die('Error: Wrong value for argument (bullet)<br>');
}
}
}
if ($flag_topics_pub != "no") {
array_push($outputarray, $item);
}
}
}
else
{
if ($html_list) {
$item = '<li>' . 'Ни одного заголовка там нет.' . '</li>';
}
else {
if (isset($HTTP_GET_VARS['b'])) {
if ($HTTP_GET_VARS['b'] == 'non' || $HTTP_GET_VARS['b'] == 'lpi') {
$item = 'Ни одного заголовка там нет.<br>';
}
else if (is_numeric($HTTP_GET_VARS['b']))
{
if (intval($HTTP_GET_VARS['b']) < count($bullets)) {
$item = $bullets[intval($HTTP_GET_VARS['b'])] . ' Ни одного заголовка там нет.<br>';
}
else {
$error = true;
output_die('Error: Wrong value for argument (bullet)<br>');
}
}
}
}
array_push($outputarray, $item);
}
if ($html_wrap_before != '') {
array_push($outputarray, $html_wrap_after);
}
while ($item = array_shift($outputarray)) {
echo "document.writeln('$item');\n";
}
}
if ($error) {
output_die($errorstring);
}
}
?>
-
- phpBB 2.0.5
- Сообщения: 477
- Стаж: 21 год
-
- phpBB 1.2.1
- Сообщения: 24
- Стаж: 19 лет 11 месяцев
Так может кто возмётся убрать баги в Topics Anywhere 1.11.0 и также разделить его на две части, и выложит это в виде архива?
А когда всё заработает можно делать оптимизацию SQL запросов
А когда всё заработает можно делать оптимизацию SQL запросов
-
- phpBB 1.4.2
- Сообщения: 53
- Стаж: 20 лет 4 месяца
- Откуда: Орёл
Вспомнил кое-что. К примеру, убрал загрузку common.php, который помимо своего исполнения грузит кучу других ненужных модулей.Профессор писал(а):Кроме того сократил и оптимизировал тут ещё разные вещи, но от времени уже позабыл что конкретно.
Не к чему его трогать, поскольку common.php вызывается только из-за этих строчек.
lex, посмотрел на Вашу ссылку о багах.// Там, где многоточия введите данные из Вашего config.php
$dbname = '...';
$dbuser = '...';
$dbpasswd = '...';
$table_prefix = '...';
$db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname, false);
if(!$db->db_connect_id) {
message_die(CRITICAL_ERROR, "Could not connect to the database");
}
Я об этом даже и не знал. У меня сей мод используется для вывода последних затронутых тем на главную страницу сайта, а там этот баг проявиться не может.lex писал(а):Topics Anywhere 1.11.0 в phpBB 2.0.17 не распознаёт зарегистрированого пользователя, т.е. если зарегится под админом и потом перейти на Topics Anywhere, то вы сразу оказываетесь гостем
Если потом выйти из Topics Anywhere, то всё опять норматьно.
Кто сможет решить эту проблему? Или знает что делать?
Меня добивали тормоза мода и мне их удалось уменьшить.
Что касается
то он уже разделен. Берите приводимый мной текст и используйте его для вывода тем в нужном Вам месте, а оригинальный Topics Anywhere применяйте для генерации скрипта. Вот и все разделение.lex писал(а):разделить его на две части
Было бы хорошо, если кто-то этим займется. Какие есть у кого мысли?Jovani писал(а):Думаю, что что эт мелочь по сравенеию с временем, отнимаемым SQL-запросами.
Вот их оптимизировать в первую очередь. было-бы неплохо ...
-
- phpBB 1.4.2
- Сообщения: 53
- Стаж: 20 лет 4 месяца
- Откуда: Орёл
-
- phpBB 1.2.1
- Сообщения: 24
- Стаж: 19 лет 11 месяцев
Так значит ждём продолжение банкета?
Добавлено спустя 2 минуты 4 секунды:
http://www.vidon.ru/forum/topics_anywhere.php
Добавлено спустя 2 минуты 4 секунды:
http://www.vidon.ru/forum/topics_anywhere.php
-
- phpBB Guru
- Сообщения: 5484
- Стаж: 21 год 2 месяца
- Поблагодарили: 2 раза
А нужны ли они? Я вот написал мод Recent Topics, гораздо более производительный и менее рыхлый. К topics anywhere у меня лично не самое лучшее отношение после того как из-за тяжести его запросов среди ночи отключили один обслуживаемый мной форум. Брать данные из одной таблицы, обращаясь к ней двумя разными способами в одном запросе - это нонсенс...Профессор писал(а):Было бы хорошо, если кто-то этим займется. Какие есть у кого мысли?
Добавлено спустя 3 минуты 30 секунд:
Может с append_sid намудрили?lex писал(а):Topics Anywhere 1.11.0 в phpBB 2.0.17 не распознаёт зарегистрированого пользователя, т.е. если зарегится под админом и потом перейти на Topics Anywhere, то вы сразу оказываетесь гостем
Если потом выйти из Topics Anywhere, то всё опять норматьно.
Кто сможет решить эту проблему? Или знает что делать?
Последний раз редактировалось Xpert 08.08.2005 10:28, всего редактировалось 1 раз.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений