示例#1
0
 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 '';
 }