Maison développement back-end tutoriel php 利用纯真QQIP数据库做快速IP归属地查询_PHP

利用纯真QQIP数据库做快速IP归属地查询_PHP

Jun 01, 2016 pm 12:26 PM
ip 利用 Appartenir 快速 数据库 查询

利用纯真版IP数据文件,优化查询方法,提高格式转换效率,减少读取文件的次数,达到快速在线查询IP的目的。大幅度减少文件读取次数,对保护服务器硬盘应该有一定的好处。并增加一个数据库浏览器,可以浏览纯真版QQIP数据文件。


1.用ip2long()做IP校验
2.用sprintf做强制转换
3.用unpack分析二进制数据,减少了 文件读取次数
4.substr strpos分析字符串,这也减少了文件读取次数
5.可惜速度没有明显提高;)


IP Address:Submit

define('IPDATA','ipdata.db');
//get ip
$ip = isset($_GET['ip'])?$_GET['ip']:getenv("REMOTE_ADDR");
echo "IP: ARIN";
if (-1 === ($ip = ip2long($ip)))  die("Invalid IP");
$ip = sprintf("%u",$ip);
$country = $city = '';
echo "
Record No:".Whois($ip,$country,$city);
echo "
Location:  []";

function Whois($ip,&$country,&$city)
{
  //open ip-database
  if (NULL == ($fp = fopen(IPDATA, "rb"))) die("cannot open dbfile.");
  //get data section offset
  $offset = unpack("Vbegin/Vend", fread($fp, 8));
  $begin = 0;$end = ($offset['end'] - $offset['begin']) / 7;
  //seek index
  while ($begin     $num = ($begin + $end) >> 1;
    fseek ($fp , ($offset['begin'] + $num * 7) , SEEK_SET ) ;
    $record = unpack("Vip", fread($fp, 4));
    $record['ip'] = sprintf("%u",$record['ip']);
    if ($ip == $record['ip']) { $begin = $num; break;}
    if ($ip > $record['ip'])    $begin = $num;
    else                        $end = $num;    
  }
  //read index
  $record = unpack("Vbeginip/Vloc", ReadBinary($fp,$offset['begin']+$begin*7) );
  $locoff =($record['loc'] & 0x00FFFFFF);
  $info = unpack("Vendip/Vloc",ReadBinary($fp,$locoff)) ;
  $info['endip'] = sprintf("%u",$info['endip']);
  if($info['endip']   //get GEO
  $countryoff = (($info['loc'] & 0x000000FF)== 1)?($info['loc'] >> 8):($locoff+4);
  $country = ReadGEOStr($fp,$countryoff);
  $city = ReadGEOStr($fp,$countryoff);
  return $begin;
}  

function ReadGEOStr($fp,&$offset)
{
  $binarydata = ReadBinary($fp,$offset);
  $info = unpack("Vloc",$binarydata);
  if( ($info['loc'] & 0x000000FF) == 2 ) {
    $GeoStr = ReadBinary($fp,$info['loc'] >> 8 );
    $GeoStr = substr($GeoStr,0,strpos($GeoStr, 0));
    $offset += 4;
  }else {
    $len = strpos($binarydata, 0);
    $GeoStr = substr($binarydata,0,$len);
    $offset += $len + 1;
  }
  return $GeoStr;
}  

function ReadBinary($fp,$positionz)
{
  fseek ( $fp , $positionz , SEEK_SET ) ;
  return fread ( $fp , 32 ) ;
}
?>
===================================

2005-02-22
cnss格式QQ数据库
集成PHP浏览查询器
集成官方whois查询 http://www.mydot.org/t539.html



IP Address:
Submit



Start
Count
Submit


define('IPDATA','ipdata.db');

$fp = NULL;
if( isset($_GET['ip']) )
{
  $ipx = $_GET['ip'];
  if (-1 === ($ip = ip2long($ipx)))  die("Invalid IP");
  echo "IP: ARIN";
  $ip = sprintf("%u",$ip);
  $ippostion = '';
  $start_time=get_time();
  echo "
Record No:".Whois($ippostion);
  $end_time=get_time();
  echo "
Location:";
  echo "
Process Time:".round($end_time-$start_time,3)."seconds";
}
else if ( isset($_GET['s']) )
{
  $first = $_GET['s'];
  $rcount = $_GET['c'];
  $startoff = $end = 0;
  GetSection($startoff,$end);
    
  if( ($i = $first+$rcount)>$end  || $first    die ("count overflow");
  else
  {
    $j = $first-$rcount;
    echo "Prev:::";
    $j = $first+$rcount;
    echo "Next
";
  }
    
  while( $first   {
    echo ReadRecord($startoff,$first,$startip,$endip);
    $startip = long2ip($startip);
    $endip = long2ip($endip);
    echo " :--
";
    $first ++;
  }
  fclose($fp);
}
else
{
   echo "Powered by upsdn.net";
   echo "
Thanks to cz88.net";
}  



function Whois(&$country)
{
  global $ip,$fp;

  $startoff = $begin = $end = 0;
  GetSection($startoff,$end);
  //seek index
  while ($begin     $num = ($begin + $end) >> 1;
    fseek ($fp , $startoff + $num * 7 , SEEK_SET ) ;
    $record = unpack("Vip", fread($fp, 4));
    $record['ip'] = sprintf("%u",$record['ip']);
    if ($ip == $record['ip']) { $begin = $num; break;}
    if ($ip > $record['ip'])    $begin = $num;
    else                        $end = $num;    
  }
  //read index
  $startip = $endip = 0;
  $country = ReadRecord($startoff,$begin,$startip,$endip);
  fclose($fp);
  return $begin;
}  

function GetSection(&$startoff,&$total)
{
  global $fp;
  //open ip-database
  if (NULL == ($fp = fopen(IPDATA, "rb"))) die("cannot open dbfile.");
  //get data section offset
  $offset = unpack("Vbegin/Vend", fread($fp, 8));
  $total = ($offset['end'] - $offset['begin']) / 7;
  $startoff = $offset['begin'];
}

function ReadRecord($startoff,$number,&$startip,&$endip)
{
  global $ip;
  $record = unpack("Vbeginip/Vloc", ReadBinary($startoff+$number*7) );
  $startip = $record['beginip'];
  $locoff =($record['loc'] & 0x00FFFFFF);
  $info = unpack("Vendip/Vloc",ReadBinary($locoff)) ;
  $endip = $info['endip'];
  $info['endip'] = sprintf("%u",$info['endip']);
  if($info['endip']   //get GEO
  $countryoff = (($info['loc'] & 0x000000FF)== 1)?($info['loc'] >> 8):($locoff+4);
  return ReadGEOStr($countryoff)."->".ReadGEOStr($countryoff);    
}

function ReadGEOStr(&$offset)
{
  $binarydata = ReadBinary($offset);
  $info = unpack("Vloc",$binarydata);
  if( ($info['loc'] & 0x000000FF) == 2 ) {
    $GeoStr = ReadBinary($info['loc'] >> 8 );
    $GeoStr = substr($GeoStr,0,strpos($GeoStr, 0));
    $offset += 4;
  }else {
    $len = strpos($binarydata, 0);
    $GeoStr = substr($binarydata,0,$len);
    $offset += $len + 1;
  }
  return $GeoStr;
}  

function ReadBinary($positionz)
{
  global $fp;
  fseek ( $fp , $positionz , SEEK_SET ) ;
  return fread ( $fp , 32 ) ;
}

function get_time() {
  $mtime=microtime();
  $mtime=explode(" ",$mtime);
  $mtime=$mtime[1]+$mtime[0];
  return($mtime);
}
?>

纯真版IP数据库下载:http://www.cz88.net/ip/
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

12306 Comment vérifier l'historique des enregistrements d'achat de billets Comment vérifier l'historique des enregistrements d'achat de billets 12306 Comment vérifier l'historique des enregistrements d'achat de billets Comment vérifier l'historique des enregistrements d'achat de billets Mar 28, 2024 pm 03:11 PM

Téléchargez la dernière version de l'application de réservation de billets 12306. C'est un logiciel d'achat de billets de voyage dont tout le monde est très satisfait. Il est très pratique d'aller où vous voulez. Il existe de nombreuses sources de billets fournies dans le logiciel. -authentification par nom pour acheter des billets en ligne. Tous les utilisateurs Vous pouvez facilement acheter des billets de voyage et des billets d'avion et profiter de différentes réductions. Vous pouvez également commencer à réserver à l'avance pour récupérer des billets. Vous pouvez réserver des hôtels ou des transferts spéciaux en voiture. Grâce à lui, vous pouvez aller où vous voulez et acheter des billets en un seul clic. Voyager est plus simple et plus pratique, ce qui rend l'expérience de voyage de chacun. plus confortable. Désormais, l'éditeur le détaille en ligne. Offre à 12306 utilisateurs un moyen de consulter l'historique des achats de billets. 1. Ouvrez Railway 12306, cliquez sur Mon dans le coin inférieur droit, puis cliquez sur Ma commande. 2. Cliquez sur Payé sur la page de commande. 3. Sur la page payante

Comment vérifier vos diplômes universitaires sur Xuexin.com Comment vérifier vos diplômes universitaires sur Xuexin.com Mar 28, 2024 pm 04:31 PM

Comment vérifier mes diplômes universitaires sur Xuexin.com ? Vous pouvez vérifier vos diplômes universitaires sur Xuexin.com. De nombreux utilisateurs ne savent pas comment vérifier leurs diplômes universitaires sur Xuexin.com. Ensuite, l'éditeur vous propose un didacticiel graphique sur la façon de vérifier vos diplômes universitaires sur Xuexin.com. les utilisateurs viennent jeter un oeil ! Tutoriel d'utilisation de Xuexin.com : Comment vérifier vos diplômes universitaires sur Xuexin.com 1. Entrée Xuexin.com : https://www.chsi.com.cn/ 2. Requête sur le site Web : Étape 1 : Cliquez sur l'adresse Xuexin.com ci-dessus pour accéder à la page d'accueil Cliquez sur [Requête sur l'éducation] ; Étape 2 : Sur la dernière page Web, cliquez sur [Requête] comme indiqué par la flèche dans la figure ci-dessous. Étape 3 : Cliquez ensuite sur [Connexion au fichier de crédits académiques] sur la nouvelle page ; Étape 4 : Sur la page de connexion, saisissez les informations et cliquez sur [Connexion] ;

Quelle est la différence dans le chemin « Poste de travail » dans Win11 ? Un moyen rapide de le trouver ! Quelle est la différence dans le chemin « Poste de travail » dans Win11 ? Un moyen rapide de le trouver ! Mar 29, 2024 pm 12:33 PM

Quelle est la différence dans le chemin « Poste de travail » dans Win11 ? Un moyen rapide de le trouver ! Comme le système Windows est constamment mis à jour, le dernier système Windows 11 apporte également de nouvelles modifications et fonctions. L'un des problèmes courants est que les utilisateurs ne peuvent pas trouver le chemin d'accès à « Poste de travail » dans le système Win11. Il s'agissait généralement d'une opération simple dans les systèmes Windows précédents. Cet article présentera en quoi les chemins de « Poste de travail » sont différents dans le système Win11 et comment les trouver rapidement. Sous Windows1

iOS 18 ajoute une nouvelle fonction d'album 'Récupéré' pour récupérer les photos perdues ou endommagées iOS 18 ajoute une nouvelle fonction d'album 'Récupéré' pour récupérer les photos perdues ou endommagées Jul 18, 2024 am 05:48 AM

Les dernières versions d'Apple des systèmes iOS18, iPadOS18 et macOS Sequoia ont ajouté une fonctionnalité importante à l'application Photos, conçue pour aider les utilisateurs à récupérer facilement des photos et des vidéos perdues ou endommagées pour diverses raisons. La nouvelle fonctionnalité introduit un album appelé "Récupéré" dans la section Outils de l'application Photos qui apparaîtra automatiquement lorsqu'un utilisateur a des photos ou des vidéos sur son appareil qui ne font pas partie de sa photothèque. L'émergence de l'album « Récupéré » offre une solution aux photos et vidéos perdues en raison d'une corruption de la base de données, d'une application d'appareil photo qui n'enregistre pas correctement dans la photothèque ou d'une application tierce gérant la photothèque. Les utilisateurs n'ont besoin que de quelques étapes simples

Comment Hibernate implémente-t-il le mappage polymorphe ? Comment Hibernate implémente-t-il le mappage polymorphe ? Apr 17, 2024 pm 12:09 PM

Le mappage polymorphe Hibernate peut mapper les classes héritées à la base de données et fournit les types de mappage suivants : join-subclass : crée une table séparée pour la sous-classe, incluant toutes les colonnes de la classe parent. table par classe : créez une table distincte pour les sous-classes, contenant uniquement des colonnes spécifiques aux sous-classes. union-subclass : similaire à join-subclass, mais la table de classe parent réunit toutes les colonnes de la sous-classe.

Une analyse approfondie de la façon dont HTML lit la base de données Une analyse approfondie de la façon dont HTML lit la base de données Apr 09, 2024 pm 12:36 PM

HTML ne peut pas lire directement la base de données, mais cela peut être réalisé via JavaScript et AJAX. Les étapes comprennent l'établissement d'une connexion à la base de données, l'envoi d'une requête, le traitement de la réponse et la mise à jour de la page. Cet article fournit un exemple pratique d'utilisation de JavaScript, AJAX et PHP pour lire les données d'une base de données MySQL, montrant comment afficher dynamiquement les résultats d'une requête dans une page HTML. Cet exemple utilise XMLHttpRequest pour établir une connexion à la base de données, envoyer une requête et traiter la réponse, remplissant ainsi les données dans les éléments de la page et réalisant la fonction de lecture HTML de la base de données.

Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP Jun 04, 2024 pm 01:42 PM

Comment utiliser MySQLi pour établir une connexion à une base de données en PHP : Inclure l'extension MySQLi (require_once) Créer une fonction de connexion (functionconnect_to_db) Appeler la fonction de connexion ($conn=connect_to_db()) Exécuter une requête ($result=$conn->query()) Fermer connexion ( $conn->close())

Comment gérer les erreurs de connexion à la base de données en PHP Comment gérer les erreurs de connexion à la base de données en PHP Jun 05, 2024 pm 02:16 PM

Pour gérer les erreurs de connexion à la base de données en PHP, vous pouvez utiliser les étapes suivantes : Utilisez mysqli_connect_errno() pour obtenir le code d'erreur. Utilisez mysqli_connect_error() pour obtenir le message d'erreur. En capturant et en enregistrant ces messages d'erreur, les problèmes de connexion à la base de données peuvent être facilement identifiés et résolus, garantissant ainsi le bon fonctionnement de votre application.

See all articles