De stad bepalen via ip in php. PHP - Ontvang gebruikersgeo-informatie via IP. Een stad bepalen op basis van IP in PHP met behulp van alternatieve bibliotheken

Als u zelf bezoekersstatistieken gaat maken voor uw website, dan wilt u waarschijnlijk weten uit welk land uw bezoekers komen. Je kunt het land van de bezoeker achterhalen aan de hand van zijn IP-adres, en in dit artikel zullen we bekijken hoe dit via PHP gebeurt.

Er zijn twee manieren om het land te achterhalen op IP-adres via PHP. De eerste manier is om een ​​WHOIS-service te gebruiken, er een verzoek naartoe te sturen en er een antwoord van te ontvangen. De tweede optie is om uw eigen tabel in de database te maken, die de correspondentie tussen IP-adressen en landen bevat. De voor- en nadelen van de eerste en tweede methode liggen voor de hand, dus ik zal er niet verder op ingaan. De tweede implementatiemethode is afhankelijk van uw database en van de tabel waarin de correspondentie tussen IP-adressen en landen zich bevindt. Daarom zullen we de eerste methode overwegen, omdat deze universeel is, hoewel je dit script natuurlijk niet op een lokale server kunt testen zonder een internetverbinding:

In het kort het principe: we vinden een dienst, kijken hoe we een verzoek kunnen verzenden (hoe heten de variabelen, welke methode wordt gebruikt om het te verzenden), sturen een verzoek via cURL, ontvangen een antwoord, extraheren de vereiste regel met behulp van reguliere expressies en geef het resultaat weer. Als u dit script uitvoert, ziet u de naam van het land waartoe uw IP-adres behoort. Houd er echter rekening mee dat het niet mogelijk is om voor elk IP-adres het land te achterhalen. Het hangt af van de database die een bepaalde WHOIS-service gebruikt. Ik zal meteen zeggen dat je, om dit script te testen, het naar een externe server moet uploaden, zodat het IP-adres niet wordt vervangen: 127.0.0.1, omdat het niet zal werken, omdat er geen land voor is. Of vervang eenvoudigweg de waarde van de variabele $ip door een ander IP-adres. Zoals je kunt zien, is alles heel eenvoudig, het belangrijkste hier is om duidelijk een van de twee methoden te kiezen. Als u via uw database een land op IP-adres wilt achterhalen, moet u dit eerst vinden. Er zijn er nogal wat, dus zoek ze gewoon op internet. En als u tevreden bent met het gebruik van de WHOIS-service en het opslaan van uw serverbronnen en ruimte in de database, dan kunt u de bovenstaande code gebruiken en door de reguliere expressie te wijzigen, kunt u andere gegevens eruit halen die deze service produceert, bijvoorbeeld: de stad.

Hallo allemaal!

Ik zal dat niet vaak zeggen, maar van tijd tot tijd moeten ontwikkelaars een stad bepalen op basis van IP in een PHP-script.

U hebt bijvoorbeeld besloten om het voor de gebruiker gemakkelijker te maken om contactgegevens in te voeren bij het plaatsen van een bestelling in een online winkel. Of u wilt de taal van de site-interface instellen, afhankelijk van het land waaruit de bezoeker naar uw site is gekomen.

Meestal is het bepalen van een stad op basis van IP in PHP met behulp van GeoIP waarschijnlijk nodig voor ontwikkelaars van verschillende advertentienetwerken om gerichte advertenties aan te bieden aan gebruikers, afhankelijk van hun geografische locatie.

Zelf hoefde ik het land maar één keer per IP te achterhalen in een PHP-script, toen ik besloot widgets van verschillende sociale netwerken naar de site te uploaden voor gebruikers uit verschillende landen. Waarom dit niet nodig was en wat er uiteindelijk gebeurde, zal ik in het volgende artikel meer schrijven.

