Finestre.  Virus.  I Quaderni.  Internet.  ufficio.  Utilità.  Autisti

Continuando l'argomento sull'IP, questo articolo prenderà in considerazione i modi per determinare il paese, la città e altri geo-ino sull'utente in base al suo IP.

GeoIP come estensione PHP

Probabilmente la libreria più comunemente usata per determinare l'IP (off.doc su php.net). Non è sorprendente, perché il database binario + compilato estensione PHP funzionano più velocemente di tutti gli altri metodi.

Installazione su server Ubuntu:

sudo apt-get install php5-geoip

Scarica dopo l'installazione Ultimi aggiornamenti indirizzi IP di base:

Dopo questi passaggi, è necessario riavviare PHP. Ciò è necessario affinché l'interprete PHP carichi l'estensione appena installata (php5-geoip) e le nuove basi di indirizzi IP.

È inoltre necessario aggiornare periodicamente il database degli indirizzi IP:

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/

Dopo l'aggiornamento, devi anche ricaricare PHP per applicare il database degli indirizzi IP aggiornato:

sudo service php5-fpm restart # se stai usando NGINX # o sudo service apache2 restart # se stai usando Apache

Una volta impostato GeoIP, può essere utilizzato nel codice in questo modo:

GeoIP come pacchetto compositore

Questo metodo è quasi identico a GeoIP come estensione PHP, con un'eccezione: non è necessario installare estensioni aggiuntive sul server.

Questo è utile se non si dispone dell'accesso root al server e non è possibile installare estensioni PHP.

Lo svantaggio di questo metodo è che è leggermente più lento dell'estensione PHP compilata.

Prima di tutto, devi scaricare il database degli indirizzi IP in un formato speciale (.mmdb) da off. site e posizionalo in qualsiasi cartella sul server a tua disposizione:

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/

Composer richiede geoip2/geoip2:~2.0

Dopo questi due semplici passaggi, puoi iniziare a usarlo nei tuoi script PHP, ad esempio:

nazione($_SERVER["REMOTE_ADDR"]); var_dump($geo->country->isoCode); var_dump($geo->paese->nome);

SypexGeo

Si presenta anche come una classe PHP e una libreria binaria. Purtroppo spento. non ha un pacchetto di composizione. Ma puoi usare e non disattivare: https://packagist.org/packages/igi/sypexgeo .

Questo pacchetto composer è utile anche perché consente di aggiornare il database degli indirizzi IP quando si esegue il comando "composer install".

Per installare questo pacchetto composer e impostare l'aggiornamento automatico del database degli indirizzi IP, è necessario scrivere le seguenti impostazioni nel file 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" ) )

Prestare attenzione alle seguenti impostazioni:

  • la connessione al pacchetto deve essere inserita nella sezione require-dev
  • quando si collega un pacchetto, è necessario specificare il livello di stabilità @dev
  • nella sezione sypexgeo_remote, invece di SxGeoCountry.zip, puoi specificare SxGeoCity_utf8.zip
  • nel parametro sypexgeo_local è necessario specificare il percorso della cartella

Installazione del compositore

Dopo aver installato la libreria stessa, anche il database degli indirizzi IP verrà aggiornato da spento. luogo.

Un esempio di utilizzo nel codice PHP:

getPaese("89.163.220.14"));

Oltre a utilizzare il pacchetto composer, puoi anche utilizzare l'API REST di questo progetto, ad esempio: http://api.sypexgeo.net/json/89.163.220.14 Leggi i servizi online per determinare le informazioni geografiche di seguito in questo articolo.

POSIZIONE IP2

Un'altra libreria di compositori dall'estero.

Installazione:

Composer richiede ip2location/ip2location-php

Durante l'installazione di questo pacchetto composer, e anche durante l'aggiornamento, verrà aggiornato anche il database degli indirizzi IP, che si trova al seguente percorso:

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

Utilizzo:

lookup("89.163.220.14", \IP2Location\Database::ALL); eco "

"; echo "Numero IP: " . $records["Numero ip"] . "\n"; echo "Versione IP: " . $records["Versione ip"] . "\n"; echo "Indirizzo IP: " . $ records["indirizzoip"] . "\n"; echo "Prefisso Paese: " . $records["CodicePaese"] . "\n"; echo "Nome Paese: " . $records["CodicePaese"] . "\n "; eco "
";

TabGeo

Apparso relativamente di recente, la prima versione del pacchetto del compositore è stata pubblicata il 27 settembre 2015.

Si posiziona come il più veloce rispetto a concorrenti come: GeoIP e Sypex Geo. Ma la velocità è raggiunta grazie alle dimensioni ridotte della base, per cui questa libreria determina solo il prefisso internazionale.

È distribuito come un pacchetto composer + un database binario nel proprio formato.

Per installare questa libreria, devi solo includere il pacchetto composer:

Il compositore richiede tabgeo/paese

Questo installerà sia la libreria PHP che il database stesso:

Esempio di utilizzo nello script PHP:

Vale la pena notare che TabGeo ti consente solo di ottenere un codice paese a due cifre nel formato ISO 3166-1 alpha-2. Se hai bisogno di qualcosa in più, ad esempio per definire una regione, una città, un fuso orario, ecc., allora devi utilizzare lo stesso GeoIP, ad esempio, perché ti consente di definire tutto.

Servizi online per il targeting geografico

In alternativa, puoi utilizzare speciali servizi online. Il principio del loro lavoro è semplice: passiamo GET come parametro IP e in risposta riceviamo informazioni geografiche in formato JSON o XML.

Il vantaggio di questo metodo è che può essere utilizzato non solo sul lato PHP, ma anche sul lato JavaScript, ad esempio.

Ma ci sono anche svantaggi significativi:

  • non funziona velocemente come la libreria PHP;
  • non puoi aggiornare il database degli indirizzi IP;
  • il tuo server può essere bloccato per chiamate frequenti.

Ecco alcuni di questi servizi online:

Conclusione

Quasi tutte le librerie di cui sopra forniscono due tipi di database di indirizzi IP:

  • leggero, solo con un elenco di paesi, di norma, il nome contiene Paese;
  • più completo, che, oltre ai paesi, contiene anche informazioni sulle grandi città, di norma il nome contiene Città e pesa di più;

Un database più completo di indirizzi IP con città ovviamente funzionerà un po' più lentamente a causa del suo volume maggiore.

È più corretto utilizzare GeoIP come estensione PHP. Perché funzionerà sempre e rapidamente. Inoltre, puoi sempre aggiornare il database degli indirizzi IP.

Se non è possibile installare GeoIP come estensione PHP, è possibile utilizzare uno dei pacchetti composer: GeoIP, Sypex Geo, IP2LOCATION o TabGeo.

Se l'uso del pacchetto del compositore per qualche motivo non è possibile, resta da utilizzare i servizi online. Ma devi assolutamente memorizzare nella cache le richieste per questi servizi nel tuo database. La memorizzazione nella cache è necessaria per non inviare più volte la stessa richiesta. È sufficiente ottenere le informazioni geografiche per l'IP di interesse una volta tramite il servizio online, quindi salvarle nel database e quindi prelevarle dal database. Pertanto, ridurrai il numero di richieste per il servizio online e ridurrai la probabilità che il servizio online ti blocchi per più richieste.

Vale la pena notare che quasi tutte le librerie di cui sopra hanno versioni gratuite ea pagamento. Nelle versioni a pagamento avrai accesso a più dati geografici rispetto a quelle gratuite.

Ciao a tutti!

Non lo dirò spesso, ma di tanto in tanto gli sviluppatori devono determinare la città in base all'IP in uno script PHP.

Ad esempio, hai deciso di rendere più semplice per l'utente l'inserimento delle informazioni di contatto quando effettua un ordine in un negozio online. Oppure vuoi impostare la lingua dell'interfaccia del sito in base al paese da cui il visitatore è arrivato al tuo sito.

Ebbene, molto spesso, determinare la città per IP in PHP utilizzando GeoIP è probabilmente necessario per gli sviluppatori di varie reti pubblicitarie al fine di offrire agli utenti pubblicità mirata a seconda della posizione geografica.

Mi ci è voluta solo una volta per scoprire il paese tramite IP in uno script PHP, quando ho deciso di caricare sul sito widget di vari social network per utenti di diversi paesi. Scriverò in modo più dettagliato sul motivo per cui ciò non era necessario e su cosa è successo alla fine nel prossimo articolo.

Nel frattempo, parliamo di quanti modi esistono per determinare la città e il paese in base all'IP in PHP e quali opzioni esistono per la loro implementazione.

PHP GeoIP - funzionalità standard di terze parti

Ho intitolato specificamente la descrizione del primo metodo. Il fatto è che nello stesso PHP è impossibile determinare la città e il paese in base all'indirizzo IP: la lingua non dispone degli strumenti necessari per questo.
Ma nella documentazione ufficiale c'è un suggerimento su come farlo.

PHP GeoIP è una libreria di terze parti che deve essere inclusa in aggiunta, nonostante il fatto che la descrizione delle funzioni in essa incluse faccia parte della documentazione ufficiale di PHP - http://php.net/manual/en/ref.geoip .php

In linea di principio, le motivazioni degli sviluppatori PHP sono abbastanza comprensibili.

In primo luogo, l'inclusione di questo modulo nel pacchetto linguistico stesso richiede una grande quantità di risorse del server.

In secondo luogo, GeoIP PHP funziona sulla base di un elenco di indirizzi IP corrispondenti a determinati paesi e città. Pertanto, GeoIP PHP richiede un supporto costante e l'espansione / modernizzazione della base esistente, il che sarebbe un inutile grattacapo per gli sviluppatori PHP.

Bene, e in terzo luogo, determinare la città in base all'IP in PHP è una funzionalità che viene utilizzata raramente nella pratica.

Di conseguenza, a causa di questi fattori, PHP GeoIP è un'estensione di terze parti, il cui supporto e la creazione di un'API per l'integrazione su siti esistenti è gestito da MaxMind, un collegamento a cui è presente nella descrizione di questa libreria .

Non descriverò il processo di installazione sul server, perché Io stesso non l'ho fatto in pratica e su Internet all'indirizzo questo momento Pieno di manuali per l'installazione di PHP GeoIP su server Linux e Windows.

Posso solo dire che questo metodo per determinare la città, il paese e altre informazioni geografiche tramite IP in PHP presenta due svantaggi significativi:

  1. L'accesso al database di informazioni complete sugli indirizzi IP fornito da MaxMind è a pagamento. Inoltre, l'importo è in dollari, stranamente 🙂 Sono disponibili gratuitamente solo opzioni significativamente ridotte - http://dev.maxmind.com/geoip/geoip2/geolite2/
  2. Dato che PHP GeoIP è un'estensione di terze parti, dovrà essere installato separatamente sul server, il che, se si utilizza l'hosting condiviso, può diventare un'impresa difficile. Certo, puoi contattare il supporto tecnico, ma non il fatto che ti aiuteranno. Ad esempio, quando mi è stato chiesto di installare Sphinx, hanno rifiutato.

Determinazione della città per IP in PHP utilizzando librerie alternative

Un altro modo per scoprire la città tramite IP in uno script PHP è utilizzare librerie di server alternative e database di informazioni per indirizzi IP diversi da MaxMind.

Ma hanno gli stessi svantaggi della versione precedente, perché. sono solo concorrenti di MaxMind. Viene pagato anche l'accesso ai database e la possibilità di utilizzare le loro API. Puoi ottenere gratuitamente solo un elenco di paesi e città tramite IP, mentre con una tariffa a pagamento puoi ottenere un elenco di dati più ampio.

L'unico vantaggio rispetto a PHP GeoIP è che i dati della libreria sono integrati nel codice PHP e non a livello di server, ad es. possono essere utilizzati anche su hosting condiviso.

Un esempio di tale libreria è fornito dal servizio db-ip.com.

A proposito, il servizio che ho citato fornisce non solo la propria libreria PHP per ottenere dati geografici dai client IP, ma anche l'accesso ai database di informazioni tramite indirizzi. Quindi, in linea di principio, nessuno ti disturba a usarli in PHP GeoIP per utilizzare la sua API, ma prendi informazioni da altre fonti.

Bene, e certamente nessuno ti disturba a scrivere il tuo parser per i file del database degli indirizzi IP per ottenere informazioni da loro tu stesso, senza autorizzazioni di terze parti.

Come determinare la città per IP in PHP online

Bene, qui arrivo al metodo finale su come scoprire il paese tramite IP in PHP e altre informazioni geografiche, che ho usato io stesso in pratica.

Consiste nell'utilizzare l'API dei servizi online che consentono di ricevere dati tramite indirizzo IP online.

Ho deciso di determinare la città per IP in PHP in questo modo, perché è privo del principale inconveniente dei precedenti. Vale a dire, è il più semplice da implementare: non è necessario installare e configurare nulla sul server e, inoltre, chiedere al supporto tecnico dell'hosting condiviso a riguardo.

Per ottenere le informazioni necessarie tramite IP, è sufficiente inviare una richiesta a un URL specifico ed elaborare la risposta.

Per quanto riguarda il costo del loro utilizzo, per la maggior parte vengono anche pagati, perché. lavorare, di norma, sulla base di basi IP commerciali esistenti. Ma ci sono anche servizi gratuiti che forniscono, forse, informazioni complete come quelle commerciali, ma possono essere ricevute in quantità illimitata.

È vero, cessano molto rapidamente di esistere, stranamente, perché. è molto difficile sopravvivere fornendo tali servizi. Ciò è stato dimostrato dalla mia analisi dei servizi online gratuiti per determinare città e paesi in base all'IP, che ho condotto per scopi personali. Lampeggiavano su molti siti, ma quando si cercava di usarli era chiaro che avevano cessato di esistere.

Di conseguenza, ho trovato ciò di cui avevo bisogno, ciò che voglio decidere con te - http://www.geoplugin.com/

Questo servizio consente sia di determinare la città e altre informazioni tramite IP sul sito Web del servizio, sia di farlo dal codice. Successivamente, fornirò un esempio di determinazione del paese in base all'IP in uno script PHP utilizzando geoplugin.com. codice viene eseguito utilizzando il codice descritto nell'articolo per riferimento.

"", "città"=>""); if(filter_var($client, FILTER_VALIDATE_IP)) $ip = $client; elseif(filter_var($avanti, FILTER_VALIDATE_IP)) $ip = $avanti; altrimenti $ip = $remoto; $ip_data = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip)); if($ip_data && $ip_data->geoplugin_countryName != null) ( $risultato = $ip_data->geoplugin_countryCode; ) echo $risultato; ?>

Come puoi vedere, l'essenza del codice sopra è determinare l'indirizzo IP del client, tenendo conto della possibilità di connettersi tramite un proxy e inviare una richiesta tramite l'API GeoPlugin con ulteriore decodifica e analisi dei risultati.

Nel mio esempio, come ho già detto, il risultato del lavoro questa sceneggiatura sarà il codice paese del client del sito. In generale, l'elenco completo dei parametri restituiti è simile al seguente (ad esempio, ho deciso di prendere l'IP della regione di Novosibirsk nella Federazione Russa):

( "geoplugin_request":"195.208.128.3", "geoplugin_status":200, "geoplugin_credit":"Alcuni dei dati restituiti includono dati GeoLite creati da MaxMind, disponibili da http:\/\/www.maxmind.com<\/a>.", "geoplugin_city":"Novosibirsk", "geoplugin_region":"Novosibirsk", "geoplugin_areaCode":"0", "geoplugin_dmaCode":"0", "geoplugin_countryCode":"RU", "geoplugin_countryName":"Federazione Russa ", "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 )

Come puoi vedere, questo servizio utilizza il già citato MaxMind (parametro geoplugin_credit), ma è difficile indovinare se si tratta di informazioni a pagamento o meno. Da un lato, il collegamento alla fonte indica che viene utilizzato l'accesso gratuito al database IP, ma, dall'altro, vediamo non solo il paese e la città, ma anche molte informazioni di ogni tipo, inclusa la città , le coordinate geografiche (langitudine, latitudine), la valuta corrente e persino il suo tasso di cambio.

Quindi questo servizio può essere chiamato PHP GeoIP online. La sua unica differenza rispetto alla controparte del server è che riceve le informazioni su IP un po' più lentamente a causa della mancanza di cache del server. Ma questo non significa che non sia sul server GeoPlugin stesso 😉 Quindi questo inconveniente è piuttosto simbolico.

In ogni caso, gli sviluppatori di GeoPlugin meritano un plauso, e, in particolare, anche per il fatto di non aver nemmeno ingombrato il proprio sito di pubblicità contestuale. Quelli. Non è chiaro come sopravvivano. L'unico modo per dire loro "grazie" è fare una donazione su un conto PayPal.

A proposito, il codice PHP che ho fornito per determinare la città tramite IP è universale. Puoi usarlo per ottenere dati geografici con l'aiuto di altri servizi. L'unica cosa che dovrai modificare è l'URL dell'API del servizio e il nome dei parametri richiesti che dovrai ottenere.

Questo è tutto per me. Scrivi il tuo feedback sull'articolo nei commenti qui sotto e non dimenticare di condividere il post con i tuoi amici sui social network.

P.S.: se hai bisogno di un sito web o devi apportare modifiche a uno esistente, ma non c'è tempo e voglia per questo, posso offrire i miei servizi.

Oltre 5 anni di esperienza sviluppo di siti web professionali. Lavorare con PHP, opencart, wordpress, Laravel, Yi, MySQL, PostgreSQL, javascript, Reagire, Angolare e altre tecnologie di sviluppo web.

Esperienza nello sviluppo di progetti a vari livelli: pagine di destinazione, siti web aziendali, Acquisti online, CRM, portali. Compreso il supporto e lo sviluppo Progetti ad alto carico. Invia le tue candidature via e-mail [e-mail protetta].

In cui è stata menzionata la mia "bicicletta", caratterizzata da un'elevata velocità. Una delle domande popolari era la possibilità di determinare la città per IP.

E ora, pochi mesi dopo, il progetto iniziato come "per divertimento" è diventato un progetto indipendente.
È stato aperto un sito separato dedicato al progetto Sypex Geo, dove è possibile scaricare versioni fresche API e database, oltre a leggere la documentazione.

Per coloro che desiderano testare rapidamente la correttezza della determinazione della città tramite IP, ecco un collegamento alla pagina demo. E sotto l'habrakat, descriverò alcuni dettagli tecnici e fornirò i risultati di un piccolo test.

Formato SypexGeo 2.1

Dalla pubblicazione dell'ultimo articolo, il formato Sypex Geo (abbreviato in SxGeo) è stato ottimizzato ed è stata aggiunta al database la possibilità di includere due libri di riferimento - città e regioni.

Durante la creazione di un nuovo formato, sono state impostate le seguenti priorità:

  • ad alta velocità
  • basso consumo di risorse
  • apertura (le specifiche del formato del file binario del database e l'API sono aperte)
  • universalità (la capacità di creare database con qualsiasi set di dati)
Il formato consente di memorizzare i dati in diverse codifiche. Dopo aver lasciato la beta, verranno pubblicati gli script per convertire il database da MySQL in un file DB binario.

Il database memorizza le seguenti informazioni:

  • ID paese
  • Codice paese ISO 3166-1 (due caratteri)
  • Codice regionale FIPS 10-4 (due caratteri)
  • Nome della regione (facoltativo)
  • Città
  • Latitudine
  • Longitudine
  • fuso orario (facoltativo)
Questo elenco può essere modificato e/o ampliato secondo necessità. Ulteriori informazioni sul formato SxGeo 2.1 sono disponibili sul sito web.

Banca dati propria

Dopo una conoscenza molto stretta con il popolare sistema di geolocalizzazione GeoLite City di MaxMind, è stato deciso di creare il nostro database. Il problema è che GeoLite City ha molte imprecisioni, immondizia, città duplicate, eccessiva suddivisione degli intervalli, nonché problemi con le città dell'ex URSS (ad esempio, invece delle città, i nomi delle società o i nomi dei responsabili da Whois sono presi).

Il database è attualmente basato su GeoLite City, ma contiene già una copertura completamente ridisegnata di Russia, Ucraina e Bielorussia. A poco a poco, verranno specificati altri paesi, principalmente la CSI e l'Europa. Il database Sypex Geo City contiene i nomi delle città e delle regioni in russo in UTF-8 (ci sono ancora nomi non tradotti), nonché il fuso orario.

Inoltre, sul sito sono disponibili altri database convertiti nel formato SxGeo 2.1.

Utilizzo

L'uso dell'API Sypex Geo è il più semplice possibile.
1. Copiare SxGeo.php e SxGeoCity.dat (o altri database) sul server 2. Includere il file SxGeo.php nello script aggiungendo la riga include("SxGeo.php"); 3. Crea un oggetto SxGeo //$SxGeo = new SxGeo(); // Modalità predefinita, file database SxGeo.dat $SxGeo = new SxGeo("SxGeoCity.dat", SXGEO_BATCH | SXGEO_MEMORY); // Modalità più veloce 4. Determina la città (SxGeo City, GeoLite City, IpGeoBase) $SxGeo->get($ip); (restituisce informazioni sulla città, senza il nome della regione e del fuso orario) // $SxGeo->getCityFull($ip); (restituisce le informazioni complete sulla città e la regione)

Test delle prestazioni

E per dessert, un piccolo test comparativo delle prestazioni. Gli avversari sono GeoLite API e Geobaza API. Tutti i partecipanti al test utilizzano un database binario del proprio formato e utilizzano l'API PHP. Il test si svolge sotto Win 7 (le proporzioni sono mantenute su Linux), PHP 5.2.17.

Risultati dopo 10 esecuzioni per ogni API in due modalità (normale e memorizzazione nella cache in memoria) di calcolo della media e arrotondamento alle decine. Per ogni esecuzione, viene creato un array di 50.000 indirizzi IP casuali e ogni algoritmo viene cercato in un ciclo.

Suggerimenti e desideri sono i benvenuti. Stiamo anche cercando coloro che vogliono aiutare con il porting dell'API in altri linguaggi e la creazione di moduli per Apache e nginx.

Se noti un errore, seleziona una parte di testo e premi Ctrl + Invio
CONDIVIDERE: