Heim Backend-Entwicklung PHP-Tutorial php 相仿腾讯的IP库

php 相仿腾讯的IP库

Jun 13, 2016 pm 01:15 PM
gt location return this

php 类似腾讯的IP库
$IpLocation = new IpLocation('ipData/QQWry.Dat'); 
$ipInfo=$IpLocation->getlocation($ip);
print_r($ipInfo);
注意获取的数据编码为 gbk


class IpLocation 
{
	/**
	 * QQWry.Dat文件指针
	 * @var resource
	 */
	var $fp;
	
	/**
	 * 第一条IP记录的偏移地址
	 * @var int
	 */
	var $firstip;
	
	/**
	 * 最后一条IP记录的偏移地址
	 * @var int
	 */
	var $lastip;
	
	/**
	 * IP记录的总条数(不包含版本信息记录)
	 * @var int
	 */
	var $totalip;
    
	/**
	 * 返回读取的长整型数
	 * @access private
	 * @return int
	 */
	function getlong() 
	{
		$result = unpack('Vlong', fread($this->fp, 4));	//将读取的little-endian编码的4个字节转化为长整型数
		return $result['long'];
	}
    
	/**
	* 返回读取的3个字节的长整型数
	* @access private
	* @return int
	*/
	function getlong3() 
	{
		$result = unpack('Vlong', fread($this->fp, 3).chr(0));	//将读取的little-endian编码的3个字节转化为长整型数
		return $result['long'];
	}
    
	/**
	* 返回压缩后可进行比较的IP地址
	* @access private
	* @param string $ip
	* @return string
	*/
	function packip($ip) 
	{
		// 将IP地址转化为长整型数,如果在PHP5中,IP地址错误,则返回False,
		// 这时intval将Flase转化为整数-1,之后压缩成big-endian编码的字符串
		return pack('N', intval(ip2long($ip)));			//intaval 获取变量的整数值
	}
    
	/**
	* 返回读取的字符串
	* @access private
	* @param string $data
	* @return string
	*/
	function getstring($data = "") 
	{
		$char = fread($this->fp, 1);
		while (ord($char) > 0)					// 字符串按照C格式保存,以\0结束 ord()得到字符的ASCII码
		{
			$data .= $char;				// 将读取的字符连接到给定字符串之后
			$char = fread($this->fp, 1);
		}
		return $data;
	}
    
	/**
	* 返回地区信息
	* @access private
	* @return string
	*/
	function getarea() 
	{
		$byte = fread($this->fp, 1);				// 标志字节
		switch (ord($byte)) {
			case 0:						// 没有区域信息
				$area = "";
				break;
			case 1:
			case 2:						// 标志字节为1或2,表示区域信息被重定向
				fseek($this->fp, $this->getlong3());
				$area = $this->getstring();
				break;
			default:					// 否则,表示区域信息没有被重定向
				$area = $this->getstring($byte);
				break;
		}
		return $area;
	}
    
	/**
	* 根据所给 IP 地址或域名返回所在地区信息
	* @access public
	* @param string $ip
	* @return array
	*/
	function getlocation($ip = '') 
	{
		if (!$this->fp) return null;				// 如果数据文件没有被正确打开,则直接返回空
		if($ip == '') $ip = $this->clientIp();
		$location['ip'] = gethostbyname($ip);			// 将输入的域名转化为IP地址
		$ip = $this->packip($location['ip']);			// 将输入的IP地址转化为可比较的IP地址
		
		$l = 0;                            				// 搜索的下边界
		$u = $this->totalip;            				// 搜索的上边界
		$findip = $this->lastip;        				// 如果没有找到就返回最后一条IP记录(QQWry.Dat的版本信息)
		while ($l fp, $this->firstip + $i * 7);
			$beginip = strrev(fread($this->fp, 4));        // 获取中间记录的开始IP地址
			
			if ($ip fp, $this->getlong3());
				$endip = strrev(fread($this->fp, 4));	// 获取中间记录的结束IP地址
				if ($ip > $endip)			// 用户的IP大于中间记录的结束IP地址时
				{
					$l = $i + 1;			// 将搜索的下边界修改为中间记录加一
				}
				else					// 用户的IP在中间记录的IP范围内时
				{
					$findip = $this->firstip + $i * 7;
					break;				// 则表示找到结果,退出循环
				}
			}
		}
		
		/* 获取查找到的IP地理位置信息 */
		fseek($this->fp, $findip);
		$location['beginip'] = long2ip($this->getlong());	// 用户IP所在范围的开始地址
		$offset = $this->getlong3();
		fseek($this->fp, $offset);
		$location['endip'] = long2ip($this->getlong());	// 用户IP所在范围的结束地址
		$byte = fread($this->fp, 1);				// 标志字节
		switch (ord($byte)) 
		{
			case 1: 					// 标志字节为1,表示国家和区域信息都被同时重定向
				$countryOffset = $this->getlong3();	// 重定向地址
				fseek($this->fp, $countryOffset);
				$byte = fread($this->fp, 1);		// 标志字节
				switch (ord($byte)) 
				{
					case 2:				// 标志字节为2,表示国家信息又被重定向
						fseek($this->fp, $this->getlong3());
						$location['country'] = $this->getstring();
						fseek($this->fp, $countryOffset + 4);
						$location['area'] = $this->getarea();
						break;
					default:			// 否则,表示国家信息没有被重定向
						$location['country'] = $this->getstring($byte);
						$location['area'] = $this->getarea();
						break;
				}
				break;
			case 2: 					// 标志字节为2,表示国家信息被重定向
				fseek($this->fp, $this->getlong3());
				$location['country'] = $this->getstring();
				fseek($this->fp, $offset + 8);
				$location['area'] = $this->getarea();
				break;
			default:					// 否则,表示国家信息没有被重定向
				$location['country'] = $this->getstring($byte);
				$location['area'] = $this->getarea();
				break;
		}
		
		if ($location['country'] == " CZ88.NET")		// CZ88.NET表示没有有效信息
		{
			$location['country'] = "未知";
		}
		if ($location['area'] == " CZ88.NET") 
		{
			$location['area'] = "";
		}
		return $location;
	}
	
	/**
	 * 获取客户端IP地址
	 * */
	function clientIp(){
		if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
			$onlineip = getenv('HTTP_CLIENT_IP');
		} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
			$onlineip = getenv('HTTP_X_FORWARDED_FOR');
		} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
			$onlineip = getenv('REMOTE_ADDR');
		} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
			$onlineip = $_SERVER['REMOTE_ADDR'];
		}
		preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches);
		$onlineip = $onlineipmatches[0] ? $onlineipmatches[0] : 'unknown';
		unset($onlineipmatches);
		return $onlineip;
	}
    
	/**
	 * 构造函数,打开 QQWry.Dat 文件并初始化类中的信息
	 * @param string $filename
	 * @return IpLocation
	 */
	function IpLocation($filename = "") 
	{
		if(!$filename) $filename = dirname(__FILE__) . '/QQWry.Dat';
		if(!file_exists($filename)) exit('qqwry.dat is not exists!');
		if (($this->fp = @fopen($filename, 'rb')) !== false) 
		{
			$this->firstip = $this->getlong();
			$this->lastip = $this->getlong();
			$this->totalip = ($this->lastip - $this->firstip) / 7;
			register_shutdown_function(array(&$this, '_IpLocation'));
		}
	}
    
	/**
	* 析构函数,用于在页面执行结束后自动关闭打开的文件。
	*/
	function _IpLocation() 
	{
		fclose($this->fp);
	}
}

Nach dem Login kopieren
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Unterschiede zwischen Huawei GT3 Pro und GT4? Was sind die Unterschiede zwischen Huawei GT3 Pro und GT4? Dec 29, 2023 pm 02:27 PM

Viele Benutzer werden sich bei der Auswahl von Smartwatches für die Marke Huawei entscheiden. Viele Benutzer sind neugierig auf den Unterschied zwischen Huawei GT3pro und GT4. Was sind die Unterschiede zwischen Huawei GT3pro und GT4? 1. Aussehen GT4: 46 mm und 41 mm, das Material ist Glasspiegel + Edelstahlgehäuse + hochauflösende Faserrückschale. GT3pro: 46,6 mm und 42,9 mm, das Material ist Saphirglas + Titangehäuse/Keramikgehäuse + Keramikrückschale 2. Gesundes GT4: Mit dem neuesten Huawei Truseen5.5+-Algorithmus werden die Ergebnisse genauer. GT3pro: EKG-Elektrokardiogramm sowie Blutgefäß und Sicherheit hinzugefügt

Detaillierte Erläuterung der Verwendung von Return in der C-Sprache Detaillierte Erläuterung der Verwendung von Return in der C-Sprache Oct 07, 2023 am 10:58 AM

Die Verwendung von return in der C-Sprache ist: 1. Für Funktionen, deren Rückgabewerttyp ungültig ist, können Sie die Rückgabeanweisung verwenden, um die Ausführung der Funktion vorzeitig zu beenden. 2. Für Funktionen, deren Rückgabewerttyp nicht ungültig ist, ist die Funktion von Die Return-Anweisung dient dazu, die Ausführung der Funktion zu beenden. 3. Beenden Sie die Ausführung der Funktion vorzeitig wenn die Funktion keinen Wert zurückgibt.

