public static function read($name) { $name = self::truncated_session_id($name); //main session switch (self::$session_type) { case 'file': if (!file_exists(FILE_SESSION_DIR)) { mkdir(FILE_SESSION_DIR); } $sess_file = rtrim(FILE_SESSION_DIR, '\\/') . '/' . FILE_SESSION_TOKEN . $name; if (!file_exists($sess_file)) { file_put_contents($sess_file, ''); } self::$session_fp = fopen($sess_file, 'r+'); if (!READ_ONLY_SESSION && !flock(self::$session_fp, LOCK_EX)) { trigger_error('Unable to get lock on session file=' . $sess_file, E_USER_ERROR); } $ret = stream_get_contents(self::$session_fp); break; case 'memcache': if (!READ_ONLY_SESSION && !self::$memcached->lock(MEMCACHE_SESSION_TOKEN . $name, self::$memcached_lock_time)) { trigger_error('Unable to get lock on session mem=' . $name, E_USER_ERROR); } $ret = ''; for ($i = 0;; $i++) { $rr = self::$memcached->get(MEMCACHE_SESSION_TOKEN . $name . '/' . $i); if ($rr === '' || $rr === false || $rr === null) { break; } $ret .= $rr; } break; case 'sql': $ret = DB::GetCol('SELECT data FROM session WHERE name = %s AND expires > %d' . (READ_ONLY_SESSION ? '' : ' FOR UPDATE'), array($name, time() - self::$lifetime)); if ($ret) { $ret = $ret[0]; } break; } if ($ret) { $_SESSION = unserialize($ret); } if (CID !== false) { if (!is_numeric(CID)) { trigger_error('Invalid client id.', E_USER_ERROR); } switch (self::$session_type) { case 'file': $sess_file = rtrim(FILE_SESSION_DIR, '\\/') . '/' . FILE_SESSION_TOKEN . $name . '_' . CID; if (!file_exists($sess_file)) { file_put_contents($sess_file, ''); } self::$session_client_fp = fopen($sess_file, 'r+'); if (!READ_ONLY_SESSION && !flock(self::$session_client_fp, LOCK_EX)) { trigger_error('Unable to get lock on session file=' . $sess_file, E_USER_ERROR); } $ret = stream_get_contents(self::$session_client_fp); break; case 'memcache': if (!READ_ONLY_SESSION && !self::$memcached->lock(MEMCACHE_SESSION_TOKEN . $name . '_' . CID, self::$memcached_lock_time)) { trigger_error('Unable to get lock on session mem=' . $name . '_' . CID, E_USER_ERROR); } $ret = ''; for ($i = 0;; $i++) { $rr = self::$memcached->get(MEMCACHE_SESSION_TOKEN . $name . '_' . CID . '/' . $i); if ($rr === '' || $rr === false || $rr === null) { break; } $ret .= $rr; } break; case 'sql': $ret = DB::GetCol('SELECT data FROM session_client WHERE session_name = %s AND client_id=%d' . (READ_ONLY_SESSION ? '' : ' FOR UPDATE'), array($name, CID)); if ($ret) { $ret = $ret[0]; } break; } if ($ret) { $_SESSION['client'] = unserialize($ret); } if (!isset($_SESSION['client']['__module_vars__'])) { $_SESSION['client']['__module_vars__'] = array(); } } return ''; }