Windows.  Virus.  Anteckningsböcker.  Internet.  kontor.  Verktyg.  Förare

Fortsätter ämnet om IP, den här artikeln kommer att överväga sätt att bestämma landet, staden och andra geo-ino om användaren genom hans IP.

GeoIP som ett PHP-tillägg

Förmodligen det mest använda biblioteket för att fastställa IP (off. doc på php.net). Det är inte förvånande, eftersom den binära databasen + kompilerad PHP-tillägg fungerar snabbare än alla andra metoder.

Installation på Ubuntu Server:

sudo apt-get installera php5-geoip

Ladda ner efter installation Senaste uppdateringarna bas IP-adresser:

Efter dessa steg måste du starta om PHP. Detta är nödvändigt för att PHP-tolken ska ladda det nyinstallerade tillägget (php5-geoip) och de nya IP-adressbaserna.

Det är också nödvändigt att regelbundet uppdatera databasen med IP-adresser:

sudo wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz sudo gunzip GeoIP.dat.gz sudo mv GeoIP.dat /usr/share/GeoIP/

Efter uppdateringen måste du också ladda om PHP för att tillämpa den uppdaterade IP-adressdatabasen:

sudo service php5-fpm restart # om du använder NGINX # eller sudo service apache2 restart # om du använder Apache

När GeoIP väl är inställt kan den användas i kod så här:

GeoIP som ett kompositpaket

Denna metod är nästan identisk med GeoIP som PHP-tillägg, med ett undantag: du behöver inte installera ytterligare tillägg på servern.

Detta är användbart om du inte har root-åtkomst till servern och inte kan installera PHP-tillägg.

Nackdelen med denna metod är att den är något långsammare än den kompilerade PHP-förlängningen.

Först och främst måste du ladda ner databasen med IP-adresser i ett speciellt format (.mmdb) från off. webbplats och placera den i valfri mapp på servern som är tillgänglig för dig:

Wget -N http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz gunzip GeoLite2-Country.mmdb.gz mv GeoLite2-Country.mmdb /my-site/data/GeoIP/

Kompositören kräver geoip2/geoip2:~2.0

Efter dessa två enkla steg kan du börja använda det i dina PHP-skript, till exempel:

country($_SERVER["REMOTE_ADDR"]); var_dump($geo->country->isoCode); var_dump($geo->land->namn);

Sypex Geo

Det kommer också som en PHP-klass och ett binärt bibliotek. Tyvärr avstängd. den har inget kompositpaket. Men du kan använda och inte av: https://packagist.org/packages/igi/sypexgeo .

Det här kompositpaketet är också bra eftersom det låter dig uppdatera databasen med IP-adresser när du kör kommandot "composer install".

För att installera det här kompositpaketet och ställa in automatisk uppdatering av databasen med IP-adresser måste du skriva följande inställningar i filen composer.json:

( "require-dev": ( "igi/sypexgeo": "@dev" ), "scripts": ( "post-install-cmd": [ "IgI\\SypexGeo\\Composer::installDatabases" ] ), " extra": ( "sypexgeo_remote": "https://sypexgeo.net/files/SxGeoCountry.zip", "sypexgeo_local": "/var/www/at0m1x.dev/test/data/SxGeo.dat") ) )

Var uppmärksam på följande inställningar:

  • paketanslutningen måste placeras i avsnittet Require-dev
  • när du ansluter ett paket måste du ange stabilitetsnivån @dev
  • i avsnittet sypexgeo_remote, istället för SxGeoCountry.zip, kan du ange SxGeoCity_utf8.zip
  • i parametern sypexgeo_local måste du ange din sökväg till mappen

Installation av kompositör

Efter installation av själva biblioteket kommer databasen med IP-adresser också att uppdateras från av. webbplats.

Ett exempel på användning i PHP-kod:

getCountry("89.163.220.14"));

Förutom att använda kompositörspaketet kan du också använda REST API för detta projekt, till exempel: http://api.sypexgeo.net/json/89.163.220.14 Läs om onlinetjänster för att bestämma geoinformation nedan i den här artikeln.

IP2LOCATION

Ytterligare ett tonsättarbibliotek från utlandet.

Installation:

Composer kräver ip2location/ip2location-php

När du installerar det här kompositpaketet, och även när du uppdaterar det, kommer databasen med IP-adresser också att uppdateras, som finns på följande sökväg:

/vendor/ip2location/ip2location-php/databases/IP2LOCATION-LITE-DB1.BIN

Användande:

lookup("89.163.220.14", \IP2Plats\Databas::ALLA); eka"

"; echo "IP-nummer: " . $records["ipNumber"] . "\n"; echo "IP-version: " . $records["ipVersion"] . "\n"; eko "IP-adress: " . $ records["ipAddress"] . "\n"; echo "Landskod: " . $records["countryCode"] . "\n"; echo "Landsnamn: " . $records["countryName"] . "\n "; eka"
";

TabGeo

Dök upp relativt nyligen, den första versionen av kompositörspaketet publicerades den 27 september 2015.

Positionerar sig som snabbast jämfört med konkurrenter som: GeoIP och Sypex Geo. Men hastigheten uppnås på grund av den lilla storleken på basen, som ett resultat av vilket detta bibliotek endast bestämmer landskoden.

Det distribueras som ett kompositpaket + en binär databas i sitt eget format.

För att installera det här biblioteket behöver du bara inkludera kompositörspaketet:

Kompositörer kräver tabgeo/country

Detta kommer att installera både PHP-biblioteket och själva databasen:

Exempel på användning i PHP-skript:

Det är värt att notera att TabGeo endast låter dig få en tvåsiffrig landskod i ISO 3166-1 alpha-2 format. Om du behöver något mer, till exempel för att definiera en region, stad, tidszon, etc., så behöver du använda samma GeoIP, till exempel, eftersom det låter dig definiera allt.

Onlinetjänster för geo-targeting

Alternativt kan du använda speciella onlinetjänster. Principen för deras arbete är enkel: vi skickar GET som en IP-parameter och som svar får vi geoinformation i JSON- eller XML-format.

Fördelen med denna metod är att den inte bara kan användas på PHP-sidan, utan även på JavaScript-sidan, till exempel.

Men det finns också betydande nackdelar:

  • det fungerar inte lika snabbt som PHP-biblioteket;
  • du kan inte uppdatera databasen med IP-adresser;
  • din server kan blockeras för frekventa samtal.

Här är några av dessa onlinetjänster:

Slutsats

Nästan alla ovanstående bibliotek tillhandahåller två typer av IP-adressdatabaser:

  • lätt, endast med en lista över länder, som regel innehåller namnet Land;
  • mera fullständig, som förutom länder även innehåller information om stora städer, i regel innehåller namnet Stad och väger mer;

En mer komplett databas med IP-adresser med städer kommer givetvis att fungera lite långsammare på grund av att den är större i volym.

Det är mest korrekt att använda GeoIP som PHP-tillägg. Därför att det kommer att fungera alltid och snabbt. Du kan också alltid uppdatera databasen med IP-adresser.

Om det inte är möjligt att installera GeoIP som PHP-tillägg kan du använda något av kompositörspaketen: GeoIP, Sypex Geo, IP2LOCATION eller TabGeo.

Om användningen av kompositpaketet av någon anledning inte är möjlig, återstår det att använda onlinetjänster. Men du måste definitivt cache förfrågningar för dessa tjänster i din databas. Cachning är nödvändigt för att inte skicka samma begäran många gånger. Det räcker att få geoinformationen för IP-adressen av intresse en gång via onlinetjänsten, sedan spara den i din databas och sedan ta den från databasen. Således kommer du att minska antalet förfrågningar för onlinetjänsten och minska sannolikheten för att onlinetjänsten blockerar dig för flera förfrågningar.

Det är värt att notera att nästan alla ovanstående bibliotek har gratis och betalda versioner. I betalversioner har du tillgång till mer geodata än i gratisversioner.

Hej alla!

Jag kommer inte att säga det ofta, men då och då måste utvecklare bestämma staden efter IP i ett PHP-skript.

Du bestämde dig till exempel för att göra det enklare för användaren att ange kontaktuppgifter vid beställning i en webbutik. Eller så vill du ställa in webbplatsens gränssnittsspråk beroende på vilket land besökaren kom till din webbplats från.

Tja, oftast är det förmodligen nödvändigt att bestämma staden genom IP i PHP med hjälp av GeoIP för utvecklare av olika annonsnätverk för att kunna erbjuda användarna riktad reklam beroende på geografisk plats.

Det tog mig bara en gång att ta reda på landet efter IP i ett PHP-skript, när jag bestämde mig för att ladda upp widgets från olika sociala nätverk till webbplatsen för användare från olika länder. Jag kommer att skriva mer detaljerat om varför detta inte var nödvändigt och vad som hände till slut i nästa artikel.

Under tiden, låt oss prata om hur många sätt att bestämma staden och landet efter IP i PHP som finns och vilka alternativ för implementering som finns.

PHP GeoIP - standard tredjepartsfunktionalitet

Jag kallade specifikt beskrivningen av den första metoden. Faktum är att i PHP självt är det omöjligt att bestämma staden och landet efter IP-adress - språket har inte de nödvändiga verktygen för detta.
Men i den officiella dokumentationen finns en ledtråd hur man gör.

PHP GeoIP är ett tredjepartsbibliotek som måste inkluderas ytterligare, trots att beskrivningen av funktionerna som ingår i det är en del av den officiella PHP-dokumentationen - http://php.net/manual/en/ref.geoip .php

I princip är motiven för PHP-utvecklare ganska förståeliga.

För det första kräver inkluderingen av denna modul i själva språkpaketet en stor mängd serverresurser.

För det andra fungerar GeoIP PHP utifrån en lista med IP-adresser som motsvarar vissa länder och städer. Därför kräver GeoIP PHP ständigt stöd och expansion/modernisering av den befintliga basen, vilket skulle vara en onödig huvudvärk för PHP-utvecklare.

Tja, och för det tredje, att bestämma staden genom IP i PHP är en funktion som sällan används i praktiken.

Som ett resultat, på grund av dessa faktorer, är PHP GeoIP en tredjepartstillägg, vars stöd och skapandet av ett API för integration på befintliga webbplatser hanteras av MaxMind, en länk till vilken finns i beskrivningen av detta bibliotek .

Jag kommer inte att beskriva processen att installera den på servern, eftersom Jag har själv inte gjort detta i praktiken, och på Internet kl det här ögonblicket Full av manualer för installation av PHP GeoIP på både Linux- och Windows-servrar.

Jag kan bara säga att denna metod för att bestämma stad, land och annan geoinformation genom IP i PHP har två betydande nackdelar:

  1. Tillgång till databasen med fullständig information om IP-adresser som tillhandahålls av MaxMind är betald. Dessutom är beloppet i dollar, konstigt nog 🙂 Endast betydligt reducerade alternativ är tillgängliga gratis - http://dev.maxmind.com/geoip/geoip2/geolite2/
  2. Med tanke på att PHP GeoIP är ett tredjepartstillägg kommer det att behöva installeras separat på servern, vilket, om delad hosting används, kan bli ett svårt uppdrag. Naturligtvis kan du kontakta teknisk support, men inte det faktum att de hjälper dig. Till exempel, när jag blev ombedd att installera Sphinx, vägrade de.

Bestämning av stad genom IP i PHP med hjälp av alternativa bibliotek

Ett annat sätt att ta reda på staden efter IP i ett PHP-skript är att använda alternativa serverbibliotek och informationsdatabaser för andra IP-adresser än MaxMind.

Men de har samma nackdelar som den tidigare versionen, eftersom. är bara konkurrenter till MaxMind. Tillgång till databaser och möjligheten att använda deras API betalas också. Du kan bara få en lista över länder och städer per IP gratis, medan du med en betald tariff kan få en bredare lista med data.

Den enda fördelen gentemot PHP GeoIP är att biblioteksdatan är integrerad i PHP-koden, och inte på servernivå, d.v.s. de kan användas även på delad hosting.

Ett exempel på ett sådant bibliotek tillhandahålls av tjänsten db-ip.com.

Förresten, tjänsten jag nämnde tillhandahåller inte bara ett eget PHP-bibliotek för att hämta geodata från IP-klienter, utan också tillgång till informationsdatabaser efter adresser. Så i princip ingen stör dig att använda dem i PHP GeoIP för att använda dess API, utan ta information från andra källor.

Tja, och absolut ingen stör dig att skriva din egen parser för IP-adressdatabasfiler för att få information från dem själv, utan tillstånd från tredje part.

Hur man bestämmer staden med IP i PHP online

Nåväl, här kommer jag till den sista metoden för hur man tar reda på landet genom IP i PHP och annan geoinformation, som jag själv använde i praktiken.

Det består i att använda API:et för onlinetjänster som låter dig ta emot data via IP-adress online.

Jag bestämde mig för att bestämma staden genom IP i PHP på detta sätt, eftersom det saknar den största nackdelen med de tidigare. Det är nämligen det enklaste att implementera - du behöver inte installera och konfigurera något på servern, och dessutom fråga den tekniska supporten för delad hosting om det.

För att få den nödvändiga informationen via IP behöver du bara skicka en förfrågan till en specifik URL och bearbeta svaret.

När det gäller kostnaden för deras användning - för det mesta betalas de också, eftersom. arbetar som regel utifrån befintliga kommersiella IP-baser. Men det finns också gratistjänster som kanske ger så fullständig information som kommersiell, men den kan tas emot i obegränsad mängd.

Det är sant att de mycket snabbt upphör att existera, konstigt nog, eftersom. det är mycket svårt att överleva att tillhandahålla sådana tjänster. Detta visades av min analys av gratis onlinetjänster för att bestämma städer och länder efter IP, som jag utförde för personliga ändamål. De blinkade på många sajter, men när man försökte använda dem stod det klart att de hade upphört att existera.

Som ett resultat hittade jag det jag behövde, vad jag vill bestämma med dig - http://www.geoplugin.com/

Denna tjänst gör det möjligt att både bestämma staden och annan information via IP på tjänstens webbplats, och att göra det från koden. Därefter kommer jag att ge ett exempel på att bestämma landet genom IP i ett PHP-skript med hjälp av geoplugin.com. kod utförs med den kod som beskrivs i artikeln genom referens.

"", "stad"=>""); if(filter_var($client, FILTER_VALIDATE_IP)) $ip = $client; elseif(filter_var($forward, FILTER_VALIDATE_IP)) $ip = $forward; annars $ip = $fjärr; $ip_data = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip)); if($ip_data && $ip_data->geoplugin_countryName != null) ( $result = $ip_data->geoplugin_countryCode; ) echo $result; ?>

Som du kan se är kärnan i ovanstående kod att bestämma IP-adressen för klienten, med hänsyn till möjligheten att ansluta via en proxy, och skicka en begäran via GeoPlugin API med ytterligare avkodning och analys av resultaten.

I mitt exempel, som jag redan sa, resultatet av arbetet detta manus kommer att vara landskoden för webbplatsklienten. I allmänhet ser hela listan över returnerade parametrar ut så här (till exempel bestämde jag mig för att ta IP:n för Novosibirsk-regionen i Ryska federationen):

( "geoplugin_request":"195.208.128.3", "geoplugin_status":200, "geoplugin_credit":"En del av de returnerade data inkluderar GeoLite-data skapad av MaxMind, tillgänglig från http:\/\/www.maxmind.com<\/a>.", "geoplugin_city":"Novosibirsk", "geoplugin_region":"Novosibirsk", "geoplugin_areaCode":"0", "geoplugin_dmaCode":"0", "geoplugin_countryCode":"RU", "geoplugin_countryName":"Rysska federationen ", "geoplugin_continentCode":"EU", "geoplugin_latitude":"55.09", "geoplugin_longitude":"82.6519", "geoplugin_regionCode":"53", "geoplugin_regionName":"Novosibirsk", "geoplugin"_currencyRUCourrency "geoplugin_currencySymbol":"rub", "geoplugin_currencySymbol_UTF8":"\u0440\u0443\u0431", "geoplugin_currencyConverter":58.9289 )

Som du kan se använder den här tjänsten den tidigare nämnda MaxMind (geoplugin_credit-parameter), men det är svårt att gissa om det är betald information eller inte. Å ena sidan indikerar länken till källan att fri tillgång till IP-databasen används, men å andra sidan ser vi inte bara landet och staden, utan också en hel del all sorts information, inklusive staden , geografiska koordinater (längdgrad, latitud), aktuell valuta och till och med dess växelkurs.

Så denna tjänst kan kallas PHP GeoIP online. Dess enda skillnad från serverns motsvarighet är att den tar emot information över IP lite långsammare på grund av bristen på servercache. Men detta betyder inte att det inte finns på själva GeoPlugin-servern 😉 Så denna nackdel är ganska symbolisk.

I vilket fall som helst förtjänar utvecklarna av GeoPlugin applåder, och i synnerhet också för det faktum att de inte ens besköt sin webbplats med kontextuell reklam. De där. Hur de ens överlever är oklart. Det enda sättet att säga "tack" till dem är genom att donera till ett PayPal-konto.

Förresten, PHP-koden jag angav för att bestämma staden med IP är universell. Du kan använda den för att få geodata med hjälp av andra tjänster. Det enda du behöver ändra i den är tjänstens API-URL och namnet på de nödvändiga parametrarna som du behöver få.

Det var allt för mig. Skriv din feedback om artikeln i kommentarerna nedan och glöm inte att dela inlägget med dina vänner på sociala nätverk.

P.S.: om du behöver en hemsida eller behöver göra ändringar i en befintlig, men det finns ingen tid och lust för detta, kan jag erbjuda mina tjänster.

Över 5 års erfarenhet professionell webbutveckling. Arbeta med PHP, öppen vagn, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, Reagera, Vinkel och annan webbutvecklingsteknik.

Erfarenhet av att utveckla projekt på olika nivåer: målsidor, företagswebbplatser, E-handel, CRM, portaler. Inklusive stöd och utveckling Högbelastningsprojekt. Skicka dina ansökningar via e-post [e-postskyddad].

Där nämndes min "cykel", som kännetecknas av hög hastighet. En av de populära frågorna var möjligheten att bestämma staden genom IP.

Och nu, några månader senare, har projektet som började som "på skoj" växt till ett självständigt projekt.
En separat sida dedikerad till Sypex Geo-projektet har öppnats, där du kan ladda ner färska versioner API och databaser, samt läs dokumentationen.

För den som snabbt vill testa riktigheten av att bestämma staden genom IP - här är en länk till demosidan. Och under habrakatet kommer jag att beskriva några tekniska detaljer och ge resultatet av ett litet test.

Sypex Geo 2.1-format

Sedan den senaste artikeln publicerades har Sypex Geo-formatet (förkortat SxGeo) optimerats och möjligheten att inkludera två referensböcker – städer och regioner – har lagts till i databasen.

När du skapade ett nytt format ställdes följande prioriteringar:

  • hög hastighet
  • låg resursförbrukning
  • öppenhet (specifikationer för binära filformat för databas och API är öppna)
  • universalitet (möjligheten att skapa databaser med alla datamängder)
Formatet låter dig lagra data i olika kodningar. Efter att ha lämnat betaversionen kommer skript att publiceras för att konvertera databasen från MySQL till en binär DB-fil.

Databasen lagrar följande information:

  • Lands-ID
  • ISO 3166-1 landskod (två tecken)
  • FIPS 10-4 regionskod (två tecken)
  • Regionnamn (valfritt)
  • Stad
  • Latitud
  • Longitud
  • tidszon (valfritt)
Denna lista kan ändras och/eller utökas vid behov. Mer information om SxGeo 2.1-formatet finns på hemsidan.

Egen databas

Efter en mycket nära bekantskap med det populära geolokaliseringssystemet GeoLite City från MaxMind beslutades det att skapa en egen databas. Problemet är att GeoLite City har många felaktigheter, skräp, dubbletter av städer, överdriven uppdelning av intervall, såväl som problem med städer i fd Sovjetunionen (till exempel i stället för städer, namnen på företag eller namnen på de ansvariga från Whois tas).

Databasen är för närvarande baserad på GeoLite City, men innehåller redan en helt omdesignad täckning av Ryssland, Ukraina och Vitryssland. Efter hand kommer andra länder att specificeras, främst OSS och Europa. Sypex Geo City-databasen innehåller namnen på städer och regioner på ryska i UTF-8 (det finns fortfarande oöversatta namn), samt tidszon.

Dessutom finns andra databaser som konverterats till SxGeo 2.1-formatet tillgängliga på webbplatsen.

Användande

Användningen av Sypex Geo API är så enkel som möjligt.
1. Kopiera SxGeo.php och SxGeoCity.dat (eller andra databaser) till servern 2. Inkludera filen SxGeo.php i ditt skript genom att lägga till raden include("SxGeo.php"); 3. Skapa ett SxGeo-objekt //$SxGeo = new SxGeo(); // Standardläge, databasfil SxGeo.dat $SxGeo = new SxGeo("SxGeoCity.dat", SXGEO_BATCH | SXGEO_MEMORY); // Snabbaste läge 4. Bestäm staden (SxGeo City, GeoLite City, IpGeoBase) $SxGeo->get($ip); (returerar information om staden, utan namnet på regionen och tidszonen) // $SxGeo->getCityFull($ip); (returerar fullständig information om staden och regionen)

Prestandatester

Och till efterrätt, lite jämförande prestandatestning. Motståndarna är GeoLite API och Geobaza API. Alla testdeltagare använder en binär databas i sitt eget format och använder PHP API. Testning sker under Win 7 (proportioner finns bevarade på Linux), PHP 5.2.17.

Resultat efter 10 körningar för varje API i två lägen (normal och cachelagring i minnet) med medelvärdesberäkning och avrundning till tiotal. För varje körning skapas en array med 50 000 slumpmässiga IP-adresser och varje algoritm genomsöks i en slinga.

Förslag och önskemål är välkomna. Vi söker även de som vill hjälpa till med att porta API till andra språk, och skapa moduler för Apache och nginx.

Om du upptäcker ett fel, välj en textbit och tryck på Ctrl + Retur
DELA MED SIG: