Error creating new session

Проблемы с установкой или работой phpBB 2.0.x? Получите помощь здесь!

Error creating new session

Сообщение Netman 16.11.2004 14:58

Форум рабоатет уже второй год.
Возникает ошибка все чаще и чаще:

phpBB : Critical Error

Error creating new session

DEBUG MODE

SQL Error : 1114 The table 'phpbb_sessions' is full

INSERT INTO phpbb_sessions (session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in) VALUES
('74e43a0ebf3d0b600a9281afe4968183', -1, 1100156055, 1100156055, 'd5b8e241', 0, 0)

Line : 152
File : /datas/fakehome/wnk/wwwroot/autoby/forum/includes/sessions.php


Раньше ошибка возникала раз в пару месяцев, в последнее время каждую неделю, а сегодня 2 раза за день.
Человек который помогал установить форум, сказал, что мой проект кто-то атакует из интернета. В результате происходит переполнение количества сессий. Написал скрипт, который обнуляет указаную переменную. После его запуска, форум опять работает.
Я обратился к хостеру с вопросом об атаках. Сказали, что это проблема в коде, обратитесь к разработчикам.

Помогите, пожалуйста, решить проблему.
С благодарностью приму замечания непосредственно по форуму: http://autoby.wnk.biz/forum/
Последний раз редактировалось Netman 16.09.2005 12:35, всего редактировалось 1 раз.
Netman
phpBB 1.2.0
 
Сообщения: 19
Зарегистрирован: 16.11.2004 14:51
Откуда: Minsk


Сообщение Konkere 16.11.2004 15:29

Konkere
phpBB 2.0.1
 
Сообщения: 149
Зарегистрирован: 12.05.2004 1:43

Сообщение Netman 16.11.2004 15:33

Спасибо за ссылку. Не очень силен в английском. Если кто-то поможет русской ссылкой или кратким описанием проблемы на русском языке - буду благодарен.
А пока распечатаю, возьму словарик и начну переводить :cry:
Netman
phpBB 1.2.0
 
Сообщения: 19
Зарегистрирован: 16.11.2004 14:51
Откуда: Minsk

Сообщение Konkere 16.11.2004 16:00

Netman
Там рассмотрено несколько методов решения твоей проблеммы:
1 Автоматическая очистка таблицы сессий
В файле includes/sessions.php найти строку
Код: Выделить всё
message_die(CRITICAL_ERROR, 'Error creating new session', '', __LINE__, __FILE__, $sql);

и заменить на
Код: Выделить всё
$error = TRUE;
if (SQL_LAYER == "mysql" || SQL_LAYER == "mysql4")
{
    $sql_error = $db->sql_error($result);
    if ($sql_error["code"] == 1114)
    {
        $result = $db->sql_query('SHOW TABLE STATUS LIKE "'.SESSIONS_TABLE.'"');
        $row = $db->sql_fetchrow($result);
        if ($row["Type"] == "HEAP")
        {
            if ($row["Rows"] > 2500)
            {
                $delete_order = (SQL_LAYER=="mysql4") ? " ORDER BY session_time ASC" : "";
                $db->sql_query("DELETE QUICK FROM ".SESSIONS_TABLE."$delete_order LIMIT 50");
            }
            else
            {
                $db->sql_query("ALTER TABLE ".SESSIONS_TABLE." MAX_ROWS=".($row["Rows"]+50));
            }
            if ($db->sql_query($sql))
            {
                $error = FALSE;
            }
        }
    }
}
if ($error)
{
    message_die(CRITICAL_ERROR, "Error creating new session", "", __LINE__, __FILE__, $sql);
}

этот код удаляет 50 самых старых записей из таблицы сессий

2 Ограничение колличества сессий на один IP адрес
В файле includes/sessions.php найти кусок
Код: Выделить всё
    //
    // Create or update the session
    //
    $sql = "UPDATE " . SESSIONS_TABLE . "
        SET session_user_id = $user_id, session_start = $current_time, session_time = $current_time, session_page = $page_id, session_logged_in = $login
        WHERE session_id = '" . $session_id . "'
            AND session_ip = '$user_ip'";
    if ( !$db->sql_query($sql) || !$db->sql_affectedrows() )
    {
        $session_id = md5(uniqid($user_ip));

после него вставить
Код: Выделить всё
        $sql = "SELECT COUNT(*) as numrows FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip'";
        $result = $db->sql_query($sql);
        if ( !$result )
        {
            message_die(CRITICAL_ERROR, 'Error checking existing sessions', '', __LINE__, __FILE__, $sql);
        }
       
        $numrows = $db->sql_fetchrow($result);
        if($numrows['numrows'] > 4)
        {
            $delete_limit = $numrows['numrows'] - 4;
            switch( SQL_LAYER )
            {
                case 'mysql4':
                    $sql = "DELETE FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip' ORDER BY session_start ASC LIMIT $delete_limit";
                    break;
                default:
                    $sql = "SELECT session_start FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip' ORDER BY session_start DESC LIMIT 4";
                    $result = $db->sql_query($sql);
                   
                    if ( !$db->sql_query($sql) )
                    {
                        message_die(CRITICAL_ERROR, 'Error select session data', '', __LINE__, __FILE__, $sql);
                    }
                   
                    $session_rows = $db->sql_fetchrowset($result);
                   
                    $sql = "DELETE FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip' AND session_start < ".$session_rows[3]['session_start'];
            }
                   
            if ( !$db->sql_query($sql) )
            {
                message_die(CRITICAL_ERROR, 'Error deleting old sessions', '', __LINE__, __FILE__, $sql);
            }
        }

для изменения количества сессий в строку
Код: Выделить всё
if($numrows['numrows'] > 4)

4 заменить на нужное число

3 Увеличение значения MAX_ROWS для таблицы сессий
через phpMyAdmin выполнить запрос
Код: Выделить всё
ALTER TABLE phpbb_sessions MAX_ROWS = 2500;

где 2500 размер таблицы

4 Изменить тип таблицы на MyISAM
через phpMyAdmin выполнить запрос
Код: Выделить всё
ALTER TABLE phpbb_sessions TYPE = MYISAM;
Konkere
phpBB 2.0.1
 
Сообщения: 149
Зарегистрирован: 12.05.2004 1:43

Сообщение Netman 17.11.2004 0:01

С помощью словаря прочитал статью. Вроде все понял, кроме одного. В причинах ошибки пишется:
To prevent HEAP tables from eating up all the memory by having too many rows in them, a limit, MAX_ROWS, is placed on the table. This limit specifies a number which is the maximum number of rows that the table can have. The default value of MAX_ROWS varies from host to host, but it's often 550. This means that when you try and insert another row into the sessions table when it already has 550 rows there, the table is full error occurs.

А в первом способе решения удаляются 50 старых записей в таблице сессий, если в таблице имеется уже 2500 записей:
This script will delete the oldest 50 rows (no longer valid sessions) from the sessions table if there are more than 2500 rows in the table currently. If there are less than 2500 rows in the table, then 50 is added to the table's MAX_ROWS (see Why the table is full for more on MAX_ROWS). This basically means that the table's capacity gets bigger and bigger until the maximum amount of rows hits 2500. From then on, instead of increasing the table's capacity, the script deletes the oldest 50 (and no longer needed) sessions.

Нестыковка или я что-то не понимаю. Может правильнее в строке
if ($row["Rows"] > 2500)
вместо 2500 написать 550?
Netman
phpBB 1.2.0
 
Сообщения: 19
Зарегистрирован: 16.11.2004 14:51
Откуда: Minsk

Сообщение Konkere 17.11.2004 1:23

Netman
по всей видимости предпологается, что размер MAX_ROWS уже увеличен до 2500
Konkere
phpBB 2.0.1
 
Сообщения: 149
Зарегистрирован: 12.05.2004 1:43

Сообщение DJ Sample 18.11.2004 18:55

На эту тему есть мод, называется "max_sessions", от Niels'a, с помощью которого можно выбрать кол-во сессий на IP и общее кол-во, вроде работает.
Tranceaddicted
DJ Sample
phpBB 2.0.2
 
Сообщения: 151
Зарегистрирован: 02.06.2004 14:35

Сообщение Netman 22.11.2004 15:12

Заменил код, вставив строку:
if ($row["Rows"] > 550)

Неделю отработало номально. А вот сегоня вылезла новая проблема:
Critical Error

Could not connect to the database


Я подозреваю что это происходит в момент переполнения переменной, в котрой хранится кол-во сессий. Если это так, то хочу увеличить макисмальное значение до 2500, но не могу понять как сделать:
ALTER TABLE phpbb_sessions MAX_ROWS = 2500;

Помогите, pls, решить проблему

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

DJ Sample писал(а):На эту тему есть мод, называется "max_sessions", от Niels'a, с помощью которого можно выбрать кол-во сессий на IP и общее кол-во, вроде работает.

А где такой мод берется?
Netman
phpBB 1.2.0
 
Сообщения: 19
Зарегистрирован: 16.11.2004 14:51
Откуда: Minsk

Сообщение Xpert 22.11.2004 15:19

Netman
Указанная тобой ошибка - признак невозможности подключения к базе. Такое бывает вызвано, например тем, что хостер ограничивает кол-во одновременных коннектов к БД.

Мод можно взять, например, в нашей коллекции модов, категория Безопасность.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Xpert
phpBB Guru
 
Сообщения: 5710
Зарегистрирован: 13.03.2004 22:27
Откуда: msk.ru

Сообщение DJ Sample 16.12.2004 20:40

Хм, в последнее время у меня эта ошибка вдруг начала вылазить.
Уже и ставлю в настройках в админке максимум юзеров по IP - 100, и тем не менее, частенько вылазит, приходится чистить таблицу с сессиями.
Причём, чем больше число ставлю, тем больше вижу в админке юзера с одного IP, а конкретно - пресловутого яндексового робота. Около 50-ти подключений к разным местам форума, не менее.

И что поделать, не знаю даже... :cry:
Наверное надо в robots.txt запрещать его, так думаю...
Tranceaddicted
DJ Sample
phpBB 2.0.2
 
Сообщения: 151
Зарегистрирован: 02.06.2004 14:35

Сообщение alexenin 17.12.2004 8:45

вот оно та же петруха, только с удалением
Код: Выделить всё
phpBB : Critical Error

Error clearing sessions table

DEBUG MODE

SQL Error : 1034 Incorrect key file for table: 'phpbb_sessions'. Try to repair it

DELETE FROM phpbb_sessions WHERE session_time < 1103247790 AND session_id <> '3b4c5bd7641aca64bb833cc9a8197302'

Line : 302
File : /home/nixdev_user/stc/www/forum/includes/sessions.php


еще была паника на файл phpbb_sessions.MYI

2.0.11
Спасибо. Нет-нет, все равно спасибо.
Аватара пользователя
alexenin
phpBB 1.2.1
 
Сообщения: 29
Зарегистрирован: 03.07.2004 15:16

Сообщение crash 17.12.2004 8:47

alexenin попробуйте починить таблицу
Как правильно задавать вопросы
Для особо одаренных: поиск - это есть круто.
FAQ v.2 | FAQ v.3 | Шаблон запроса
Аватара пользователя
crash
Support Team Leader
 
Сообщения: 6534
Зарегистрирован: 07.07.2004 17:12
Откуда: Мирный

Сообщение alexenin 17.12.2004 8:49

был бы признателен в подсказке как это сделать?
Спасибо. Нет-нет, все равно спасибо.
Аватара пользователя
alexenin
phpBB 1.2.1
 
Сообщения: 29
Зарегистрирован: 03.07.2004 15:16

Сообщение crash 17.12.2004 8:50

с помощью phpmyadmin и можно вообще очистить ту таблицу
Как правильно задавать вопросы
Для особо одаренных: поиск - это есть круто.
FAQ v.2 | FAQ v.3 | Шаблон запроса
Аватара пользователя
crash
Support Team Leader
 
Сообщения: 6534
Зарегистрирован: 07.07.2004 17:12
Откуда: Мирный

Сообщение alexenin 17.12.2004 9:25

пробывал удалять через вебмин, не удаляет

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

crash, спасибо, починил :D
Спасибо. Нет-нет, все равно спасибо.
Аватара пользователя
alexenin
phpBB 1.2.1
 
Сообщения: 29
Зарегистрирован: 03.07.2004 15:16

След.

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

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

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