[ Index ] |
|
Code source de dotProject 2.1 RC1 |
1 <?php /* $Id: session.php,v 1.13.2.2 2007/01/31 09:36:52 ajdonnison Exp $ */ 2 ## 3 ## Session Handling Functions 4 ## 5 /* 6 * Please note that these functions assume that the database 7 * is accessible and that a table called 'sessions' (with a prefix 8 * if necessary) exists. It also assumes MySQL date and time 9 * functions, which may make it less than easy to port to 10 * other databases. You may need to use less efficient techniques 11 * to make it more generic. 12 * 13 * NOTE: index.php and fileviewer.php MUST call dPsessionStart 14 * instead of trying to set their own sessions. 15 */ 16 17 if (!defined('DP_BASE_DIR')) { 18 die('You should not access this file directly'); 19 } 20 21 require_once DP_BASE_DIR . '/includes/main_functions.php'; 22 require_once DP_BASE_DIR . '/includes/db_adodb.php'; 23 require_once DP_BASE_DIR . '/includes/db_connect.php'; 24 require_once DP_BASE_DIR . '/classes/query.class.php'; 25 require_once DP_BASE_DIR . '/classes/ui.class.php'; 26 require_once DP_BASE_DIR . '/classes/event_queue.class.php'; 27 28 function dPsessionOpen($save_path, $session_name) 29 { 30 return true; 31 } 32 33 function dPsessionClose() 34 { 35 return true; 36 } 37 38 function dPsessionRead($id) 39 { 40 $q = new DBQuery; 41 $q->addTable('sessions'); 42 $q->addQuery('session_data'); 43 $q->addQuery('UNIX_TIMESTAMP() - UNIX_TIMESTAMP(session_created) as session_lifespan'); 44 $q->addQuery('UNIX_TIMESTAMP() - UNIX_TIMESTAMP(session_updated) as session_idle'); 45 $q->addWhere("session_id = '$id'"); 46 $qid =& $q->exec(); 47 if (! $qid || $qid->EOF ) { 48 dprint(__FILE__, __LINE__, 11, "Failed to retrieve session $id"); 49 $data = ""; 50 } else { 51 $max = dPsessionConvertTime('max_lifetime'); 52 $idle = dPsessionConvertTime('idle_time'); 53 dprint(__FILE__, __LINE__, 11, "Found session $id, max=$max/" . $qid->fields['session_lifespan'] 54 . ", idle=$idle/" . $qid->fields['session_idle']); 55 // If the idle time or the max lifetime is exceeded, trash the 56 // session. 57 if ($max < $qid->fields['session_lifespan'] 58 || $idle < $qid->fields['session_idle']) { 59 dprint(__FILE__, __LINE__, 11, "session $id expired"); 60 dPsessionDestroy($id); 61 $data = ''; 62 } else { 63 $data = $qid->fields['session_data']; 64 } 65 } 66 $q->clear(); 67 return $data; 68 } 69 70 function dPsessionWrite($id, $data) 71 { 72 global $AppUI; 73 74 $q = new DBQuery; 75 $q->addQuery('count(*) as row_count'); 76 $q->addTable('sessions'); 77 $q->addWhere("session_id = '$id'"); 78 79 if ( $qid =& $q->exec() 80 && ( @$qid->fields['row_count'] > 0 || @$qid->fields[0] > 0) ) { 81 dprint(__FILE__, __LINE__, 11, "Updating session $id"); 82 $q->query = null; 83 $q->addUpdate('session_data', $data); 84 if (isset($AppUI)) 85 $q->addUpdate('session_user', $AppUI->last_insert_id); 86 } else { 87 dprint(__FILE__, __LINE__, 11, "Creating new session $id"); 88 $q->query = null; 89 $q->where = null; 90 $q->addInsert('session_id', $id); 91 $q->addInsert('session_data', $data); 92 $q->addInsert('session_created', date('Y-m-d H:i:s')); 93 } 94 $q->exec(); 95 $q->clear(); 96 return true; 97 } 98 99 function dPsessionDestroy($id, $user_access_log_id=0) { 100 global $AppUI; 101 102 if(!($user_access_log_id) && isset($AppUI->last_insert_id)){ 103 $user_access_log_id = $AppUI->last_insert_id; 104 } 105 106 dprint(__FILE__, __LINE__, 11, "Killing session $id"); 107 $q = new DBQuery; 108 $q->setDelete('sessions'); 109 $q->addWhere("session_id = '$id'"); 110 $q->exec(); 111 $q->clear(); 112 113 if ($user_access_log_id) { 114 $q->addTable('user_access_log'); 115 $q->addUpdate('date_time_out', date("Y-m-d H:i:s")); 116 $q->addWhere('user_access_log_id = ' . $user_access_log_id); 117 $q->exec(); 118 $q->clear(); 119 } 120 121 return true; 122 } 123 124 function dPsessionGC($maxlifetime) 125 { 126 global $dPconfig; 127 global $AppUI; 128 129 dprint(__FILE__, __LINE__, 11, "Session Garbage collection running"); 130 $now = time(); 131 $max = dPsessionConvertTime('max_lifetime'); 132 $idle = dPsessionConvertTime('idle_time'); 133 // Find all the session 134 $q = new DBQuery; 135 $q->setDelete('sessions'); 136 $q->addWhere("UNIX_TIMESTAMP() - UNIX_TIMESTAMP(session_updated) > $idle OR UNIX_TIMESTAMP() - UNIX_TIMESTAMP(session_created) > $max"); 137 $q->exec(); 138 $q->clear(); 139 if (isset($dPconfig['session_gc_scan_queue']) 140 && $dPconfig['session_gc_scan_queue']) { 141 // We need to scan the event queue. If $AppUI isn't created yet 142 // And it isn't likely that it will be, we create it and run the 143 // queue scanner. 144 if (! isset($AppUI)) { 145 $AppUI = new CAppUI; 146 $queue = new EventQueue; 147 $queue->scan(); 148 } 149 } 150 return true; 151 } 152 153 function dPsessionConvertTime($key) 154 { 155 global $dPconfig; 156 $key = 'session_' . $key; 157 158 // If the value isn't set, then default to 1 day. 159 if (! isset($dPconfig[$key]) || ! $dPconfig[$key] ) 160 return 86400; 161 162 $numpart = (int) $dPconfig[$key]; 163 $modifier = substr($dPconfig[$key], -1); 164 if (! is_numeric($modifier)) { 165 switch ($modifier) { 166 case 'h': 167 $numpart *= 3600; 168 break; 169 case 'd': 170 $numpart *= 86400; 171 break; 172 case 'm': 173 $numpart *= (86400 * 30); 174 break; 175 case 'y': 176 $numpart *= (86400 * 365); 177 break; 178 } 179 } 180 return $numpart; 181 } 182 183 function dpSessionStart($start_vars = 'AppUI') 184 { 185 global $dPconfig; 186 187 session_name('dotproject'); 188 if (ini_get('session.auto_start') > 0) { 189 session_write_close(); 190 } 191 if (isset($dPconfig['session_handling']) 192 && strtolower($dPconfig['session_handling']) == 'app') 193 { 194 ini_set('session.save_handler', 'user'); 195 196 session_set_save_handler( 197 'dPsessionOpen', 198 'dPsessionClose', 199 'dPsessionRead', 200 'dPsessionWrite', 201 'dPsessionDestroy', 202 'dPsessionGC'); 203 $max_time = dPsessionConvertTime('max_lifetime'); 204 } else { 205 $max_time = 0; // Browser session only. 206 } 207 // Try and get the correct path to the base URL. 208 preg_match('_^(https?://)([^/]+)(:0-9]+)?(/.*)?$_i', $dPconfig['base_url'], $url_parts); 209 $cookie_dir = $url_parts[4]; 210 if (substr($cookie_dir, 0, 1) != '/') 211 $cookie_dir = '/' . $cookie_dir; 212 if (substr($cookie_dir, -1) != '/') 213 $cookie_dir .= '/'; 214 session_set_cookie_params($max_time, $cookie_dir); 215 session_start(); 216 if (is_array($start_vars)) { 217 foreach ($start_vars as $var) { 218 session_register($var); 219 } 220 } else if (! empty($start_vars)) { 221 session_register($start_vars); 222 } 223 } 224 225 // vi:ai sw=2 ts=2: 226 // vim600:ai sw=2 ts=2 fdm=marker: 227 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 18 19:46:52 2007 | par Balluche grâce à PHPXref 0.7 |