typecho-plugin-Access/Access_Ip.php
itcats b70697602d
Update Access_Ip.php
修复php7下出现Array and string offset access syntax with curly braces is deprecated。
2020-07-20 00:02:02 +08:00

108 lines
2.8 KiB
PHP

<?php
/*
本代码仅用于 DATX 格式,请注意及时更新 IP 数据库版本
Code for PHP 5.3+ only!
*/
if (!defined('__ACCESS_PLUGIN_ROOT__')) {
throw new Exception('Boostrap file not found');
}
class Access_Ip
{
private static $ip = NULL;
private static $fp = NULL;
private static $offset = NULL;
private static $index = NULL;
private static $cached = array();
public static function find($ip)
{
if (empty($ip) === TRUE)
{
return 'N/A';
}
$nip = gethostbyname($ip);
$ipdot = explode('.', $nip);
if ($ipdot[0] < 0 || $ipdot[0] > 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;
}
}
}
?>