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

Error creating new session

Проблемы с установкой или работой phpBB 2.0.x? Ищите ответы здесь!
Netman
phpBB 1.2.0
Сообщения: 19
Стаж: 19 лет 5 месяцев
Откуда: Minsk

Error creating new session

Сообщение Netman »

Форум рабоатет уже второй год.
Возникает ошибка все чаще и чаще:
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 раз.
Konkere

Сообщение Konkere »

Netman
phpBB 1.2.0
Сообщения: 19
Стаж: 19 лет 5 месяцев
Откуда: Minsk

Сообщение Netman »

Спасибо за ссылку. Не очень силен в английском. Если кто-то поможет русской ссылкой или кратким описанием проблемы на русском языке - буду благодарен.
А пока распечатаю, возьму словарик и начну переводить :cry:
Konkere

Сообщение Konkere »

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;
Netman
phpBB 1.2.0
Сообщения: 19
Стаж: 19 лет 5 месяцев
Откуда: Minsk

Сообщение Netman »

С помощью словаря прочитал статью. Вроде все понял, кроме одного. В причинах ошибки пишется:
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?
Konkere

Сообщение Konkere »

Netman
по всей видимости предпологается, что размер MAX_ROWS уже увеличен до 2500
DJ Sample
phpBB 1.4.4
Сообщения: 156
Стаж: 19 лет 10 месяцев

Сообщение DJ Sample »

На эту тему есть мод, называется "max_sessions", от Niels'a, с помощью которого можно выбрать кол-во сессий на IP и общее кол-во, вроде работает.
Netman
phpBB 1.2.0
Сообщения: 19
Стаж: 19 лет 5 месяцев
Откуда: Minsk

Сообщение Netman »

Заменил код, вставив строку:
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 и общее кол-во, вроде работает.
А где такой мод берется?
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

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

Мод можно взять, например, в нашей коллекции модов, категория Безопасность.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
DJ Sample
phpBB 1.4.4
Сообщения: 156
Стаж: 19 лет 10 месяцев

Сообщение DJ Sample »

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

И что поделать, не знаю даже... :cry:
Наверное надо в robots.txt запрещать его, так думаю...
Аватара пользователя
alexenin
phpBB 1.2.1
Сообщения: 27
Стаж: 19 лет 9 месяцев

Сообщение alexenin »

вот оно та же петруха, только с удалением

Код: Выделить всё

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
Очень не удобный стал стиль форума...
И в профиле, как всегда, без выбора.
Аватара пользователя
crash
Former team member
Сообщения: 6517
Стаж: 19 лет 9 месяцев
Откуда: Бердск

Сообщение crash »

alexenin попробуйте починить таблицу
Как правильно задавать вопросы
Для особо одаренных: поиск - это есть круто.
FAQ v.2 | FAQ v.3 | Шаблон запроса
Аватара пользователя
alexenin
phpBB 1.2.1
Сообщения: 27
Стаж: 19 лет 9 месяцев

Сообщение alexenin »

был бы признателен в подсказке как это сделать?
Очень не удобный стал стиль форума...
И в профиле, как всегда, без выбора.
Аватара пользователя
crash
Former team member
Сообщения: 6517
Стаж: 19 лет 9 месяцев
Откуда: Бердск

Сообщение crash »

с помощью phpmyadmin и можно вообще очистить ту таблицу
Как правильно задавать вопросы
Для особо одаренных: поиск - это есть круто.
FAQ v.2 | FAQ v.3 | Шаблон запроса
Аватара пользователя
alexenin
phpBB 1.2.1
Сообщения: 27
Стаж: 19 лет 9 месяцев

Сообщение alexenin »

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

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

crash, спасибо, починил :D
Очень не удобный стал стиль форума...
И в профиле, как всегда, без выбора.

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