Fix: Snipping-Tool funktioniert unter Windows 11 nicht Fix: Snipping-Tool funktioniert unter Windows 11 nicht Aug 24, 2023 am 09:48 AM

Warum das Snipping-Tool unter Windows 11 nicht funktioniert Das Verständnis der Grundursache des Problems kann dabei helfen, die richtige Lösung zu finden. Hier sind die häufigsten Gründe, warum das Snipping Tool möglicherweise nicht ordnungsgemäß funktioniert: Focus Assistant ist aktiviert: Dies verhindert, dass das Snipping Tool geöffnet wird. Beschädigte Anwendung: Wenn das Snipping-Tool beim Start abstürzt, ist es möglicherweise beschädigt. Veraltete Grafiktreiber: Inkompatible Treiber können das Snipping-Tool beeinträchtigen. Störungen durch andere Anwendungen: Andere laufende Anwendungen können mit dem Snipping Tool in Konflikt geraten. Das Zertifikat ist abgelaufen: Ein Fehler während des Upgrade-Vorgangs kann zu diesem Problem führen. Diese einfache Lösung ist für die meisten Benutzer geeignet und erfordert keine besonderen technischen Kenntnisse. 1. Aktualisieren Sie Windows- und Microsoft Store-Apps

Wie ist die Ausführungsreihenfolge von Return- und Final-Anweisungen in Java? Wie ist die Ausführungsreihenfolge von Return- und Final-Anweisungen in Java? Apr 25, 2023 pm 07:55 PM

Quellcode: publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}}# Ausgabe Die Ausgabe des obigen Codes kann einfach zu dem Schluss kommen: return wird ausgeführt, bevor wir uns schließlich ansehen, was auf der Bytecode-Ebene passiert. Im Folgenden wird ein Teil des Bytecodes der Methode case1 abgefangen und mit dem Quellcode verglichen, um die Bedeutung jeder Anweisung darin zu kommentieren

Analyse von Standortkonfigurationsbeispielen im Nginx-Server Analyse von Standortkonfigurationsbeispielen im Nginx-Server May 24, 2023 pm 02:05 PM

Lassen Sie mich zunächst kurz die Arten von Standort- und Übereinstimmungsregeln am Beispiel von nginxwiki vorstellen: location=/{#matchesthequery/only.[configurationa]}location/{#matchesanyquery,sinceallqueriesbeginwith/,butregular#expressionsandanylongerconventionalblockswillbe#matchedfirst .[ Konfigurationb]}Standort^~/im

So beheben Sie den Fehler „Verbindung zum App Store nicht möglich' auf dem iPhone So beheben Sie den Fehler „Verbindung zum App Store nicht möglich' auf dem iPhone Jul 29, 2023 am 08:22 AM

Teil 1: Erste Schritte zur Fehlerbehebung Überprüfen des Apple-Systemstatus: Bevor wir uns mit komplexen Lösungen befassen, beginnen wir mit den Grundlagen. Das Problem liegt möglicherweise nicht an Ihrem Gerät; die Server von Apple sind möglicherweise ausgefallen. Besuchen Sie die Systemstatusseite von Apple, um zu sehen, ob der AppStore ordnungsgemäß funktioniert. Wenn es ein Problem gibt, können Sie nur warten, bis Apple es behebt. Überprüfen Sie Ihre Internetverbindung: Stellen Sie sicher, dass Sie über eine stabile Internetverbindung verfügen, da das Problem „Verbindung zum AppStore nicht möglich“ manchmal auf eine schlechte Verbindung zurückzuführen ist. Versuchen Sie, zwischen WLAN und mobilen Daten zu wechseln oder die Netzwerkeinstellungen zurückzusetzen (Allgemein > Zurücksetzen > Netzwerkeinstellungen zurücksetzen > Einstellungen). Aktualisieren Sie Ihre iOS-Version:

Wie man URI am Nginx-Standort abfängt Wie man URI am Nginx-Standort abfängt May 18, 2023 pm 12:07 PM

Hinweis: Die Root- und Aliasroot-Anweisungen in location legen den Suchstamm nur auf das von root festgelegte Verzeichnis fest, d Die Aias-Anweisung schneidet die passende URL ab und verwendet dann den durch Alias ​​festgelegten Pfad plus die verbleibende URL als Unterpfad, um die URL von Proxy_Pass an der Position zu finden. Wenn die URL von Proxy_Pass keine URL hat und das Ende „/“ ist. ", die passende URL wird abgeschnitten. Wenn das Ende nicht „/" ist, wird die passende URL nicht abgeschnitten, wenn die Proxy_Pass-URL eine URL enthält

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

See all articles