Laten we in de tussentijd eens kijken hoeveel manieren er zijn om een ​​stad en land te bepalen op basis van IP in PHP en welke opties er zijn voor de implementatie ervan.

PHP GeoIP - standaard functionaliteit van derden

Ik heb de beschrijving van de eerste methode specifiek op deze manier genoemd. Feit is dat het in PHP zelf onmogelijk is om de stad en het land te bepalen op basis van het IP-adres - de taal beschikt hiervoor niet over de nodige hulpmiddelen.
Maar de officiële documentatie bevat een hint over hoe u dit kunt doen.

PHP GeoIP is een bibliotheek van derden die extra moet worden aangesloten, ondanks het feit dat de beschrijving van de functies die daarin zijn opgenomen deel uitmaakt van de officiële PHP-documentatie - http://php.net/manual/ru/ref.geoip .php

In principe zijn de motieven van PHP-ontwikkelaars vrij duidelijk.

Ten eerste vereist de opname van deze module in de taalkit zelf een grote hoeveelheid serverbronnen.

Ten tweede werkt GeoIP PHP op basis van een lijst met IP-adressen die overeenkomen met specifieke landen en steden. Daarom vereist GeoIP PHP constante ondersteuning en uitbreiding/modernisering van de bestaande database, wat een extra hoofdpijn zou zijn voor PHP-ontwikkelaars.

Nou, en ten derde is het bepalen van een stad op basis van IP in PHP een functie die in de praktijk zelden wordt gebruikt.

Als gevolg hiervan is PHP GeoIP vanwege deze factoren een extensie van derden, waarvan de ondersteuning en het creëren van een API voor integratie op bestaande sites wordt uitgevoerd door het bedrijf MaxMind, waarvan een link aanwezig is in de beschrijving van deze bibliotheek.

Ik zal het installatieproces op de server niet beschrijven, omdat... Zelf heb ik dit in de praktijk nog niet gedaan en het internet staat momenteel vol met handleidingen voor het installeren van PHP GeoIP op zowel Linux- als Windows-servers.

Ik kan alleen maar zeggen dat deze methode voor het bepalen van de stad, het land en andere geo-informatie via IP in PHP twee belangrijke nadelen heeft:

  • Toegang tot de database met volledige informatie over IP-adressen verstrekt door MaxMind is betalend. Bovendien is het bedrag vreemd genoeg in dollars :) Er zijn alleen aanzienlijk gereduceerde opties gratis beschikbaar - http://dev.maxmind.com/geoip/geoip2/geolite2/
  • Aangezien PHP GeoIP een extensie van derden is, moet deze afzonderlijk op de server worden geïnstalleerd, wat een moeilijke onderneming kan worden als gedeelde hosting wordt gebruikt. U kunt uiteraard contact opnemen met de technische ondersteuning, maar het is geen feit dat zij u zullen helpen. Toen ik bijvoorbeeld vroeg om Sphinx te installeren, werd ik geweigerd.
  • Een stad bepalen op basis van IP in PHP met behulp van alternatieve bibliotheken

    Een andere manier om een ​​stad te achterhalen via IP in een PHP-script is het gebruik van alternatieve serverbibliotheken en informatiedatabases voor andere IP-adressen dan MaxMind.

    Maar ze hebben dezelfde nadelen als de vorige optie, omdat... zijn slechts concurrenten van MaxMind. Toegang tot databases en de mogelijkheid om hun API te gebruiken worden ook betaald. Gratis kunt u alleen een lijst met landen en steden per IP krijgen, terwijl u met een betaald abonnement een bredere lijst met gegevens kunt krijgen.

    Het enige voordeel ten opzichte van PHP GeoIP is dat deze bibliotheken zijn geïntegreerd in PHP-code, en niet op serverniveau, d.w.z. ze kunnen zelfs worden gebruikt op gedeelde hostings.

    Een voorbeeld van een dergelijke bibliotheek wordt geleverd door de dienst db-ip.com.

    Overigens biedt de service die ik noemde niet alleen de PHP-bibliotheek voor het verkrijgen van geodata van client-IP's, maar ook toegang tot informatiedatabases op basis van adressen. Dus in principe houdt niemand je tegen om ze in PHP GeoIP te gebruiken om de API te gebruiken, maar om informatie uit andere bronnen te halen.

    Nou ja, en zeker niemand houdt je tegen om je eigen parser van databasebestanden met IP-adressen te schrijven om er zelf informatie uit te verkrijgen, zonder toestemming van derden.

    Hoe u een stad op basis van IP kunt bepalen in PHP online

    Welnu, nu ben ik bij de laatste methode gekomen om het land te achterhalen via IP in PHP en andere geo-informatie, die ik zelf in de praktijk heb gebruikt.

    Het bestaat uit het gebruik van API-onlinediensten waarmee u online gegevens per IP-adres kunt ontvangen.

    Ik besloot met deze methode de stad op basis van IP in PHP te bepalen, omdat... het mist het belangrijkste nadeel van de vorige. Het is namelijk het gemakkelijkst te implementeren: u hoeft niets op de server te installeren of te configureren en bovendien hiervoor technische ondersteuning van shared hosting te vragen.

    Om de benodigde informatie via IP te verkrijgen, hoeft u alleen maar een verzoek naar een specifieke URL te sturen en het antwoord te verwerken.

    Wat de gebruikskosten betreft, deze worden voor het grootste deel ook betaald, omdat... werken in de regel op basis van bestaande commerciële IE-databanken. Maar er zijn ook gratis diensten die informatie bieden die misschien net zo compleet is als commerciële, maar die in een onbeperkte hoeveelheid kan worden verkregen.

    Het is waar dat ze heel snel ophouden te bestaan, vreemd genoeg, omdat Het is erg moeilijk om te overleven door dergelijke diensten aan te bieden. Dit bleek uit mijn analyse van gratis online diensten voor het bepalen van steden en landen op basis van IP, die ik voor persoonlijke doeleinden heb uitgevoerd. Ze verschenen op veel sites, maar toen je ze probeerde te gebruiken, was het duidelijk dat ze niet meer bestonden.

    Uiteindelijk heb ik gevonden wat ik nodig had, en dat is wat ik samen met jou wil beslissen - http://www.geoplugin.com/

    Met deze dienst kunt u zowel de stad als andere informatie via IP op de website van de dienst bepalen, en dit vanuit code. Vervolgens zal ik een voorbeeld geven van het bepalen van een land op basis van IP in een PHP-script met behulp van geoplugin.com. code wordt uitgevoerd met behulp van de code die wordt beschreven in het artikel op de link.

    Zoals u kunt zien, is de essentie van de bovenstaande code het bepalen van het IP-adres van de klant, rekening houdend met de mogelijkheid om deze via een proxy te verbinden en een verzoek te verzenden via de GeoPlugin API met verdere decodering en analyse van de resultaten.

    In mijn voorbeeld is, zoals ik al zei, het resultaat van dit script de landcode van de siteclient. Over het algemeen ziet de volledige lijst met geretourneerde parameters er als volgt uit (ik heb bijvoorbeeld besloten om het IP-adres van de Novosibirsk-regio van de Russische Federatie te nemen):

    ("geoplugin_request":195.208.128.3", "geoplugin_status":200, "geoplugin_credit": Sommige van de geretourneerde gegevens bevatten GeoLite-gegevens gemaakt door MaxMind, verkrijgbaar bij http:\/\/www.maxmind.com.", "geoplugin_city": Novosibirsk", "geoplugin_region": Novosibirsk", "geoplugin_areaCode": "0", "geoplugin_dmaCode": "0", "geoplugin_countryCode": "RU", "geoplugin_countryName":Russische Federatie", "geoplugin_continentCode":EU", "geoplugin_latitude":55.09", "geoplugin_longitude":82.6519", "geoplugin_regionCode":53", "geoplugin_regionName" Novosibirsk", "geoplugin_currencyCode":RUB", "geoplugin_currencySymbol"rub", "geoplugin_currencySymbol_UTF8":\u0440\u0443\u0431", "geoplugin_currencyConverter":58.9289 )

    Zoals u kunt zien, maakt deze dienst gebruik van de eerder genoemde MaxMind (parameter geoplugin_credit), maar of de informatie betaald is of niet, is moeilijk te raden. Enerzijds geeft de link naar de bron aan dat er gebruik wordt gemaakt van vrije toegang tot de IP-database, maar anderzijds zien we niet alleen het land en de stad, maar ook veel andere informatie, waaronder de stad, geografische coördinaten, coördinaten (lengtegraad, breedtegraad), huidige valuta en zelfs de wisselkoers.

    Deze dienst kan dus online PHP GeoIP worden genoemd. Het enige verschil met zijn server-tegenhanger is dat het informatie via IP iets langzamer ontvangt vanwege het ontbreken van servercaching. Maar dit betekent niet dat het niet op de GeoPlugin-server zelf staat 😉 Dit nadeel is dus nogal symbolisch.

    In ieder geval verdienen de GeoPlugin-ontwikkelaars applaus, en vooral vanwege het feit dat ze hun site niet eens hebben volgestopt met contextuele advertenties. Die. Hoe ze überhaupt overleven, is onduidelijk. De enige manier om hen te bedanken is door een donatie te doen op uw PayPal-rekening.

    Trouwens, de PHP-code die ik heb opgegeven voor het bepalen van een stad op basis van IP is universeel. Hiermee kunt u geodata verkrijgen via andere diensten. Het enige dat u daarin hoeft te wijzigen, is de service-API-URL en de naam van de benodigde parameters die u moet ontvangen.

    Dat is alles wat ik heb. Schrijf uw feedback over het artikel in de reacties hieronder en vergeet niet om het bericht met uw vrienden op sociale netwerken te delen.

    P.S. : heeft u een website nodig of wilt u wijzigingen aanbrengen in een bestaande, maar heeft u daar geen tijd of zin voor, dan kan ik u van dienst zijn.

    Meer dan 5 jaar ervaring in het ontwikkelen van professionele websites. Werken met PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, React, Angular en andere webontwikkelingstechnologieën.

    Ervaring met het ontwikkelen van projecten op verschillende niveaus: landingspagina's, bedrijfswebsites, online winkels, CRM, portals. Inclusief ondersteuning en ontwikkeling van HighLoad projecten. Stuur uw sollicitaties per e-mail [e-mailadres beveiligd].

    Dit artikel vervolgt het onderwerp over IP en gaat in op manieren om het land, de stad en andere geo-informatie over een gebruiker te bepalen aan de hand van zijn IP.

    GeoIP als PHP-extensie

    Waarschijnlijk de meest gebruikte bibliotheek voor het bepalen van IP (office doc op php.net). Dat is geen wonder, want een binaire database + gecompileerde PHP-extensie werkt sneller dan alle andere methoden.

    Installatie op Ubuntu-server:

    Sudo apt-get installeer php5-geoip

    Download na de installatie de nieuwste updates voor de IP-adresdatabase:

    Na deze stappen moet u PHP opnieuw opstarten. Dit is nodig zodat de PHP-interpreter de nieuw geïnstalleerde extensie (php5-geoip) en nieuwe IP-adresdatabases kan laden.

    Het is ook noodzakelijk om de IP-adresdatabase periodiek bij te werken:

    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/

    Na de update moet je ook PHP opnieuw opstarten om de bijgewerkte IP-adresdatabase toe te passen:

    Sudo service php5-fpm restart # als u NGINX # gebruikt of sudo service apache2 restart # als u Apache gebruikt

    Zodra GeoIP is geïnstalleerd, kan het als volgt in code worden gebruikt: