Есть вопросы по phpBB? Ответим!

Обсуждение дизайна и функциональности сайта и форума.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Есть вопросы по phpBB? Ответим!

Сообщение Хакер » 14.08.2006 (Пн) 16:08

Значит так! 8)

Если у вас есть вопрос, касающийся форума phpBB, вам следует задать его здесь, а не создавать для этого новую тему.

Все вопросы, касающиеся работаспособности форума, например такие как "Проблемы с уведомлениями", "Кажущееся вам, отсутствие скрипта login.php" или обнаруженные баги, обсуждаются здесь.

Задавайте вопросы и я с радостью на них отвечу. :wink:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2006 (Пн) 16:11

Ок, спрошу.

  • Каким образом происходит так, что у отдельных пользователей (конкретно, спамоботов) количество сообщений отображается как "0", при этом сами сообщения налицо?
  • Из-за чего попытка "Найти все сообщения" отдельных пользователей (конкретно, спамоботов) всегда выливается в ошибку phpbb timeout expired, в то время как аналогичный поиск по другим мемберам срабатывает сколько угодно раз?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.08.2006 (Пн) 16:47

В оригинальной версии phpBB этих багов нет.
Здесь они возможно присутсвуют, из-за многочисленных неправильно (и неумело) внесённых модификаций.

Задам тогда такие вопросы:
1) Каунтер постингов не накручивался с самого начал при постингах спамботов или же он сбрасывался при удалении одного из таких?

2) Какого вида было сообщение? Жирным шрифтом на белом фоне? Или же со стандартным оформлением в табличке, т.е. в сообщении?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2006 (Пн) 20:26

1. Спамоботы имели "0" с первого поста и продолжали его иметь при появлении новых постингов.
2. См. картинку (как видишь, воспроизводимость таймаута по спамоботам 100%)
Вложения
Spamobot Timeout.gif
Spamobot timeout
(27.07 Кб) Скачиваний: 369
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.08.2006 (Вт) 7:35

Хакер, расскажи, почему когда мод правит чужой пост -- в нём не добавляется уведомление о правке. А когда свой -- добавляется.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.08.2006 (Вт) 7:49

tyomitch
Погоди, пишу ответ ГСергу
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.08.2006 (Вт) 8:03

Отлично :wink:
Попытаюсь разобраться.

Если счётчик постингов не накручивается, значит SQL-запрос, его поднимающий не выполняется. Поскольку там никаких транзакций нет, можно точно сказать что не выполняется сам код, выполняющий запрос.

Как поднимается число постингов:
есть такая функция update_post_stats - она его и поднимает. Запрос выполняется в конце функции, вот его код, думаю, даже человеку не знающему php он будет понятен:
Враппер для подсветки синтаксиса писал(а):
Код: Выделить всё
   if ($mode != 'poll_delete')
   {
      $sql = "UPDATE " . USERS_TABLE . "
         SET user_posts = user_posts + 10 $sign
         WHERE user_id = $user_id";
      if (!$db->sql_query($sql, END_TRANSACTION))
      {
         message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
      }
   }

   return;
}


Многие сейчас начнут возмущаться... с сказал что никакой транзакции там нет, но сам выложил код, где невооруженным глазом видно, что запрос для увеличения находится в транзакции. Почему же всё таки я был прав:
Ну во-перых большая вероятность, что при установке форума, был указан тип СУБД - "MySQL 3.x" а не "MySQL 4.x / 5.x".

Для MySQL 3 , уровень абстракции базы данных (DAL) использует модуль db/mysql.php в котором не предусмотрена работа с транзакциями. Т.е. второй аргумент ф-ции query() просто игнорируется.

Допустим, что выбрали СУБД, поддерживающую транзакции - установщик phpBB2 создаёт таблицы типа MyISAM - которые тоже не поддерживают транзакции. Причём установщик не позволяет выбрать тип таблиц.

И даже если наша администрация в самом начале сама поменяла тип таблиц, ну, к примеру, на BerkeleyDB - всё равно, траназкция тут не причём, ибо код добавления самого постинга также находится в транзакции, и если б дело было именно в ней, этот запрос (добавление записи постинга, и его текста) тоже бы не выполнился...

Значит запрос-инкрементатор не выполнился только потому, что выполнение до него не дошло.

Так как в коде функции update_post_stats нет никаких return-ов до этого кода, можно с уверенностью сказать что эту функцию вообще никто не вызывал.

Перелезаем на уровень выше (из includes/function_posts.php в posting.php).

Как происходит постинг:
Сначала идёт большая часть - проверка допуска (ведь posting.php предназначен не только для постинга. Он выполняет и множество других функций - правка постингов, начало тем, удаление тем, прилепление тем, голосование, квотинг и тд.).

После чего если $mode = 'reply', а mode=reply ибо по-другому спамбот ничего бы не запостил, вызывается три функции
prepare_post - подготавливает пост, парсит бб-коды, заменяет неразрешенные html-теги на <&gt эквивалент, делает замену запрещённых цензурой слов... и тд.
submit_post - добавляет постинг в базу, именно тут и начинается транзакция.
update_post_stats - о ней я уже говорил - изменяет статистику, увеличивает счётчики.

Для ясности приведу код:
Привет Гайдару, он испортил php-шную подсветку писал(а):
Код: Выделить всё
   case 'reply':
         $username = ( !empty($HTTP_POST_VARS['username']) ) ? $HTTP_POST_VARS['username'] : '';
         $subject = ( !empty($HTTP_POST_VARS['subject']) ) ? trim($HTTP_POST_VARS['subject']) : '';
         $message = ( !empty($HTTP_POST_VARS['message']) ) ? $HTTP_POST_VARS['message'] : '';
         $poll_title = ( isset($HTTP_POST_VARS['poll_title']) && $is_auth['auth_pollcreate'] ) ? $HTTP_POST_VARS['poll_title'] : '';
         $poll_options = ( isset($HTTP_POST_VARS['poll_option_text']) && $is_auth['auth_pollcreate'] ) ? $HTTP_POST_VARS['poll_option_text'] : '';
         $poll_length = ( isset($HTTP_POST_VARS['poll_length']) && $is_auth['auth_pollcreate'] ) ? $HTTP_POST_VARS['poll_length'] : '';
         $bbcode_uid = '';

         prepare_post($mode, $post_data, $bbcode_on, $html_on, $smilies_on, $error_msg, $username, $bbcode_uid, $subject, $message, $poll_title, $poll_options, $poll_length);

         if ( $error_msg == '' )
         {
            $topic_type = ( $topic_type != $post_data['topic_type'] && !$is_auth['auth_sticky'] && !$is_auth['auth_announce'] ) ? $post_data['topic_type'] : $topic_type;

            submit_post($mode, $post_data, $return_message, $return_meta, $forum_id, $topic_id, $post_id, $poll_id, $topic_type, $bbcode_on, $html_on, $smilies_on, $attach_sig, $bbcode_uid, str_replace("\'", "''", $username), str_replace("\'", "''", $subject), str_replace("\'", "''", $message), str_replace("\'", "''", $poll_title), $poll_options, $poll_length);
         }
         
         break;



Сразу после switch-блока идёт вот что:
Код: Выделить всё
   if ( $error_msg == '' )
   {
      if ( $mode != 'editpost' )
      {
         $user_id = ( $mode == 'reply' || $mode == 'newtopic' ) ? $userdata['user_id'] : $post_data['poster_id'];
         update_post_stats($mode, $post_data, $forum_id, $topic_id, $post_id, $user_id);
      }


Теперь делаем выводы. Счётчик мог неизмениться только потому, что функцию update_post_stats вообще не вызвали. Это могло быть, если $error_msg содержала сообщение об ошибки.

Посмотрим выше, увидем, что error_msg передаётся в (причём по ссылки, что означает, что prepare_post должна поменять её значение, если произойдёт ошибка) prepare_post НО НЕ ПЕРЕДАЁТСЯ submit_post ВООБЩЕ!.

Т.е. делаем вывод - update_post_stats не выполнилась из за того, что произошла ошибка в prepare_post. НО, как же тогда выполнилась submit_post если она также стоит а If- блоке, который не даст ей выполнится если в $error_msg - ошибка? Вопрос? Единственное что мне приходит на ум - пришёл мастер-ломастер и в попытках что то поменять, что там и правда поменял, причём так, что теперь происходит непонятно что.

Ещё как вариант - спамботы добрались до базы, и постят напрямую. Т.е. добавляя постинги в таблицу - а откуда тогда счётчик должен увеличиваться, и откуда тогда в таблице индексации слов что то возьмётся (ну это я к пункту 2).

Если разбираться, кто и что мог там поправить, и по какому случаю - единственное, что опять же мне кажется наиболее вероятным - неаккуратная установка Attachment MOD-а.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.08.2006 (Вт) 8:06

2tyomitch
:shock:
Что за МОД тут установлен, который правит посты?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 15.08.2006 (Вт) 8:47

Мод, это модератор :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.08.2006 (Вт) 9:06

Аа... tyomitch - оно так специально сделано.

Чтобы модер смог "бесшумно" редактировать чужие посты.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.08.2006 (Вт) 9:22

...а свои не мог. Несправедливо.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.08.2006 (Вт) 10:44

Хакер
Пока ещё смысл туманен.
Проясни-таки про таймаут. Я его не могу понять.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.08.2006 (Вт) 11:17

А что не понятно? Сервер просто убил поток, выполняющий этот скрипт, потому как он выполнялся слишком долго.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.08.2006 (Вт) 11:27

Хакер, а мне?

Почему моды не могут править свои посты так же незаметно, как чужие? И почему моды могут править чужие посты так же заметно, как свои -- чтобы руками каждый раз не вставлять надпись "исправлено таким-то"?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.08.2006 (Вт) 11:32

tyomitch
Потому что там примерно так

Код: Выделить всё
Если владелец_удаляемого_постинга = текущий_юзер То
  УдалитьПостинг

иначе
If $auth('модеринг_в_этом_форуме') то
  Удалить постинг
else
Вы тут не модер
end if

End If


Добавлено: не удаляемого, а исправляемого... что то я описался, но принцип тот же.

Для удаление правки своего постинга - 1 код, для правки модером - другой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14109
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.08.2006 (Вт) 12:07

Достаточно поменять местами последовательность проверки, и этой проблемы не будет.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.08.2006 (Вт) 12:39

Хакер, зачем тогда вообще пишется, кто правил пост, если это мог сделать только автор?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.08.2006 (Вт) 13:41

tyomitch
Ты мне это говоришь, будто это я делал этот форум.

Пишется оно видимо "для красоты". Ибо эта информация не заносится в базу. Так что если это так раздражает кого-то можно поправить языковой конфиг.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.08.2006 (Вт) 22:23

Хакер писал(а):А что не понятно? Сервер просто убил поток, выполняющий этот скрипт, потому как он выполнялся слишком долго.

Ну если тебе после этого всё понятно...

Но я всё же задам вопрос ещё раз.
Почему всегда при поиске "Все сообщения пользователя" для отдельных пользователей будет таймаут? Почему никогда не бывает таймаута для всех остальных пользователей? Почему для этих - таймаут в 100% случаев, хотя количество их постов ~5?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.08.2006 (Ср) 7:06

Незнаю. Во-первых база и так большая (ну ты представь себе - в базе все просплиттенные слова, когда-либо здесь употреблённые). И потом - у этих спамботов был рекордно длинный постинг.

Или как третий вариант - поиск не работал, и кто-то тут его пытался починить... - починил :)

На линии 866 ничего нет (в буквальном смысле). Перед ней идёт начало цикла.

После неё - присваивание 2-х переменных. Никаких операций, отжирающий много времени, там нет. Значит скрипт приспокойненько себе выполнялся, но просто слишком долго, и его тихо-мирно прибили.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3979
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 16.08.2006 (Ср) 7:35

2 Хакер

Один небольшой вопрос:

Чтобы появиться в списке "Сейчас этот форум просматривают:" мне надо несколько раз обновить страницу. Почему такое происходит?
char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.08.2006 (Ср) 7:38

Надо пробыть там минуту.

Информация о местопребывании и времени последнего действия обновляется с интервалом большим чем 60 секунд.

Т.е. код примерно такой:
Код: Выделить всё
Если Time - 60 > ПоследнееИзменение
SQL запрос по обновление информации.
ЕндИф
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3979
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 16.08.2006 (Ср) 7:41

Но это же неправильно. Я могу пробыть в разделе, скажем, 30 секунд. За это время я успею просмотреть ответ в теме и выйти. А форум так и не отобразит моего присутствия.
char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.08.2006 (Ср) 7:46

С одной стороны оно не правильно... но сделано это для того чтобы сократить число запросов к БД.

Вот сам код:
Код: Выделить всё
//
// Only update session DB a minute or so after last update
//if ( $current_time - $userdata['session_time'] > 60 )
{
   // A little trick to reset session_admin on session re-usage
   $update_admin = (!defined('IN_ADMIN') && $current_time - $userdata['session_time'] > ($board_config['session_length']+60)) ? ', session_admin = 0' : '';

   $sql = "UPDATE " . SESSIONS_TABLE . "
   SET session_time = $current_time, session_page = $thispage_id$update_admin
   WHERE session_id = '" . $userdata['session_id'] . "'";
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3979
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 16.08.2006 (Ср) 7:50

Тогда почему бы не сделать этот запрос к БД во время открытия мною раздела?
char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.08.2006 (Ср) 7:54

А этот код делаеться в файле модуля сессион-контроля (т.е. sessions.php). Всё это инклудится в файле common.php, а файл common.php инклудится ко всем файлам форума.

А потом вызывается инициализатор сессии

session_pagestart($user_id, $user_ip)
$userdata = session_init_userprefs()

так что можно просто убрать проверку на время.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.08.2006 (Пт) 15:22

GSerg писал(а):Проясни-таки про таймаут. Я его не могу понять.


Так вот. Посмотрел скрипт поиска. Таймаут потому, что на строчке 866 делается замена всего текса всех постигов бота. Все пронумерованные bb-code-ы, заменяются на их user-аналоги. Т.е. на такие bbcode-ы, какие привычно видеть вам (лат. слова в квадратных скобках, с парным закрывающемся , с символом / после скобки).

Так что нечего тут винить phpBB. У ботов были большие посты, содержащие где то 500 пар тега [url]

А учитывая то, что замена идёт по preg-выражениям, она длится долго. Ну и посчитайте, 500 * кол-во постингов * 2 + выборка из БД, + цензурный парсинг. Короче сервер просто убил скрипт.

Вот так...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1657
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 12.09.2006 (Вт) 21:28

А как установить phpBB? У мя чё-т глючит!
Программист - это локальный бог (С) Я

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16111
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.09.2006 (Вт) 22:07

Завтра я отвечу на этот вопрос, ибо спать собираюсь я...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.09.2006 (Вт) 22:12

Вопрос про phpBB вообще, в отрыве от данного конкретного форума, в данном конкретном разделе считаю злостным оффтопиком...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

След.

Вернуться в VBStreets.ru

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList