Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

Дизайн и модификация Invision Community

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

Важное с Sysman.Ru: Запаздывание удаления сессий ботов

Song:

Описание проблемы:

Механизм авторизации ботов (роботов поисковых систем) выполняется несколько иначе чем механизм авторизации и работы с форумом участников форума или гостей. Это сделано по той причине, что боты не могут сохранять у себя куки.

При авторизации роботов-поисковиков из таблицы ibf_session сначала удаляется прошлая сессия (если она присутствовала), далее создаётся новая с ID в формате "Названиеробота_session".

 

Экспериментально выяснено, что часто в результе каких-то внутренних кеширований запросов СУБД MySQL прошлая сессия не удаляется и в этот момент уже начинает исполняться запрос по вставке в новой. А т.к. в таблице ibf_session на поле ID поставлен первичный ключ (PRIMARY KEY), происходит дублирование последнего и новая сессия не вставляется.

 

Как это выяснено?

Закономерный вопрос. Дело в том, что мы не знаем как роботы ходят на форум, соответственно не можем видеть те ошибки что им выдаёт или не выдаёт форум. Данный факт был обнаружен вследствие установки модификации, которая отсылает на email админку все запросы, которые вызывают ошибки.

Эта модификация была задумана совсем для другого (узнавать в первую очередь об ошибках в запросах и предупреждать sql-inj нападения), но в результате её работы выяснилась эта проблема.

 

Чем это плохо?

Дело в том, что при такой ошибке Яндекс-робот например вместо ожидаемой им страницы вашего форума для её индексации получит страницу с ошибкой драйвера IPS. В принципе здесь ничего страшного нет.

НО. Если он будет получать такую ошибку (т.е. "такой экран", такую страницу) часто, со временем он может посчитать ваш сайт малоинформативным (закономерно, т.к. мало оригинальной информации), будет ходить к вам реже, а может и вовсе выбросить ваш сайт из индекса. Всё зависит от того, насколько часто будет происходить ситуация дублирования первичного клича.

 

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

 

Исправление:

1.x:

Найдите:

Цитата (functions.php)
    [color=green]//-------------------------------------------[/color]    [color=green]// Creates a BOT session[/color]    [color=green]//-------------------------------------------[/color]        [b]function[/b] create_bot_session([color=#048284]$bot[/color])    {        [b]global[/b] [color=#048284]$DB[/color], [color=#048284]$INFO[/color], [color=#048284]$std[/color], [color=#048284]$ibforums[/color];                [color=#048284]$db_str[/color] = [color=#048284]$DB[/color]->compile_db_insert_string(                                                 [b]array[/b](                                                         'id'           => [color=#048284]$bot[/color].'_session',                                                         'member_name'  => [color=#048284]$ibforums[/color]->vars['sp_'.[color=#048284]$bot[/color]],                                                        'member_id'    => 0,                                                        'member_group' => [color=#048284]$ibforums[/color]->vars['spider_group'],                                                        'in_forum'     => intval([color=#048284]$ibforums[/color]->input['f']),                                                        'in_topic'     => intval([color=#048284]$ibforums[/color]->input['t']),                                                        'login_type'   => [color=#048284]$ibforums[/color]->vars['spider_anon'],                                                        'running_time' => [color=#048284]$this[/color]->time_now,                                                        'location'     => [color=#048284]$ibforums[/color]->input['act'].",".[color=#048284]$ibforums[/color]->input['p'].",".[color=#048284]$ibforums[/color]->input['CODE'],                                                        'ip_address'   => [color=#048284]$this[/color]->ip_address,                                                        'browser'      => [color=#048284]$this[/color]->user_agent,                                                      )                                              );                                                      [color=#048284]$DB[/color]->query("INSERT INTO ibf_sessions ({$db_str['FIELD_NAMES']}) VALUES({$db_str['FIELD_VALUES']})");                           }

 

