function gc($maxlifetime) { $conn =& ADODB_Session::_conn(); $debug = ADODB_Session::debug(); $expire_notify = ADODB_Session::expireNotify(); $optimize = ADODB_Session::optimize(); $sync_seconds = ADODB_Session::syncSeconds(); $table = ADODB_Session::table(); if (!$conn) { return false; } $time = time(); $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; if ($expire_notify) { reset($expire_notify); $fn = next($expire_notify); $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); $sql = "SELECT expireref, sesskey FROM {$table} WHERE expiry < {$time}"; $rs =& $conn->Execute($sql); ADODB_Session::_dumprs($rs); $conn->SetFetchMode($savem); if ($rs) { $conn->StartTrans(); $keys = array(); while (!$rs->EOF) { $ref = $rs->fields[0]; $key = $rs->fields[1]; $fn($ref, $key); $del = $conn->Execute("DELETE FROM {$table} WHERE sesskey=" . $conn->Param('0'), array($key)); $rs->MoveNext(); } $rs->Close(); $conn->CompleteTrans(); } } else { if (1) { $sql = "SELECT sesskey FROM {$table} WHERE expiry < {$time}"; $arr =& $conn->GetAll($sql); foreach ($arr as $row) { $sql2 = "DELETE FROM {$table} WHERE sesskey=" . $conn->Param('0'); $conn->Execute($sql2, array($row[0])); } } else { $sql = "DELETE FROM {$table} WHERE expiry < {$time}"; $rs =& $conn->Execute($sql); ADODB_Session::_dumprs($rs); if ($rs) { $rs->Close(); } } if ($debug) { ADOConnection::outp("<p><b>Garbage Collection</b>: {$sql}</p>"); } } // suggested by Cameron, "GaM3R" <*****@*****.**> if ($optimize) { $driver = ADODB_Session::driver(); if (preg_match('/mysql/i', $driver)) { $sql = "OPTIMIZE TABLE {$table}"; } if (preg_match('/postgres/i', $driver)) { $sql = "VACUUM {$table}"; } if (!empty($sql)) { $conn->Execute($sql); } } if ($sync_seconds) { $sql = 'SELECT '; if ($conn->dataProvider === 'oci8') { $sql .= "TO_CHAR({$conn->sysTimeStamp}, 'RRRR-MM-DD HH24:MI:SS')"; } else { $sql .= $conn->sysTimeStamp; } $sql .= " FROM {$table}"; $rs =& $conn->SelectLimit($sql, 1); if ($rs && !$rs->EOF) { $dbts = reset($rs->fields); $rs->Close(); $dbt = $conn->UnixTimeStamp($dbts); $t = time(); if (abs($dbt - $t) >= $sync_seconds) { $msg = __FILE__ . ": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: " . " database={$dbt} ({$dbts}), webserver={$t} (diff=" . abs($dbt - $t) / 60 . ' minutes)'; error_log($msg); if ($debug) { ADOConnection::outp("<p>{$msg}</p>"); } } } } return true; }
function gc($maxlifetime) { $conn =& ADODB_Session::_conn(); $debug = ADODB_Session::debug(); $expire_notify = ADODB_Session::expireNotify(); $optimize = ADODB_Session::optimize(); $table = ADODB_Session::table(); if (!$conn) { return false; } //assert('$table'); $time = $conn->sysTimeStamp; $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; if ($expire_notify) { reset($expire_notify); $fn = next($expire_notify); $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); $sql = "SELECT expireref, sesskey FROM {$table} WHERE expiry < {$time}"; $rs =& $conn->Execute($sql); ADODB_Session::_dumprs($rs); $conn->SetFetchMode($savem); if ($rs) { $conn->StartTrans(); $keys = array(); while (!$rs->EOF) { $ref = $rs->fields[0]; $key = $rs->fields[1]; $fn($ref, $key); $del = $conn->Execute("DELETE FROM {$table} WHERE sesskey=" . $conn->Param('0'), array($key)); $rs->MoveNext(); } $rs->Close(); $conn->CompleteTrans(); } } else { if (0) { $sql = "SELECT sesskey FROM {$table} WHERE expiry < {$time}"; $arr =& $conn->GetAll($sql); foreach ($arr as $row) { $sql2 = "DELETE FROM {$table} WHERE sesskey=" . $conn->Param('0'); $conn->Execute($sql2, array(reset($row))); } } else { $sql = "DELETE FROM {$table} WHERE expiry < {$time}"; $rs =& $conn->Execute($sql); ADODB_Session::_dumprs($rs); if ($rs) { $rs->Close(); } } if ($debug) { ADOConnection::outp("<p><b>Garbage Collection</b>: {$sql}</p>"); } } // suggested by Cameron, "GaM3R" <*****@*****.**> if ($optimize) { $driver = ADODB_Session::driver(); if (preg_match('/mysql/i', $driver)) { $sql = "OPTIMIZE TABLE {$table}"; } if (preg_match('/postgres/i', $driver)) { $sql = "VACUUM {$table}"; } if (!empty($sql)) { $conn->Execute($sql); } } return true; }
static function gc($maxlifetime) { $conn = ADODB_Session::_conn(); $debug = ADODB_Session::debug(); $expire_notify = ADODB_Session::expireNotify(); $optimize = ADODB_Session::optimize(); $table = ADODB_Session::table(); if (!$conn) { return false; } $debug = ADODB_Session::debug(); if ($debug) { $conn->debug = 1; $COMMITNUM = 2; } else { $COMMITNUM = 20; } //assert('$table'); $time = $conn->OffsetDate(-$maxlifetime / 24 / 3600, $conn->sysTimeStamp); $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : ''; if ($expire_notify) { reset($expire_notify); $fn = next($expire_notify); } else { $fn = false; } $savem = $conn->SetFetchMode(ADODB_FETCH_NUM); $sql = "SELECT expireref, sesskey FROM {$table} WHERE expiry < {$time} ORDER BY 2"; # add order by to prevent deadlock $rs = $conn->SelectLimit($sql, 1000); if ($debug) { ADODB_Session::_dumprs($rs); } $conn->SetFetchMode($savem); if ($rs) { $tr = $conn->hasTransactions; if ($tr) { $conn->BeginTrans(); } $keys = array(); $ccnt = 0; while (!$rs->EOF) { $ref = $rs->fields[0]; $key = $rs->fields[1]; if ($fn) { $fn($ref, $key); } $del = $conn->Execute("DELETE FROM {$table} WHERE sesskey=" . $conn->Param('0'), array($key)); $rs->MoveNext(); $ccnt += 1; if ($tr && $ccnt % $COMMITNUM == 0) { if ($debug) { echo "Commit<br>\n"; } $conn->CommitTrans(); $conn->BeginTrans(); } } $rs->Close(); if ($tr) { $conn->CommitTrans(); } } // suggested by Cameron, "GaM3R" <*****@*****.**> if ($optimize) { $driver = ADODB_Session::driver(); if (preg_match('/mysql/i', $driver)) { $sql = "OPTIMIZE TABLE {$table}"; } if (preg_match('/postgres/i', $driver)) { $sql = "VACUUM {$table}"; } if (!empty($sql)) { $conn->Execute($sql); } } return true; }
$ADODB_SESSION_DRIVER = $driver; $ADODB_SESSION_PWD = $password; $ADODB_SESSION_TBL = $table; $ADODB_SESSION_USER = $user; $ADODB_SESSION_USE_LOBS = $clob; $ADODB_SESS_DEBUG = $debug; $ADODB_SESS_LIFE = $lifetime; if ($optimize) { define('ADODB_SESSION_OPTIMIZE', $optimize); } define('ADODB_SESSION_SYNCH_SECS', $sync_seconds); if (class_exists('ADODB_Session')) { ADODB_Session::clob($clob); ADODB_Session::dataFieldName($data_field_name); ADODB_Session::database($database); ADODB_Session::debug($debug); ADODB_Session::driver($driver); ADODB_Session::filter($filters); ADODB_Session::host($host); ADODB_Session::lifetime($lifetime); ADODB_Session::optimize($optimize); ADODB_Session::password($password); ADODB_Session::syncSeconds($sync_seconds); ADODB_Session::table($table); ADODB_Session::user($user); } function NotifyFn($var, $sesskey) { echo "NotifyFn({$var}, {$sesskey}) called<br />\n"; } if ($expire_notify) {