255 || count($ipdot) !== 4) { return 'N/A'; } if (isset(self::$cached[$nip]) === true) { return self::$cached[$nip]; } if (self::$fp === NULL) { self::init(); } $nip2 = pack('N', ip2long($nip)); $tmp_offset = ((int)$ipdot[0] * 256 + (int)$ipdot[1]) * 4; $start = unpack('Vlen', self::$index[$tmp_offset] . self::$index[$tmp_offset + 1] . self::$index[$tmp_offset + 2] . self::$index[$tmp_offset + 3]); $index_offset = $index_length = NULL; $max_comp_len = self::$offset['len'] - 262144 - 4; for ($start = $start['len'] * 9 + 262144; $start < $max_comp_len; $start += 9) { if (self::$index[$start] . self::$index[$start + 1] . self::$index[$start + 2] . self::$index[$start + 3] >= $nip2) { $index_offset = unpack('Vlen', self::$index[$start + 4] . self::$index[$start + 5] . self::$index[$start + 6] . "\x0"); $index_length = unpack('nlen', self::$index[$start + 7] . self::$index[$start + 8]); break; } } if ($index_offset === NULL) { return 'N/A'; } fseek(self::$fp, self::$offset['len'] + $index_offset['len'] - 262144); self::$cached[$nip] = explode("\t", fread(self::$fp, $index_length['len'])); return self::$cached[$nip]; } private static function init() { if (self::$fp === NULL) { self::$ip = new self(); self::$fp = fopen(__ACCESS_PLUGIN_ROOT__ . '/lib/17monipdb.datx', 'rb'); if (self::$fp === FALSE) { throw new Exception('Invalid 17monipdb.datx file!'); } self::$offset = unpack('Nlen', fread(self::$fp, 4)); if (self::$offset['len'] < 4) { throw new Exception('Invalid 17monipdb.datx file!'); } self::$index = fread(self::$fp, self::$offset['len'] - 4); } } public function __destruct() { if (self::$fp !== NULL) { fclose(self::$fp); self::$fp = NULL; } } } ?>