source: branches/comu-ver2/data/module/adodb/session/old/adodb-session.php @ 18701

Revision 18701, 13.2 KB checked in by nanasess, 14 years ago (diff)

Copyright の更新(#601)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id Revision Date
  • Property svn:mime-type set to text/x-httpd-php
Line 
1<?php
2/*
3V4.93 10 Oct 2006  (c) 2000-2010 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
13wrapper 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   
26To 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
99if (!defined('_ADODB_LAYER')) {
100    include (dirname(__FILE__).'/adodb.inc.php');
101}
102
103if (!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*/
113function adodb_session_regenerate_id()
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\****************************************************************************************/
144GLOBAL  $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   
166    //////////////////////////////////
167    /* SET THE FOLLOWING PARAMETERS */
168    //////////////////////////////////
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\****************************************************************************************/
204function adodb_sess_open($save_path, $session_name,$persist=true)
205{
206GLOBAL $ADODB_SESS_CONN;
207    if (isset($ADODB_SESS_CONN)) return true;
208   
209GLOBAL  $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\****************************************************************************************/
234function adodb_sess_close()
235{
236global $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\****************************************************************************************/
245function adodb_sess_read($key)
246{
247global $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\****************************************************************************************/
272function 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
316function 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
344function 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
418session_module_name('user');
419session_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
430if (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?>
Note: See TracBrowser for help on using the repository browser.