Este o eroare la crearea unei noi sesiuni. Sesiunile nu sunt altceva decât informaţii care urmăresc incursiunile utilizatorilor in forum. Acestea pot oferii informaţii despre permisiunile unui utilizator într-un forum, despre paginile pe care le vizualizează sau despre IP-ul acestuia (din Panoul de Control al Administratorului). Aceste sesiuni se gasesc în doua locuri:
1) client - este localizată în computer-ul utilizatorului într-un cookie.
2) server – este localizată pe server, într-o bază de date generând tabelul phpbb_sessions (standard). Aici apar toate problemele
Tabele phpBB sunt de tip HEAP, nu MyISAM; avantajul primului tip este ca se folosesc de memoria serverului nu de hard-disc-ul acestora - pentru a fi stocate - fiind mult mai rapide. Singurele părţi ale tabelelor HEAP stocate pe server sunt coloanele şi definiţiile acestora, stocate într-un fişier cu extensia *.frm. Un alt punc important al acestor tipuri de bază de date este aceela că atunci când MySQL-lul este “pierdut” sau restartat informaţiile HEAP sunt pierdute pe când cele MyISAM sunt păstrate pe hard.
Sunt câteva tipuri de rezolvare ale acestei probleme.
1) Îţi faci
backup la baza de date şi la fişiere
Deschizi într-un editor text fişierul includes/sessions.php şi cauţi linia:
Cod: Selectaţi tot
message_die(CRITICAL_ERROR, 'Error creating new session', '', __LINE__, __FILE__, $sql);
această linie o vei înlocui cu:
Cod: Selectaţi tot
$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);
}
Acest script va şterge cele mai vechi 50 de rânduri.
2) Stergi tot tabelul phpbb_sessions (standard)
Pentru a executa această operaţiune din SQL:
3) Sa limitezi numărul de sesiuni per IP
Deschizi includes/sessions.php cu un editor text cauţi liniile:
Cod: Selectaţi tot
//
// 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));
După aceasta adaugă:
$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);
}
}
4) Ultimul lucru pe care ar trebui să îl faci este să transformi phpbb_sessions în MYISAM
Fişierele se vor crea pe server, ele ocupând undeva pe la 2 - 4Gb standard.
Din SQL execută:
MySQL: tabelele HEAP - Documentaţie despre tipul HEAP al tabelelor MySQL.
MySQL: The table is full Error - all the possible reasons for receiving a 'table is full' error.