Замените:

        [color=#048284]$DB[/color]->query("INSERT INTO ibf_sessions ({$db_str['FIELD_NAMES']}) VALUES({$db_str['FIELD_VALUES']})");

на:

        [color=#048284]$DB[/color]->query("REPLACE INTO ibf_sessions ({$db_str['FIELD_NAMES']}) VALUES({$db_str['FIELD_VALUES']})");

 

Суть сего изменения заключается в том, что мы заменяем два запроса (удаление и вставка) на один, который внутри СУБД выполнит два, но это уже не наше дело.

Рекомендованные сообщения

Song: В 2.1.х дело обстоит гораздо сложнее.

 

Найдите

Цитата (ips_kernel/class_db_mysql.php)
    [color=green]/*-------------------------------------------------------------------------*/[/color]    [color=green]// Quick function: DO INSERT[/color]    [color=green]/*-------------------------------------------------------------------------*/[/color]        [b]function[/b] do_insert( [color=#048284]$tbl[/color], [color=#048284]$arr[/color], [color=#048284]$shutdown[/color]=FALSE )    {        [color=green]//-----------------------------------------[/color]        [color=green]// Form query[/color]        [color=green]//-----------------------------------------[/color]                [color=#048284]$dba[/color]   = [color=#048284]$this[/color]->compile_db_insert_string( [color=#048284]$arr[/color] );        [color=#048284]$query[/color] = "INSERT INTO ".[color=#048284]$this[/color]->obj['sql_tbl_prefix']."$tbl ({$dba['FIELD_NAMES']}) VALUES({$dba['FIELD_VALUES']})";        [color=green]//-----------------------------------------[/color]        [color=green]// Shut down query?[/color]        [color=green]//-----------------------------------------[/color]                [b]if[/b] ( [color=#048284]$shutdown[/color] )        {            [b]if[/b] ( ! [color=#048284]$this[/color]->obj['use_shutdown'] )            {                [color=#048284]$this[/color]->is_shutdown = 1;                [b]return[/b] [color=#048284]$this[/color]->query( [color=#048284]$query[/color] );            }            [b]else[/b]            {                [color=#048284]$this[/color]->obj['shutdown_queries'][] = [color=#048284]$query[/color];                [color=#048284]$this[/color]->cur_query = "";            }        }        [b]else[/b]        {            [b]return[/b] [color=#048284]$this[/color]->query( [color=#048284]$query[/color] );        }    }

 

Поместите рядом копию этой же функции и в ней исправьте:

    [color=green]// Quick function: DO INSERT[/color]

на:

    [color=green]// Quick function: DO INSERT REPLACE[/color]

 

    [b]function[/b] do_insert( [color=#048284]$tbl[/color], [color=#048284]$arr[/color], [color=#048284]$shutdown[/color]=FALSE )

на:

    [b]function[/b] do_insertreplace( [color=#048284]$tbl[/color], [color=#048284]$arr[/color], [color=#048284]$shutdown[/color]=FALSE )

 

        [color=#048284]$query[/color] = "INSERT INTO ".[color=#048284]$this[/color]->obj['sql_tbl_prefix']."$tbl ({$dba['FIELD_NAMES']}) VALUES({$dba['FIELD_VALUES']})";

на:

        [color=#048284]$query[/color] = "REPLACE INTO ".[color=#048284]$this[/color]->obj['sql_tbl_prefix']."$tbl ({$dba['FIELD_NAMES']}) VALUES({$dba['FIELD_VALUES']})";

 

Далее:

найдите:

Цитата (sources/classes/class_session.php)
    [b]function[/b] create_bot_session([color=#048284]$bot[/color], [color=#048284]$name[/color]="")    {        [color=green]//-----------------------------------------[/color]        [color=green]// Get module settings[/color]        [color=green]//-----------------------------------------[/color]                [color=#048284]$vars[/color] = [color=#048284]$this[/color]->_get_location_settings();                [color=#048284]$this[/color]->ipsclass->DB->do_shutdown_insert( 'sessions',                                                 [b]array[/b](                                                        'id'                 => [color=#048284]$bot[/color].'='.str_replace('.','',[color=#048284]$this[/color]->ipsclass->ip_address ).'_session',                                                        'member_name'        => [color=#048284]$name[/color] ? [color=#048284]$name[/color] : [color=#048284]$bot[/color],                                                        'member_id'          => 0,                                                        'member_group'       => [color=#048284]$this[/color]->ipsclass->vars['spider_group'],                                                        'login_type'         => [color=#048284]$this[/color]->ipsclass->vars['spider_anon'],                                                        'running_time'       => [color=#048284]$this[/color]->time_now,                                                        'ip_address'         => [color=#048284]$this[/color]->ipsclass->ip_address,                                                        'browser'            => [color=#048284]$this[/color]->ipsclass->user_agent,                                                        'location'           => [color=#048284]$vars[/color]['location'],                                                        'in_error'           => 0,                                                        'location_1_type'    => [color=#048284]$vars[/color]['1_type'],                                                        'location_1_id'      => [color=#048284]$vars[/color]['1_id'],                                                        'location_2_type'    => [color=#048284]$vars[/color]['2_type'],                                                        'location_2_id'      => [color=#048284]$vars[/color]['2_id'],                                                        'location_3_type'    => [color=#048284]$vars[/color]['3_type'],                                                        'location_3_id'      => [color=#048284]$vars[/color]['3_id'],                                                      )                                              );    }

 

Замените в этой функции:

[color=#048284]$this[/color]->ipsclass->DB->do_shutdown_insert( 'sessions',

на:

[color=#048284]$this[/color]->ipsclass->DB->do_insertreplace( 'sessions',
  • 4 недели спустя...

Song: © Song

Гость
Эта тема закрыта для дальнейших сообщений.

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.