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

Как я оптимизировал скорость мода topics_anywhere

Ответы на вопросы, связанные с модами для phpBB 2.0.x, кроме относящихся к форуму Для авторов (phpBB 2.0.x).
Профессор
phpBB 1.4.2
Сообщения: 53
Стаж: 19 лет 3 месяца
Откуда: Орёл
Контактная информация:

Как я оптимизировал скорость мода 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>

Получаеться ещё лучше. Даже если сервак с темами чуть притормознет, то загрузка в броузере страницы все равно продолжается. А когда все стоит в ячейке таблицы, то может наступить временный ступор.
Аватара пользователя
Егор Наклоняев
phpBB 2.0.4
Сообщения: 404
Стаж: 19 лет 5 месяцев
Откуда: оттуда
Контактная информация:

Сообщение Егор Наклоняев »

Уважаемый, насколько я понял, Вы подняли тему о скорости.
Как говорят у интеллигентных людей: "Тема (вырезано цензурой) не раскрыта..."
Цифры в студию. Сколько мсек. выполнялся скрипт до модификации, сколько после и масштабы наступившего счастья.
Профессор
phpBB 1.4.2
Сообщения: 53
Стаж: 19 лет 3 месяца
Откуда: Орёл
Контактная информация:

Сообщение Профессор »

Как говорят у интеллигентных людей: "Тема (вырезано цензурой) не раскрыта..."
Что это Вы такой злой?
Цифры в студию. Сколько мсек. выполнялся скрипт до модификации, сколько после и масштабы наступившего счастья.
Вот возьмите и займитесь этой проблемой. Вычислите, сколько милисекунд выполняется lang_main.php?

Не знаю насколько, но я не думаю, что фрагмент общим объемом в 126.747 байт (74631 - lang_main + 6983 - lang_topic_anywhere + 18 980 topic_anuwhere) быстрее, чем 18.955 байт, которые я оставил от этого толстого и жирного кода.

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

Сообщение Xpert »

Хм... довольно интересный опыт.
В случае с пробелами виноват скорее автор, в coding-guide по phpBB все зто расписано.
На мой взгляд, сам мод вообще излишне перегружен - все его настройки, да и его самого можно бы было уместить в одном файле и редактировать вручную.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Alexgraf

Сообщение Alexgraf »

Профессор

А нельзя ли результат Вашей работы (файлы) куда нибудь выложить для скачивания ???
Профессор
phpBB 1.4.2
Сообщения: 53
Стаж: 19 лет 3 месяца
Откуда: Орёл
Контактная информация:

Сообщение Профессор »

Я где-нибудь через недельки полторы здесь выложу. Пока подумаю, может ещё чего с ним хорошего сделаю.
Аватара пользователя
lex
phpBB 1.2.1
Сообщения: 24
Стаж: 18 лет 10 месяцев
Контактная информация:

Сообщение lex »

А продолжение этой темы когда будет?
недельки полторы прошли
Видео плеер FSP - Каталог софта - Рейтинг сайтов
Mail.ru Agent - общаемся, отправка бесплатных sms.
Профессор
phpBB 1.4.2
Сообщения: 53
Стаж: 19 лет 3 месяца
Откуда: Орёл
Контактная информация:

Сообщение Профессор »

lex писал(а):А продолжение этой темы когда будет?
недельки полторы прошли
Вот оно! :wink:

Файл я переименовал в 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">&raquo;</span>', '<span class="nav1">&raquo;</span>', '<span class="nav1">&raquo;</span>', '<span class="nav1">&raquo;</span>', '<span class="nav1">&raquo;</span>', '<span class="nav1">&raquo;</span>', '<span class="nav1">&raquo;</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);
}
}
?>
Jovani
phpBB 2.0.5
Сообщения: 477
Стаж: 19 лет 11 месяцев
Контактная информация:

Сообщение Jovani »

особенно много времени отняли пробелы
Думаю, что что эт мелочь по сравенеию с временем, отнимаемым SQL-запросами.
Вот их оптимизировать в первую очередь. было-бы неплохо ...

Ну, а то, что выигрыш в скорости вашей обработки есть, в этом я не сомневаюсь ...
Аватара пользователя
lex
phpBB 1.2.1
Сообщения: 24
Стаж: 18 лет 10 месяцев
Контактная информация:

Сообщение lex »

