1 頁 (共 1 頁)

[教學] 'phpbb_sessions' is full

發表於 : 2003-05-04 23:03
Mac
'phpbb_sessions' is full 錯誤訊息例子
phpBB : Critical Error 寫:Error creating new session

DEBUG \r

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 ('544c13e2eea831bb6402a4b35f78e96a', -1, 1041341439, 1041341439, '7f000001', 0, 0)

Line : 152
File : /usr/local/apache/html/phpBB/includes/sessions.php
修正
* 在進行修正前請備份你的資料庫(或至少 sessions table)和所有 phpbb 檔案(或至少 includes/sessions.php)

方法一:自動清空 sessions table(Automatic table emptying script)
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); 
}
方法二:手動清空 sessions table(Emptying the table manually)
使用 phpMyAdmin - 在 phpbb_sessions 欄位裡按下 Empty,然後選擇 OK 清空欄位
你將會看到\r
phpMyAdmin 寫:Do you really want to :
DELETE FROM `phpbb_sessions`
使用 command line - 鍵入\r
command line 寫:DELETE FROM phpbb_sessions;
如果您的 phpbb 資料表使用其他名稱請自行更改\r

方法三:限制一個 IP 可以擁有的 session(Limiting the number of sessions per IP)
這個方法適用於如果同一個用戶產生過多的 session (Sessions table flooding)

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); 
            } 
        }

如何限制 sessions 數量
尋找:
includes/sessions.php 寫:if($numrows['numrows'] > 4)
如果要刪除當一個用戶擁有超過 10 個 sessions 時,把數字改成:
includes/sessions.php 寫:if($numrows['numrows'] > 10)
方法四:增加 table 可容納的數量(Increasing the table's MAX_ROWS)
這是個治標不治本的方法,這個修正可以增加 sessions table 可容納的 sessions 數量,但是仍然可能出現 'phpbb_sessions' is full 的問題
使用 phpMyAdmin - 在 SQL 裡鍵入\r
MySQL 寫:ALTER TABLE phpbb_sessions MAX_ROWS = 2500;
使用 command line - 鍵入\r
command line 寫:ALTER TABLE phpbb_sessions MAX_ROWS = 2500;
紅色數字的部分請自行更改\r
如果您的 phpbb 資料表使用其他名稱請自行更改\r

方法五:把 phpbb_sessions 從 HEAP 改成 MyISAM(Making the table's type MyISAM)
照官網的說法,這應該是最後(其他修正都沒有用時)才使用的修正法
使用 phpMyAdmin - 在 phpbb_sessions 裡選擇 Properties -> Options,在 Table type 裡選擇 MyISAM

使用 command line - 鍵入\r
command line 寫:ALTER TABLE phpbb_sessions TYPE = MYISAM;
如果您的 phpbb 資料表使用其他名稱請自行更改\r

官方原文: http://www.phpbb.com/kb/article.php?article_id=42

~Mac