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

adodb-session.php
gehe zur Dokumentation dieser Datei
1 <?php
2 /*
3 V5.19dev ??-???-2014 (c) 2000-2014 John Lim (jlim#natsoft.com). All rights reserved.
4  Released under both BSD license and Lesser GPL library license.
5  Whenever there is any discrepancy between the two licenses,
6  the BSD license will take precedence.
7  Set tabs to 4 for best viewing.
8 
9  Latest version of ADODB is available at http://php.weblogs.com/adodb
10  ======================================================================
11 
12  This file provides PHP4 session management using the ADODB database
13 wrapper library.
14 
15  Example
16  =======
17 
18  include('adodb.inc.php');
19  include('adodb-session.php');
20  session_start();
21  session_register('AVAR');
22  $_SESSION['AVAR'] += 1;
23  print "
24 -- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
25 
26 To force non-persistent connections, call adodb_session_open first before session_start():
27 
28  include('adodb.inc.php');
29  include('adodb-session.php');
30  adodb_sess_open(false,false,false);
31  session_start();
32  session_register('AVAR');
33  $_SESSION['AVAR'] += 1;
34  print "
35 -- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
36 
37 
38  Installation
39  ============
40  1. Create this table in your database (syntax might vary depending on your db):
41 
42  create table sessions (
43  SESSKEY char(32) not null,
44  EXPIRY int(11) unsigned not null,
45  EXPIREREF varchar(64),
46  DATA text not null,
47  primary key (sesskey)
48  );
49 
50  For oracle:
51  create table sessions (
52  SESSKEY char(32) not null,
53  EXPIRY DECIMAL(16) not null,
54  EXPIREREF varchar(64),
55  DATA varchar(4000) not null,
56  primary key (sesskey)
57  );
58 
59 
60  2. Then define the following parameters. You can either modify
61  this file, or define them before this file is included:
62 
63  $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';
64  $ADODB_SESSION_CONNECT='server to connect to';
65  $ADODB_SESSION_USER ='user';
66  $ADODB_SESSION_PWD ='password';
67  $ADODB_SESSION_DB ='database';
68  $ADODB_SESSION_TBL = 'sessions'
69 
70  3. Recommended is PHP 4.1.0 or later. There are documented
71  session bugs in earlier versions of PHP.
72 
73  4. If you want to receive notifications when a session expires, then
74  you can tag a session with an EXPIREREF, and before the session
75  record is deleted, we can call a function that will pass the EXPIREREF
76  as the first parameter, and the session key as the second parameter.
77 
78  To do this, define a notification function, say NotifyFn:
79 
80  function NotifyFn($expireref, $sesskey)
81  {
82  }
83 
84  Then you need to define a global variable $ADODB_SESSION_EXPIRE_NOTIFY.
85  This is an array with 2 elements, the first being the name of the variable
86  you would like to store in the EXPIREREF field, and the 2nd is the
87  notification function's name.
88 
89  In this example, we want to be notified when a user's session
90  has expired, so we store the user id in the global variable $USERID,
91  store this value in the EXPIREREF field:
92 
93  $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
94 
95  Then when the NotifyFn is called, we are passed the $USERID as the first
96  parameter, eg. NotifyFn($userid, $sesskey).
97 */
98 
99 if (!defined('_ADODB_LAYER')) {
100  include (dirname(__FILE__).'/adodb.inc.php');
101 }
102 
103 if (!defined('ADODB_SESSION')) {
104 
105  define('ADODB_SESSION',1);
106 
107  /* if database time and system time is difference is greater than this, then give warning */
108  define('ADODB_SESSION_SYNCH_SECS',60);
109 
110  /*
111  Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1
112 */
114 {
115  $conn = ADODB_Session::_conn();
116  if (!$conn) return false;
117 
118  $old_id = session_id();
119  if (function_exists('session_regenerate_id')) {
120  session_regenerate_id();
121  } else {
122  session_id(md5(uniqid(rand(), true)));
123  $ck = session_get_cookie_params();
124  setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
125  //@session_start();
126  }
127  $new_id = session_id();
128  $ok = $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
129 
130  /* it is possible that the update statement fails due to a collision */
131  if (!$ok) {
132  session_id($old_id);
133  if (empty($ck)) $ck = session_get_cookie_params();
134  setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
135  return false;
136  }
137 
138  return true;
139 }
140 
141 /****************************************************************************************\
142  Global definitions
143 \****************************************************************************************/
144 GLOBAL $ADODB_SESSION_CONNECT,
145  $ADODB_SESSION_DRIVER,
146  $ADODB_SESSION_USER,
147  $ADODB_SESSION_PWD,
148  $ADODB_SESSION_DB,
149  $ADODB_SESS_CONN,
150  $ADODB_SESS_LIFE,
151  $ADODB_SESS_DEBUG,
152  $ADODB_SESSION_EXPIRE_NOTIFY,
153  $ADODB_SESSION_CRC,
154  $ADODB_SESSION_TBL;
155 
156 
157  $ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime');
158  if ($ADODB_SESS_LIFE <= 1) {
159  // bug in PHP 4.0.3 pl 1 -- how about other versions?
160  //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>";
161  $ADODB_SESS_LIFE=1440;
162  }
163  $ADODB_SESSION_CRC = false;
164  //$ADODB_SESS_DEBUG = true;
165 
167  /* SET THE FOLLOWING PARAMETERS */
169 
170  if (empty($ADODB_SESSION_DRIVER)) {
171  $ADODB_SESSION_DRIVER='mysql';
172  $ADODB_SESSION_CONNECT='localhost';
173  $ADODB_SESSION_USER ='root';
174  $ADODB_SESSION_PWD ='';
175  $ADODB_SESSION_DB ='xphplens_2';
176  }
177 
178  if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) {
179  $ADODB_SESSION_EXPIRE_NOTIFY = false;
180  }
181  // Made table name configurable - by David Johnson djohnson@inpro.net
182  if (empty($ADODB_SESSION_TBL)){
183  $ADODB_SESSION_TBL = 'sessions';
184  }
185 
186  /*
187  $ADODB_SESS['driver'] = $ADODB_SESSION_DRIVER;
188  $ADODB_SESS['connect'] = $ADODB_SESSION_CONNECT;
189  $ADODB_SESS['user'] = $ADODB_SESSION_USER;
190  $ADODB_SESS['pwd'] = $ADODB_SESSION_PWD;
191  $ADODB_SESS['db'] = $ADODB_SESSION_DB;
192  $ADODB_SESS['life'] = $ADODB_SESS_LIFE;
193  $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG;
194 
195  $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG;
196  $ADODB_SESS['table'] = $ADODB_SESS_TBL;
197  */
198 
199 /****************************************************************************************\
200  Create the connection to the database.
201 
202  If $ADODB_SESS_CONN already exists, reuse that connection
203 \****************************************************************************************/
204 function adodb_sess_open($save_path, $session_name,$persist=true)
205 {
206 GLOBAL $ADODB_SESS_CONN;
207  if (isset($ADODB_SESS_CONN)) return true;
208 
209 GLOBAL $ADODB_SESSION_CONNECT,
210  $ADODB_SESSION_DRIVER,
211  $ADODB_SESSION_USER,
212  $ADODB_SESSION_PWD,
213  $ADODB_SESSION_DB,
214  $ADODB_SESS_DEBUG;
215 
216  // cannot use & below - do not know why...
217  $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER);
218  if (!empty($ADODB_SESS_DEBUG)) {
219  $ADODB_SESS_CONN->debug = true;
220  ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB ");
221  }
222  if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT,
223  $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
224  else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT,
225  $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
226 
227  if (!$ok) ADOConnection::outp( "
228 -- Session: connection failed</p>",false);
229 }
230 
231 /****************************************************************************************\
232  Close the connection
233 \****************************************************************************************/
234 function adodb_sess_close()
235 {
236 global $ADODB_SESS_CONN;
237 
238  if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close();
239  return true;
240 }
241 
242 /****************************************************************************************\
243  Slurp in the session variables and return the serialized string
244 \****************************************************************************************/
245 function adodb_sess_read($key)
246 {
247 global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC;
248 
249  $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time());
250  if ($rs) {
251  if ($rs->EOF) {
252  $v = '';
253  } else
254  $v = rawurldecode(reset($rs->fields));
255 
256  $rs->Close();
257 
258  // new optimization adodb 2.1
259  $ADODB_SESSION_CRC = strlen($v).crc32($v);
260 
261  return $v;
262  }
263 
264  return ''; // thx to Jorma Tuomainen, webmaster#wizactive.com
265 }
266 
267 /****************************************************************************************\
268  Write the serialized data to a database.
269 
270  If the data has not been modified since adodb_sess_read(), we do not write.
271 \****************************************************************************************/
272 function adodb_sess_write($key, $val)
273 {
274  global
275  $ADODB_SESS_CONN,
276  $ADODB_SESS_LIFE,
277  $ADODB_SESSION_TBL,
278  $ADODB_SESS_DEBUG,
279  $ADODB_SESSION_CRC,
280  $ADODB_SESSION_EXPIRE_NOTIFY;
281 
282  $expiry = time() + $ADODB_SESS_LIFE;
283 
284  // crc32 optimization since adodb 2.1
285  // now we only update expiry date, thx to sebastian thom in adodb 2.32
286  if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) {
287  if ($ADODB_SESS_DEBUG) echo "
288 -- Session: Only updating date - crc32 not changed</p>";
289  $qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time();
290  $rs = $ADODB_SESS_CONN->Execute($qry);
291  return true;
292  }
293  $val = rawurlencode($val);
294 
295  $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val);
296  if ($ADODB_SESSION_EXPIRE_NOTIFY) {
297  $var = reset($ADODB_SESSION_EXPIRE_NOTIFY);
298  global $$var;
299  $arr['expireref'] = $$var;
300  }
301  $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,$arr,
302  'sesskey',$autoQuote = true);
303 
304  if (!$rs) {
305  ADOConnection::outp( '
306 -- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'</p>',false);
307  } else {
308  // bug in access driver (could be odbc?) means that info is not commited
309  // properly unless select statement executed in Win2000
310  if ($ADODB_SESS_CONN->databaseType == 'access')
311  $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'");
312  }
313  return !empty($rs);
314 }
315 
316 function adodb_sess_destroy($key)
317 {
318  global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
319 
320  if ($ADODB_SESSION_EXPIRE_NOTIFY) {
321  reset($ADODB_SESSION_EXPIRE_NOTIFY);
322  $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
323  $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
324  $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
325  $ADODB_SESS_CONN->SetFetchMode($savem);
326  if ($rs) {
327  $ADODB_SESS_CONN->BeginTrans();
328  while (!$rs->EOF) {
329  $ref = $rs->fields[0];
330  $key = $rs->fields[1];
331  $fn($ref,$key);
332  $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
333  $rs->MoveNext();
334  }
335  $ADODB_SESS_CONN->CommitTrans();
336  }
337  } else {
338  $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'";
339  $rs = $ADODB_SESS_CONN->Execute($qry);
340  }
341  return $rs ? true : false;
342 }
343 
344 function adodb_sess_gc($maxlifetime)
345 {
346  global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
347 
348  if ($ADODB_SESSION_EXPIRE_NOTIFY) {
349  reset($ADODB_SESSION_EXPIRE_NOTIFY);
350  $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
351  $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
352  $t = time();
353  $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t");
354  $ADODB_SESS_CONN->SetFetchMode($savem);
355  if ($rs) {
356  $ADODB_SESS_CONN->BeginTrans();
357  while (!$rs->EOF) {
358  $ref = $rs->fields[0];
359  $key = $rs->fields[1];
360  $fn($ref,$key);
361  $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
362  $rs->MoveNext();
363  }
364  $rs->Close();
365 
366  $ADODB_SESS_CONN->CommitTrans();
367 
368  }
369  } else {
370  $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time();
371  $ADODB_SESS_CONN->Execute($qry);
372 
373  if ($ADODB_SESS_DEBUG) ADOConnection::outp("
374 -- <b>Garbage Collection</b>: $qry</p>");
375  }
376  // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
377  if (defined('ADODB_SESSION_OPTIMIZE')) {
378  global $ADODB_SESSION_DRIVER;
379 
380  switch( $ADODB_SESSION_DRIVER ) {
381  case 'mysql':
382  case 'mysqlt':
383  $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL;
384  break;
385  case 'postgresql':
386  case 'postgresql7':
387  $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL;
388  break;
389  }
390  if (!empty($opt_qry)) {
391  $ADODB_SESS_CONN->Execute($opt_qry);
392  }
393  }
394  if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL;
395  else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL;
396 
397  $rs = $ADODB_SESS_CONN->SelectLimit($sql,1);
398  if ($rs && !$rs->EOF) {
399 
400  $dbts = reset($rs->fields);
401  $rs->Close();
402  $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts);
403  $t = time();
404 
405  if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) {
406 
407  $msg =
408  __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)";
409  error_log($msg);
410  if ($ADODB_SESS_DEBUG) ADOConnection::outp("
411 -- $msg</p>");
412  }
413  }
414 
415  return true;
416 }
417 
418 session_module_name('user');
419 session_set_save_handler(
420  "adodb_sess_open",
421  "adodb_sess_close",
422  "adodb_sess_read",
423  "adodb_sess_write",
424  "adodb_sess_destroy",
425  "adodb_sess_gc");
426 }
427 
428 /* TEST SCRIPT -- UNCOMMENT */
429 
430 if (0) {
431 
432  session_start();
433  session_register('AVAR');
434  $_SESSION['AVAR'] += 1;
435  ADOConnection::outp( "
436 -- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>",false);
437 }
438 
439 ?>




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.