C:/lib/adodb/session/adodb-session2.php Quellcode

adodb-session2.php
gehe zur Dokumentation dieser Datei
1 <?php
2 
3 
4 /*
5 V5.19dev ??-???-2014 (c) 2000-2014 John Lim (jlim#natsoft.com). All rights reserved.
6  Contributed by Ross Smith (adodb@netebb.com).
7  Released under both BSD license and Lesser GPL library license.
8  Whenever there is any discrepancy between the two licenses,
9  the BSD license will take precedence.
10  Set tabs to 4 for best viewing.
11 
12 
13 */
14 
15 /*
16 
17 CREATE Table SCripts
18 
19 Oracle
20 ======
21 
22 CREATE TABLE SESSIONS2
23 (
24  SESSKEY VARCHAR2(48 BYTE) NOT NULL,
25  EXPIRY DATE NOT NULL,
26  EXPIREREF VARCHAR2(200 BYTE),
27  CREATED DATE NOT NULL,
28  MODIFIED DATE NOT NULL,
29  SESSDATA CLOB,
30  PRIMARY KEY(SESSKEY)
31 );
32 
33 
34 CREATE INDEX SESS2_EXPIRY ON SESSIONS2(EXPIRY);
35 CREATE UNIQUE INDEX SESS2_PK ON SESSIONS2(SESSKEY);
36 CREATE INDEX SESS2_EXP_REF ON SESSIONS2(EXPIREREF);
37 
38 
39 
40  MySQL
41  =====
42 
43 CREATE TABLE sessions2(
44  sesskey VARCHAR( 64 ) NOT NULL DEFAULT '',
45  expiry TIMESTAMP NOT NULL ,
46  expireref VARCHAR( 250 ) DEFAULT '',
47  created TIMESTAMP NOT NULL ,
48  modified TIMESTAMP NOT NULL ,
49  sessdata LONGTEXT DEFAULT '',
50  PRIMARY KEY ( sesskey ) ,
51  INDEX sess2_expiry( expiry ),
52  INDEX sess2_expireref( expireref )
53 )
54 
55 
56 */
57 
58 if (!defined('_ADODB_LAYER')) {
59  require realpath(dirname(__FILE__) . '/../adodb.inc.php');
60 }
61 
62 if (defined('ADODB_SESSION')) return 1;
63 
64 define('ADODB_SESSION', dirname(__FILE__));
65 define('ADODB_SESSION2', ADODB_SESSION);
66 
67 /*
68  Unserialize session data manually. See http://phplens.com/lens/lensforum/msgs.php?id=9821
69 
70  From Kerr Schere, to unserialize session data stored via ADOdb.
71  1. Pull the session data from the db and loop through it.
72  2. Inside the loop, you will need to urldecode the data column.
73  3. After urldecode, run the serialized string through this function:
74 
75 */
76 function adodb_unserialize( $serialized_string )
77 {
78  $variables = array( );
79  $a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
80  for( $i = 0; $i < count( $a ); $i = $i+2 ) {
81  $variables[$a[$i]] = unserialize( $a[$i+1] );
82  }
83  return( $variables );
84 }
85 
86 /*
87  Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1
88  Since adodb 4.61.
89 */
91 {
92  $conn = ADODB_Session::_conn();
93  if (!$conn) return false;
94 
95  $old_id = session_id();
96  if (function_exists('session_regenerate_id')) {
97  session_regenerate_id();
98  } else {
99  session_id(md5(uniqid(rand(), true)));
100  $ck = session_get_cookie_params();
101  setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
102  //@session_start();
103  }
104  $new_id = session_id();
105  $ok = $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
106 
107  /* it is possible that the update statement fails due to a collision */
108  if (!$ok) {
109  session_id($old_id);
110  if (empty($ck)) $ck = session_get_cookie_params();
111  setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
112  return false;
113  }
114 
115  return true;
116 }
117 
118 /*
119  Generate database table for session data
120  @see http://phplens.com/lens/lensforum/msgs.php?id=12280
121  @return 0 if failure, 1 if errors, 2 if successful.
122  @author Markus Staab http://www.public-4u.de
123 */
124 function adodb_session_create_table($schemaFile=null,$conn = null)
125 {
126  // set default values
127  if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema2.xml';
128  if ($conn===null) $conn = ADODB_Session::_conn();
129 
130  if (!$conn) return 0;
131 
132  $schema = new adoSchema($conn);
133  $schema->ParseSchema($schemaFile);
134  return $schema->ExecuteSchema();
135 }
136 
140 class ADODB_Session {
142  // getter/setter methods
144 
145  /*
146 
147  function Lock($lock=null)
148  {
149  static $_lock = false;
150 
151  if (!is_null($lock)) $_lock = $lock;
152  return $lock;
153  }
154  */
157  static function driver($driver = null)
158  {
159  static $_driver = 'mysql';
160  static $set = false;
161 
162  if (!is_null($driver)) {
163  $_driver = trim($driver);
164  $set = true;
165  } elseif (!$set) {
166  // backwards compatibility
167  if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) {
168  return $GLOBALS['ADODB_SESSION_DRIVER'];
169  }
170  }
171 
172  return $_driver;
173  }
174 
177  static function host($host = null) {
178  static $_host = 'localhost';
179  static $set = false;
180 
181  if (!is_null($host)) {
182  $_host = trim($host);
183  $set = true;
184  } elseif (!$set) {
185  // backwards compatibility
186  if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) {
187  return $GLOBALS['ADODB_SESSION_CONNECT'];
188  }
189  }
190 
191  return $_host;
192  }
193 
196  static function user($user = null)
197  {
198  static $_user = 'root';
199  static $set = false;
200 
201  if (!is_null($user)) {
202  $_user = trim($user);
203  $set = true;
204  } elseif (!$set) {
205  // backwards compatibility
206  if (isset($GLOBALS['ADODB_SESSION_USER'])) {
207  return $GLOBALS['ADODB_SESSION_USER'];
208  }
209  }
210 
211  return $_user;
212  }
213 
216  static function password($password = null)
217  {
218  static $_password = '';
219  static $set = false;
220 
221  if (!is_null($password)) {
222  $_password = $password;
223  $set = true;
224  } elseif (!$set) {
225  // backwards compatibility
226  if (isset($GLOBALS['ADODB_SESSION_PWD'])) {
227  return $GLOBALS['ADODB_SESSION_PWD'];
228  }
229  }
230 
231  return $_password;
232  }
233 
236  static function database($database = null)
237  {
238  static $_database = '';
239  static $set = false;
240 
241  if (!is_null($database)) {
242  $_database = trim($database);
243  $set = true;
244  } elseif (!$set) {
245  // backwards compatibility
246  if (isset($GLOBALS['ADODB_SESSION_DB'])) {
247  return $GLOBALS['ADODB_SESSION_DB'];
248  }
249  }
250  return $_database;
251  }
252 
255  static function persist($persist = null)
256  {
257  static $_persist = true;
258 
259  if (!is_null($persist)) {
260  $_persist = trim($persist);
261  }
262 
263  return $_persist;
264  }
265 
268  static function lifetime($lifetime = null)
269  {
270  static $_lifetime;
271  static $set = false;
272 
273  if (!is_null($lifetime)) {
274  $_lifetime = (int) $lifetime;
275  $set = true;
276  } elseif (!$set) {
277  // backwards compatibility
278  if (isset($GLOBALS['ADODB_SESS_LIFE'])) {
279  return $GLOBALS['ADODB_SESS_LIFE'];
280  }
281  }
282  if (!$_lifetime) {
283  $_lifetime = ini_get('session.gc_maxlifetime');
284  if ($_lifetime <= 1) {
285  // bug in PHP 4.0.3 pl 1 -- how about other versions?
286  //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $lifetime</h3>";
287  $_lifetime = 1440;
288  }
289  }
290 
291  return $_lifetime;
292  }
293 
296  static function debug($debug = null)
297  {
298  static $_debug = false;
299  static $set = false;
300 
301  if (!is_null($debug)) {
302  $_debug = (bool) $debug;
303 
304  $conn = ADODB_Session::_conn();
305  if ($conn) {
306  #$conn->debug = $_debug;
307  }
308  $set = true;
309  } elseif (!$set) {
310  // backwards compatibility
311  if (isset($GLOBALS['ADODB_SESS_DEBUG'])) {
312  return $GLOBALS['ADODB_SESS_DEBUG'];
313  }
314  }
315 
316  return $_debug;
317  }
318 
321  static function expireNotify($expire_notify = null)
322  {
323  static $_expire_notify;
324  static $set = false;
325 
326  if (!is_null($expire_notify)) {
327  $_expire_notify = $expire_notify;
328  $set = true;
329  } elseif (!$set) {
330  // backwards compatibility
331  if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) {
332  return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'];
333  }
334  }
335 
336  return $_expire_notify;
337  }
338 
341  static function table($table = null)
342  {
343  static $_table = 'sessions2';
344  static $set = false;
345 
346  if (!is_null($table)) {
347  $_table = trim($table);
348  $set = true;
349  } elseif (!$set) {
350  // backwards compatibility
351  if (isset($GLOBALS['ADODB_SESSION_TBL'])) {
352  return $GLOBALS['ADODB_SESSION_TBL'];
353  }
354  }
355 
356  return $_table;
357  }
358 
361  static function optimize($optimize = null)
362  {
363  static $_optimize = false;
364  static $set = false;
365 
366  if (!is_null($optimize)) {
367  $_optimize = (bool) $optimize;
368  $set = true;
369  } elseif (!$set) {
370  // backwards compatibility
371  if (defined('ADODB_SESSION_OPTIMIZE')) {
372  return true;
373  }
374  }
375 
376  return $_optimize;
377  }
378 
381  static function syncSeconds($sync_seconds = null) {
382  //echo ("<p>WARNING: ADODB_SESSION::syncSeconds is longer used, please remove this function for your code</p>");
383 
384  return 0;
385  }
386 
389  static function clob($clob = null) {
390  static $_clob = false;
391  static $set = false;
392 
393  if (!is_null($clob)) {
394  $_clob = strtolower(trim($clob));
395  $set = true;
396  } elseif (!$set) {
397  // backwards compatibility
398  if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) {
399  return $GLOBALS['ADODB_SESSION_USE_LOBS'];
400  }
401  }
402 
403  return $_clob;
404  }
405 
408  static function dataFieldName($data_field_name = null) {
409  //echo ("<p>WARNING: ADODB_SESSION::dataFieldName() is longer used, please remove this function for your code</p>");
410  return '';
411  }
412 
415  static function filter($filter = null) {
416  static $_filter = array();
417 
418  if (!is_null($filter)) {
419  if (!is_array($filter)) {
420  $filter = array($filter);
421  }
422  $_filter = $filter;
423  }
424 
425  return $_filter;
426  }
427 
430  static function encryptionKey($encryption_key = null) {
431  static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!';
432 
433  if (!is_null($encryption_key)) {
434  $_encryption_key = $encryption_key;
435  }
436 
437  return $_encryption_key;
438  }
439 
441  // private methods
443 
446  static function _conn($conn=null) {
447  return isset($GLOBALS['ADODB_SESS_CONN']) ? $GLOBALS['ADODB_SESS_CONN'] : false;
448  }
449 
452  static function _crc($crc = null) {
453  static $_crc = false;
454 
455  if (!is_null($crc)) {
456  $_crc = $crc;
457  }
458 
459  return $_crc;
460  }
461 
464  static function _init() {
465  session_module_name('user');
466  session_set_save_handler(
467  array('ADODB_Session', 'open'),
468  array('ADODB_Session', 'close'),
469  array('ADODB_Session', 'read'),
470  array('ADODB_Session', 'write'),
471  array('ADODB_Session', 'destroy'),
472  array('ADODB_Session', 'gc')
473  );
474  }
475 
476 
479  static function _sessionKey() {
480  // use this function to create the encryption key for crypted sessions
481  // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt
482  return crypt(ADODB_Session::encryptionKey(), session_id());
483  }
484 
487  static function _dumprs(&$rs) {
488  $conn = ADODB_Session::_conn();
489  $debug = ADODB_Session::debug();
490 
491  if (!$conn) {
492  return;
493  }
494 
495  if (!$debug) {
496  return;
497  }
498 
499  if (!$rs) {
500  echo "<br />\$rs is null or false<br />\n";
501  return;
502  }
503 
504  //echo "<br />\nAffected_Rows=",$conn->Affected_Rows(),"<br />\n";
505 
506  if (!is_object($rs)) {
507  return;
508  }
509  $rs = $conn->_rs2rs($rs);
510 
511  require_once ADODB_SESSION.'/../tohtml.inc.php';
512  rs2html($rs);
513  $rs->MoveFirst();
514  }
515 
517  // public methods
519 
520  static function config($driver, $host, $user, $password, $database=false,$options=false)
521  {
522  ADODB_Session::driver($driver);
523  ADODB_Session::host($host);
524  ADODB_Session::user($user);
525  ADODB_Session::password($password);
526  ADODB_Session::database($database);
527 
528  if (strncmp($driver, 'oci8', 4) == 0) $options['lob'] = 'CLOB';
529 
530  if (isset($options['table'])) ADODB_Session::table($options['table']);
531  if (isset($options['lob'])) ADODB_Session::clob($options['lob']);
532  if (isset($options['debug'])) ADODB_Session::debug($options['debug']);
533  }
534 
540  static function open($save_path, $session_name, $persist = null)
541  {
542  $conn = ADODB_Session::_conn();
543 
544  if ($conn) {
545  return true;
546  }
547 
548  $database = ADODB_Session::database();
549  $debug = ADODB_Session::debug();
550  $driver = ADODB_Session::driver();
551  $host = ADODB_Session::host();
552  $password = ADODB_Session::password();
553  $user = ADODB_Session::user();
554 
555  if (!is_null($persist)) {
556  ADODB_Session::persist($persist);
557  } else {
558  $persist = ADODB_Session::persist();
559  }
560 
561 # these can all be defaulted to in php.ini
562 # assert('$database');
563 # assert('$driver');
564 # assert('$host');
565 
566  $conn = ADONewConnection($driver);
567 
568  if ($debug) {
569  $conn->debug = true;
570  ADOConnection::outp( " driver=$driver user=$user db=$database ");
571  }
572 
573  if (empty($conn->_connectionID)) { // not dsn
574  if ($persist) {
575  switch($persist) {
576  default:
577  case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break;
578  case 'C': $ok = $conn->Connect($host, $user, $password, $database); break;
579  case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break;
580  }
581  } else {
582  $ok = $conn->Connect($host, $user, $password, $database);
583  }
584  }
585 
586  if ($ok) $GLOBALS['ADODB_SESS_CONN'] = $conn;
587  else
588  ADOConnection::outp('<p>Session: connection failed</p>', false);
589 
590 
591  return $ok;
592  }
593 
597  static function close()
598  {
599 /*
600  $conn = ADODB_Session::_conn();
601  if ($conn) $conn->Close();
602 */
603  return true;
604  }
605 
606  /*
607  Slurp in the session variables and return the serialized string
608  */
609  static function read($key)
610  {
611  $conn = ADODB_Session::_conn();
612  $filter = ADODB_Session::filter();
613  $table = ADODB_Session::table();
614 
615  if (!$conn) {
616  return '';
617  }
618 
619  //assert('$table');
620 
621  $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
622 
623  global $ADODB_SESSION_SELECT_FIELDS;
624  if (!isset($ADODB_SESSION_SELECT_FIELDS)) $ADODB_SESSION_SELECT_FIELDS = 'sessdata';
625  $sql = "SELECT $ADODB_SESSION_SELECT_FIELDS FROM $table WHERE sesskey = $binary ".$conn->Param(0)." AND expiry >= " . $conn->sysTimeStamp;
626 
627  /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if
628  developer has commited elsewhere... :(
629  */
630  #if (ADODB_Session::Lock())
631  # $rs = $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), sessdata);
632  #else
633  $rs = $conn->Execute($sql, array($key));
634  //ADODB_Session::_dumprs($rs);
635  if ($rs) {
636  if ($rs->EOF) {
637  $v = '';
638  } else {
639  $v = reset($rs->fields);
640  $filter = array_reverse($filter);
641  foreach ($filter as $f) {
642  if (is_object($f)) {
643  $v = $f->read($v, ADODB_Session::_sessionKey());
644  }
645  }
646  $v = rawurldecode($v);
647  }
648 
649  $rs->Close();
650 
651  ADODB_Session::_crc(strlen($v) . crc32($v));
652  return $v;
653  }
654 
655  return '';
656  }
657 
663  static function write($key, $oval)
664  {
665  global $ADODB_SESSION_READONLY;
666 
667  if (!empty($ADODB_SESSION_READONLY)) return;
668 
669  $clob = ADODB_Session::clob();
670  $conn = ADODB_Session::_conn();
671  $crc = ADODB_Session::_crc();
672  $debug = ADODB_Session::debug();
673  $driver = ADODB_Session::driver();
674  $expire_notify = ADODB_Session::expireNotify();
675  $filter = ADODB_Session::filter();
676  $lifetime = ADODB_Session::lifetime();
677  $table = ADODB_Session::table();
678 
679  if (!$conn) {
680  return false;
681  }
682  if ($debug) $conn->debug = 1;
683  $sysTimeStamp = $conn->sysTimeStamp;
684 
685  //assert('$table');
686 
687  $expiry = $conn->OffsetDate($lifetime/(24*3600),$sysTimeStamp);
688 
689  $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
690 
691  // crc32 optimization since adodb 2.1
692  // now we only update expiry date, thx to sebastian thom in adodb 2.32
693  if ($crc !== '00' && $crc !== false && $crc == (strlen($oval) . crc32($oval))) {
694  if ($debug) {
695  echo '<p>Session: Only updating date - crc32 not changed</p>';
696  }
697 
698  $expirevar = '';
699  if ($expire_notify) {
700  $var = reset($expire_notify);
701  global $$var;
702  if (isset($$var)) {
703  $expirevar = $$var;
704  }
705  }
706 
707 
708  $sql = "UPDATE $table SET expiry = $expiry ,expireref=".$conn->Param('0').", modified = $sysTimeStamp WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= $sysTimeStamp";
709  $rs = $conn->Execute($sql,array($expirevar,$key));
710  return true;
711  }
712  $val = rawurlencode($oval);
713  foreach ($filter as $f) {
714  if (is_object($f)) {
715  $val = $f->write($val, ADODB_Session::_sessionKey());
716  }
717  }
718 
719  $expireref = '';
720  if ($expire_notify) {
721  $var = reset($expire_notify);
722  global $$var;
723  if (isset($$var)) {
724  $expireref = $$var;
725  }
726  }
727 
728  if (!$clob) { // no lobs, simply use replace()
729  $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));
730  if ($rs) $rs->Close();
731 
732  if ($rs && reset($rs->fields) > 0) {
733  $sql = "UPDATE $table SET expiry=$expiry, sessdata=".$conn->Param(0).", expireref= ".$conn->Param(1).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param(2);
734 
735  } else {
736  $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified)
737  VALUES ($expiry,".$conn->Param('0').", ". $conn->Param('1').", ".$conn->Param('2').", $sysTimeStamp, $sysTimeStamp)";
738  }
739 
740 
741  $rs = $conn->Execute($sql,array($val,$expireref,$key));
742 
743  } else {
744  // what value shall we insert/update for lob row?
745  if (strncmp($driver, 'oci8', 4) == 0) $lob_value = sprintf('empty_%s()', strtolower($clob));
746  else $lob_value = 'null';
747 
748  $conn->StartTrans();
749 
750  $rs = $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));
751 
752  if ($rs && reset($rs->fields) > 0) {
753  $sql = "UPDATE $table SET expiry=$expiry, sessdata=$lob_value, expireref= ".$conn->Param(0).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('1');
754 
755  } else {
756  $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified)
757  VALUES ($expiry,$lob_value, ". $conn->Param('0').", ".$conn->Param('1').", $sysTimeStamp, $sysTimeStamp)";
758  }
759 
760  $rs = $conn->Execute($sql,array($expireref,$key));
761 
762  $qkey = $conn->qstr($key);
763  $rs2 = $conn->UpdateBlob($table, 'sessdata', $val, " sesskey=$qkey", strtoupper($clob));
764  if ($debug) echo "<hr>",htmlspecialchars($oval), "<hr>";
765  $rs = @$conn->CompleteTrans();
766 
767 
768  }
769 
770  if (!$rs) {
771  ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false);
772  return false;
773  } else {
774  // bug in access driver (could be odbc?) means that info is not committed
775  // properly unless select statement executed in Win2000
776  if ($conn->databaseType == 'access') {
777  $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey";
778  $rs = $conn->Execute($sql);
780  if ($rs) {
781  $rs->Close();
782  }
783  }
784  }/*
785  if (ADODB_Session::Lock()) {
786  $conn->CommitTrans();
787  }*/
788  return $rs ? true : false;
789  }
790 
793  static function destroy($key) {
794  $conn = ADODB_Session::_conn();
795  $table = ADODB_Session::table();
796  $expire_notify = ADODB_Session::expireNotify();
797 
798  if (!$conn) {
799  return false;
800  }
801  $debug = ADODB_Session::debug();
802  if ($debug) $conn->debug = 1;
803  //assert('$table');
804 
805  $qkey = $conn->quote($key);
806  $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
807 
808  if ($expire_notify) {
809  reset($expire_notify);
810  $fn = next($expire_notify);
811  $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
812  $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey";
813  $rs = $conn->Execute($sql);
815  $conn->SetFetchMode($savem);
816  if (!$rs) {
817  return false;
818  }
819  if (!$rs->EOF) {
820  $ref = $rs->fields[0];
821  $key = $rs->fields[1];
822  //assert('$ref');
823  //assert('$key');
824  $fn($ref, $key);
825  }
826  $rs->Close();
827  }
828 
829  $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey";
830  $rs = $conn->Execute($sql);
831  if ($rs) {
832  $rs->Close();
833  }
834 
835  return $rs ? true : false;
836  }
837 
840  static function gc($maxlifetime)
841  {
842  $conn = ADODB_Session::_conn();
843  $debug = ADODB_Session::debug();
844  $expire_notify = ADODB_Session::expireNotify();
845  $optimize = ADODB_Session::optimize();
846  $table = ADODB_Session::table();
847 
848  if (!$conn) {
849  return false;
850  }
851 
852 
853  $debug = ADODB_Session::debug();
854  if ($debug) {
855  $conn->debug = 1;
856  $COMMITNUM = 2;
857  } else {
858  $COMMITNUM = 20;
859  }
860 
861  //assert('$table');
862 
863  $time = $conn->OffsetDate(-$maxlifetime/24/3600,$conn->sysTimeStamp);
864  $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
865 
866  if ($expire_notify) {
867  reset($expire_notify);
868  $fn = next($expire_notify);
869  } else {
870  $fn = false;
871  }
872 
873  $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
874  $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time ORDER BY 2"; # add order by to prevent deadlock
875  $rs = $conn->SelectLimit($sql,1000);
876  if ($debug) ADODB_Session::_dumprs($rs);
877  $conn->SetFetchMode($savem);
878  if ($rs) {
879  $tr = $conn->hasTransactions;
880  if ($tr) $conn->BeginTrans();
881  $keys = array();
882  $ccnt = 0;
883  while (!$rs->EOF) {
884  $ref = $rs->fields[0];
885  $key = $rs->fields[1];
886  if ($fn) $fn($ref, $key);
887  $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key));
888  $rs->MoveNext();
889  $ccnt += 1;
890  if ($tr && $ccnt % $COMMITNUM == 0) {
891  if ($debug) echo "Commit<br>\n";
892  $conn->CommitTrans();
893  $conn->BeginTrans();
894  }
895  }
896  $rs->Close();
897 
898  if ($tr) $conn->CommitTrans();
899  }
900 
901 
902  // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
903  if ($optimize) {
904  $driver = ADODB_Session::driver();
905 
906  if (preg_match('/mysql/i', $driver)) {
907  $sql = "OPTIMIZE TABLE $table";
908  }
909  if (preg_match('/postgres/i', $driver)) {
910  $sql = "VACUUM $table";
911  }
912  if (!empty($sql)) {
913  $conn->Execute($sql);
914  }
915  }
916 
917 
918  return true;
919  }
920 }
921 
923 if (empty($ADODB_SESSION_READONLY))
924  register_shutdown_function('session_write_close');
925 
926 // for backwards compatability only
927 function adodb_sess_open($save_path, $session_name, $persist = true) {
928  return ADODB_Session::open($save_path, $session_name, $persist);
929 }
930 
931 // for backwards compatability only
932 function adodb_sess_gc($t)
933 {
934  return ADODB_Session::gc($t);
935 }
936 
937 ?>




Korrekturen, Hinweise und Ergänzungen

Bitte scheuen Sie sich nicht und melden Sie, was auf dieser Seite sachlich falsch oder irreführend ist, was ergänzt werden sollte, was fehlt usw. Dazu bitte oben aus dem Menü Seite den Eintrag Support Forum wählen. Es ist eine kostenlose Anmeldung erforderlich, um Anmerkungen zu posten. Unpassende Postings, Spam usw. werden kommentarlos entfernt.