Так может кто возмётся убрать баги в Topics Anywhere 1.11.0 и также разделить его на две части, и выложит это в виде архива?
А когда всё заработает можно делать оптимизацию SQL запросов
Видео плеер FSP - Каталог софта - Рейтинг сайтов
Mail.ru Agent - общаемся, отправка бесплатных sms.
Профессор
phpBB 1.4.2
Сообщения: 53
Стаж: 19 лет 3 месяца
Откуда: Орёл
Контактная информация:

Сообщение Профессор »

Профессор писал(а):Кроме того сократил и оптимизировал тут ещё разные вещи, но от времени уже позабыл что конкретно.
Вспомнил кое-что. К примеру, убрал загрузку common.php, который помимо своего исполнения грузит кучу других ненужных модулей.

Не к чему его трогать, поскольку common.php вызывается только из-за этих строчек.
// Там, где многоточия введите данные из Вашего 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, посмотрел на Вашу ссылку о багах.
lex писал(а):Topics Anywhere 1.11.0 в phpBB 2.0.17 не распознаёт зарегистрированого пользователя, т.е. если зарегится под админом и потом перейти на Topics Anywhere, то вы сразу оказываетесь гостем
Если потом выйти из Topics Anywhere, то всё опять норматьно.

Кто сможет решить эту проблему? Или знает что делать?
Я об этом даже и не знал. У меня сей мод используется для вывода последних затронутых тем на главную страницу сайта, а там этот баг проявиться не может.

Меня добивали тормоза мода и мне их удалось уменьшить.

Что касается
lex писал(а):разделить его на две части
то он уже разделен. Берите приводимый мной текст и используйте его для вывода тем в нужном Вам месте, а оригинальный Topics Anywhere применяйте для генерации скрипта. Вот и все разделение.
Jovani писал(а):Думаю, что что эт мелочь по сравенеию с временем, отнимаемым SQL-запросами.
Вот их оптимизировать в первую очередь. было-бы неплохо ...
Было бы хорошо, если кто-то этим займется. Какие есть у кого мысли?
Аватара пользователя
lex
phpBB 1.2.1
Сообщения: 24
Стаж: 18 лет 10 месяцев
Контактная информация:

Сообщение lex »

Профессор писал(а):то он уже разделен. Берите приводимый мной текст и используйте его для вывода тем в нужном Вам месте, а оригинальный Topics Anywhere применяйте для генерации скрипта.
Но Anywhere 1.11.0 также выводит в RSS 0.91 и RSS 2.00
Видео плеер FSP - Каталог софта - Рейтинг сайтов
Mail.ru Agent - общаемся, отправка бесплатных sms.
Профессор
phpBB 1.4.2
Сообщения: 53
Стаж: 19 лет 3 месяца
Откуда: Орёл
Контактная информация:

Сообщение Профессор »

lex писал(а):Но Anywhere 1.11.0 также выводит в RSS 0.91 и RSS 2.00
Во как? Кстати, у меня за основу взят 1.8.0.
Я и не знал, что новая версия вышла. :o
Аватара пользователя
lex
phpBB 1.2.1
Сообщения: 24
Стаж: 18 лет 10 месяцев
Контактная информация:

Сообщение lex »

Так значит ждём продолжение банкета?

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

http://www.vidon.ru/forum/topics_anywhere.php
Видео плеер FSP - Каталог софта - Рейтинг сайтов
Mail.ru Agent - общаемся, отправка бесплатных sms.
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет 1 месяц
Поблагодарили: 2 раза
Контактная информация:

Сообщение Xpert »

Профессор писал(а):Было бы хорошо, если кто-то этим займется. Какие есть у кого мысли?
А нужны ли они? Я вот написал мод Recent Topics, гораздо более производительный и менее рыхлый. К topics anywhere у меня лично не самое лучшее отношение после того как из-за тяжести его запросов среди ночи отключили один обслуживаемый мной форум. Брать данные из одной таблицы, обращаясь к ней двумя разными способами в одном запросе - это нонсенс...

Добавлено спустя 3 минуты 30 секунд:
lex писал(а):Topics Anywhere 1.11.0 в phpBB 2.0.17 не распознаёт зарегистрированого пользователя, т.е. если зарегится под админом и потом перейти на Topics Anywhere, то вы сразу оказываетесь гостем
Если потом выйти из Topics Anywhere, то всё опять норматьно.

Кто сможет решить эту проблему? Или знает что делать?
Может с append_sid намудрили?
Последний раз редактировалось Xpert 08.08.2005 10:28, всего редактировалось 1 раз.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Закрыто

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