Changeset 3e48d2ee in github for program/include/session.inc


Ignore:
Timestamp:
Nov 21, 2008 1:19:30 PM (4 years ago)
Author:
alecpl <alec@…>
Branches:
master, HEAD, courier-fix, dev-browser-capabilities, pdo, release-0.6, release-0.7, release-0.8
Children:
dcf780a
Parents:
be7d3b6
Message:
  • Increase speed of session destroy and garbage clean up
  • Fix session timeout when DB server got clock skew (#1485490)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • program/include/session.inc

    ra2740628 r3e48d2ee  
    7676    $key); 
    7777 
     78  $now = $DB->fromunixtime(time()); 
     79 
    7880  if ($DB->num_rows($sql_result)) { 
    7981    $DB->query( 
    8082      "UPDATE " . get_table_name('session') . " 
    81        SET    vars=?, changed=" . $DB->now() . " 
     83       SET    vars=?, changed= " . $now . " 
    8284       WHERE  sess_id=?", 
    8385      $vars, 
     
    8890      "INSERT INTO " . get_table_name('session') . " 
    8991       (sess_id, vars, ip, created, changed) 
    90        VALUES (?, ?, ?, ".$DB->now().", ".$DB->now().")", 
     92       VALUES (?, ?, ?, " . $now . ", " . $now .")", 
    9193      $key, 
    9294      $vars, 
     
    108110  } 
    109111 
     112  $DB->query("DELETE FROM " . get_table_name('session') . " WHERE sess_id=?", $key); 
     113 
     114  // delete session entries in cache table 
     115  // on databases wthout foreign keys 
     116  if ($rcmail->config->get('enable_caching') && $DB->db_provider != 'pgsql') { 
     117    $DB->query("DELETE FROM " . get_table_name('cache') . " WHERE session_id=?", $key); 
     118  } 
     119 
     120  return true; 
     121} 
     122 
     123 
     124// garbage collecting function 
     125function rcube_sess_gc($maxlifetime) 
     126{ 
     127  $rcmail = rcmail::get_instance(); 
     128  $DB = $rcmail->get_dbh(); 
     129 
     130  if ($DB->is_error()) { 
     131    return false; 
     132  } 
     133 
     134  $now = $DB->fromunixtime(time() - $maxlifetime); 
     135 
    110136  // delete session entries in cache table 
    111137  if ($rcmail->config->get('enable_caching')) { 
    112     $DB->query("DELETE FROM " . get_table_name('cache') . " WHERE session_id=?", $key); 
    113   } 
    114                
    115   $DB->query("DELETE FROM " . get_table_name('session') . " WHERE sess_id=?", $key); 
    116  
    117   return true; 
    118 } 
    119  
    120  
    121 // garbage collecting function 
    122 function rcube_sess_gc($maxlifetime) 
    123 { 
    124   $rcmail = rcmail::get_instance(); 
    125   $DB = $rcmail->get_dbh(); 
    126  
    127   if ($DB->is_error()) { 
    128     return false; 
    129   } 
    130  
    131   if ($rcmail->config->get('enable_caching')) { 
    132     // get all expired sessions 
    133     $sql_result = $DB->query( 
    134         "SELECT sess_id 
    135         FROM " . get_table_name('session') . " 
    136         WHERE " . $DB->unixtimestamp($DB->now())."-".$DB->unixtimestamp('changed') . " > ?", 
    137         $maxlifetime); 
    138                                     
    139     $exp_sessions = array(); 
    140     while ($sql_arr = $DB->fetch_assoc($sql_result)) { 
    141       $exp_sessions[] = $sql_arr['sess_id']; 
     138 
     139    // on databases wthout foreign keys... 
     140    if($DB->db_provider != 'pgsql') { 
     141 
     142      // get all expired sessions 
     143      $sql_result = $DB->query( 
     144        "SELECT sess_id FROM " . get_table_name('session') . " 
     145            WHERE changed < " . $now); 
     146 
     147      $exp_sessions = array(); 
     148      while ($sql_arr = $DB->fetch_assoc($sql_result)) { 
     149        $exp_sessions[] = $sql_arr['sess_id']; 
     150      } 
     151 
     152      if (sizeof($exp_sessions)) { 
     153        $exp_sessions = "'" . join("','", $exp_sessions) . "'"; 
     154        // delete session cache records 
     155        $DB->query("DELETE FROM " . get_table_name('cache') . " 
     156            WHERE session_id IN (" . $exp_sessions . ")"); 
     157      } 
    142158    } 
    143  
    144     if (sizeof($exp_sessions)) { 
    145       $exp_sessions = "'" . join("','", $exp_sessions) . "'"; 
    146       // delete session cache records 
    147       $DB->query("DELETE FROM " . get_table_name('cache') . " 
    148             WHERE session_id IN (" . $exp_sessions . ")"); 
    149  
    150       // delete session records 
    151       $DB->query("DELETE FROM " . get_table_name('session') . " 
    152             WHERE sess_id IN (" . $exp_sessions . ")"); 
    153     } 
    154  
    155159    // also run message cache GC 
    156160    rcmail_message_cache_gc(); 
    157    
    158   } else { 
    159     // just delete all expired sessions 
    160     $DB->query("DELETE FROM " . get_table_name('session') . " 
    161         WHERE " . $DB->unixtimestamp($DB->now())."-".$DB->unixtimestamp('changed') . " > ?", 
    162         $maxlifetime); 
    163   } 
     161  } 
     162 
     163  // just delete all expired sessions 
     164  $DB->query("DELETE FROM " . get_table_name('session') . " 
     165    WHERE changed < " . $now); 
    164166 
    165167  rcmail_temp_gc(); 
Note: See TracChangeset for help on using the changeset viewer.