00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 if (!defined('_ADODB_LAYER')) {
00100 include (dirname(__FILE__).'/adodb.inc.php');
00101 }
00102
00103 if (!defined('ADODB_SESSION')) {
00104
00105 define('ADODB_SESSION',1);
00106
00107
00108 define('ADODB_SESSION_SYNCH_SECS',60);
00109
00110
00111
00112
00113 function adodb_session_regenerate_id()
00114 {
00115 $conn =& ADODB_Session::_conn();
00116 if (!$conn) return false;
00117
00118 $old_id = session_id();
00119 if (function_exists('session_regenerate_id')) {
00120 session_regenerate_id();
00121 } else {
00122 session_id(md5(uniqid(rand(), true)));
00123 $ck = session_get_cookie_params();
00124 setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
00125
00126 }
00127 $new_id = session_id();
00128 $ok =& $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
00129
00130
00131 if (!$ok) {
00132 session_id($old_id);
00133 if (empty($ck)) $ck = session_get_cookie_params();
00134 setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
00135 return false;
00136 }
00137
00138 return true;
00139 }
00140
00141
00142
00143
00144 GLOBAL $ADODB_SESSION_CONNECT,
00145 $ADODB_SESSION_DRIVER,
00146 $ADODB_SESSION_USER,
00147 $ADODB_SESSION_PWD,
00148 $ADODB_SESSION_DB,
00149 $ADODB_SESS_CONN,
00150 $ADODB_SESS_LIFE,
00151 $ADODB_SESS_DEBUG,
00152 $ADODB_SESSION_EXPIRE_NOTIFY,
00153 $ADODB_SESSION_CRC,
00154 $ADODB_SESSION_TBL;
00155
00156
00157 $ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime');
00158 if ($ADODB_SESS_LIFE <= 1) {
00159
00160
00161 $ADODB_SESS_LIFE=1440;
00162 }
00163 $ADODB_SESSION_CRC = false;
00164
00165
00167
00169
00170 if (empty($ADODB_SESSION_DRIVER)) {
00171 $ADODB_SESSION_DRIVER='mysql';
00172 $ADODB_SESSION_CONNECT='localhost';
00173 $ADODB_SESSION_USER ='root';
00174 $ADODB_SESSION_PWD ='';
00175 $ADODB_SESSION_DB ='xphplens_2';
00176 }
00177
00178 if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) {
00179 $ADODB_SESSION_EXPIRE_NOTIFY = false;
00180 }
00181
00182 if (empty($ADODB_SESSION_TBL)){
00183 $ADODB_SESSION_TBL = 'sessions';
00184 }
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 function adodb_sess_open($save_path, $session_name,$persist=true)
00205 {
00206 GLOBAL $ADODB_SESS_CONN;
00207 if (isset($ADODB_SESS_CONN)) return true;
00208
00209 GLOBAL $ADODB_SESSION_CONNECT,
00210 $ADODB_SESSION_DRIVER,
00211 $ADODB_SESSION_USER,
00212 $ADODB_SESSION_PWD,
00213 $ADODB_SESSION_DB,
00214 $ADODB_SESS_DEBUG;
00215
00216
00217 $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER);
00218 if (!empty($ADODB_SESS_DEBUG)) {
00219 $ADODB_SESS_CONN->debug = true;
00220 ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB ");
00221 }
00222 if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT,
00223 $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
00224 else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT,
00225 $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
00226
00227 if (!$ok) ADOConnection::outp( "
00228 -- Session: connection failed</p>",false);
00229 }
00230
00231
00232
00233
00234 function adodb_sess_close()
00235 {
00236 global $ADODB_SESS_CONN;
00237
00238 if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close();
00239 return true;
00240 }
00241
00242
00243
00244
00245 function adodb_sess_read($key)
00246 {
00247 global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC;
00248
00249 $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time());
00250 if ($rs) {
00251 if ($rs->EOF) {
00252 $v = '';
00253 } else
00254 $v = rawurldecode(reset($rs->fields));
00255
00256 $rs->Close();
00257
00258
00259 $ADODB_SESSION_CRC = strlen($v).crc32($v);
00260
00261 return $v;
00262 }
00263
00264 return '';
00265 }
00266
00267
00268
00269
00270
00271
00272 function adodb_sess_write($key, $val)
00273 {
00274 global
00275 $ADODB_SESS_CONN,
00276 $ADODB_SESS_LIFE,
00277 $ADODB_SESSION_TBL,
00278 $ADODB_SESS_DEBUG,
00279 $ADODB_SESSION_CRC,
00280 $ADODB_SESSION_EXPIRE_NOTIFY;
00281
00282 $expiry = time() + $ADODB_SESS_LIFE;
00283
00284
00285
00286 if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) {
00287 if ($ADODB_SESS_DEBUG) echo "
00288 -- Session: Only updating date - crc32 not changed</p>";
00289 $qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time();
00290 $rs = $ADODB_SESS_CONN->Execute($qry);
00291 return true;
00292 }
00293 $val = rawurlencode($val);
00294
00295 $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val);
00296 if ($ADODB_SESSION_EXPIRE_NOTIFY) {
00297 $var = reset($ADODB_SESSION_EXPIRE_NOTIFY);
00298 global $$var;
00299 $arr['expireref'] = $$var;
00300 }
00301 $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,$arr,
00302 'sesskey',$autoQuote = true);
00303
00304 if (!$rs) {
00305 ADOConnection::outp( '
00306 -- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'</p>',false);
00307 } else {
00308
00309
00310 if ($ADODB_SESS_CONN->databaseType == 'access')
00311 $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'");
00312 }
00313 return !empty($rs);
00314 }
00315
00316 function adodb_sess_destroy($key)
00317 {
00318 global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
00319
00320 if ($ADODB_SESSION_EXPIRE_NOTIFY) {
00321 reset($ADODB_SESSION_EXPIRE_NOTIFY);
00322 $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
00323 $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
00324 $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
00325 $ADODB_SESS_CONN->SetFetchMode($savem);
00326 if ($rs) {
00327 $ADODB_SESS_CONN->BeginTrans();
00328 while (!$rs->EOF) {
00329 $ref = $rs->fields[0];
00330 $key = $rs->fields[1];
00331 $fn($ref,$key);
00332 $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
00333 $rs->MoveNext();
00334 }
00335 $ADODB_SESS_CONN->CommitTrans();
00336 }
00337 } else {
00338 $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'";
00339 $rs = $ADODB_SESS_CONN->Execute($qry);
00340 }
00341 return $rs ? true : false;
00342 }
00343
00344 function adodb_sess_gc($maxlifetime)
00345 {
00346 global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
00347
00348 if ($ADODB_SESSION_EXPIRE_NOTIFY) {
00349 reset($ADODB_SESSION_EXPIRE_NOTIFY);
00350 $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
00351 $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
00352 $t = time();
00353 $rs =& $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t");
00354 $ADODB_SESS_CONN->SetFetchMode($savem);
00355 if ($rs) {
00356 $ADODB_SESS_CONN->BeginTrans();
00357 while (!$rs->EOF) {
00358 $ref = $rs->fields[0];
00359 $key = $rs->fields[1];
00360 $fn($ref,$key);
00361 $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
00362 $rs->MoveNext();
00363 }
00364 $rs->Close();
00365
00366 $ADODB_SESS_CONN->CommitTrans();
00367
00368 }
00369 } else {
00370 $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time();
00371 $ADODB_SESS_CONN->Execute($qry);
00372
00373 if ($ADODB_SESS_DEBUG) ADOConnection::outp("
00374 -- <b>Garbage Collection</b>: $qry</p>");
00375 }
00376
00377 if (defined('ADODB_SESSION_OPTIMIZE')) {
00378 global $ADODB_SESSION_DRIVER;
00379
00380 switch( $ADODB_SESSION_DRIVER ) {
00381 case 'mysql':
00382 case 'mysqlt':
00383 $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL;
00384 break;
00385 case 'postgresql':
00386 case 'postgresql7':
00387 $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL;
00388 break;
00389 }
00390 if (!empty($opt_qry)) {
00391 $ADODB_SESS_CONN->Execute($opt_qry);
00392 }
00393 }
00394 if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL;
00395 else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL;
00396
00397 $rs =& $ADODB_SESS_CONN->SelectLimit($sql,1);
00398 if ($rs && !$rs->EOF) {
00399
00400 $dbts = reset($rs->fields);
00401 $rs->Close();
00402 $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts);
00403 $t = time();
00404
00405 if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) {
00406
00407 $msg =
00408 __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)";
00409 error_log($msg);
00410 if ($ADODB_SESS_DEBUG) ADOConnection::outp("
00411 -- $msg</p>");
00412 }
00413 }
00414
00415 return true;
00416 }
00417
00418 session_module_name('user');
00419 session_set_save_handler(
00420 "adodb_sess_open",
00421 "adodb_sess_close",
00422 "adodb_sess_read",
00423 "adodb_sess_write",
00424 "adodb_sess_destroy",
00425 "adodb_sess_gc");
00426 }
00427
00428
00429
00430 if (0) {
00431
00432 session_start();
00433 session_register('AVAR');
00434 $_SESSION['AVAR'] += 1;
00435 ADOConnection::outp( "
00436 -- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>",false);
00437 }
00438
00439 ?>