PHP ile GeoIp kullanarak ziyaretçinin adres (lokasyon) bilgilerini bulma

Sitenizi ziyaret eden kullanıcının ip bilgisi aracılığıyla hangi ülkeden, bölgeden ve şehirden bağlandığını öğrenmek mümkün. Tabiki bunun için bir veritabanına ihtiyacımız var. Bu veritabanını GeoIp firmasından sağlayacağız.

GeoIp (GeoIp ile ziyaretçinin adres (lokasyon) bilgilerini bulma) firması veritabanını ücretli ve ücretsiz olmak üzere ikiye ayırmış. Ücretsiz olan veritabanın ücretli olan sürümünden tek farkı daha sık aralıklarla yenilenmesi ve doğruluk oranının ortalama yaklaşık yüzde beş daha çok olması. Bu küçük farkı önemseyenler ücretli veritabanını satın alabilirler.
GeoIp sadece PHP için değil farklı web programlama dilleri için de API geliştidiğini hatırlatalım.

GeoIp kullanımını ve kurulumunu anlatmadan önce Apache web sunucunuzu ve PHP 'yi sorunsuz yüklediğinizi varsayıyorum.

GeoIp'yi PHP ile kullanırken iki şık arasında seçim yapmanız gerek. Çünkü GeoIp'nin PHP ile kullanımı tenik açıdan iki şekilde yapılıyor:

1- PHP modül olarak yükleme. (kurulum yapmadan)

Avantajları:
  • Kurulum gerekmiyor sadece gerekli dosyaları include etmek yeterli.
  • Kullanımı daha rahat


Dezavantajları:
  • Ziyaretci sayısı çok fazla olan siteler için uygun değil.
  • Performansı düşük.


2- Apache modüle ya da PHP extension olarak

Avantajları:
  • Ziyatçi sayısı çok fazla olan siteler için daha uygun
  • Performansı daha yüksek


Dezavantajları:
  • Kurulum gerekiyor.
  • Windows ortamynda çalışanlar için versiyon sıkıntısı yaratabilir.


Performans karşılaştırmasını detaylı bir şekilde incelemek isteyenler buradan (php-geoip adres bulma istatistik) bakabilirler.

PHP ve geoip entegrasyonu 3 farklı yoldan yapabiliriz. Benim sizlere detaylı olarak anlatacağım ve daha kolay olan 3. yol olacak. Fakat 1. ve 2. yolu da kısaca anlatıyorum:

1) PHP'yi Linux ortamında kullananlar ve extention olarak kurmak isteyenler için (GeoIp ile ziyaretçinin adres (lokasyon) bilgilerini bulma):

Geoip'nin PHP için geliştirilen extension http://pecl.php.net/package/geoip adresinden indirip buradan talimatlara uyarak kurulumunu yaptıktan sonra geoip.so adynda dosyayı oluşturmanız gerek Bu dosyayı extension olarak php.ini'de tanımlayıp web sunucunuzu restart ettikten sonra doğru kurulum yaptıysanınyz phpinfo() fonksiyonunu kullanarak geoip başlıklı extention 'ı göreceksiniz.

2) PHP'yi Windows ortamında kullananlar ve extention olarak kurmak isteyenler için (GeoIp ile ziyaretçinin adres (lokasyon) bilgilerini bulma):

Hazır şekilde C derleyiciler tarafından compile edilmiş php_geoip.dll dosyasını indirebilirsiniz. php_geoip.dll dosyasy bizim geoip extension'ımız. Fakat kullandığınız yaratılmış php_geoip.dll dosyası kullandığınız PHP versiyonunu ile uygun olması gerek. PHP ver. 5.2.1 için buradan dosyayı indirip içindeki talimatları okuyup kurulumu 2 adımda kolayca yapabilirsiniz. Fakat versiyon uyumununda sıkıntısı yaşayabilirsiniz. Zamanla yeni versiyonları çıkacaktır elbette. Derleme işlemini kendiniz de yapabilirsiniz.

3) PHP'yi Windows ya da Linux ortamında kullananlar ve direk hazır .php ve .ini dosyalarını kullanarak php modül şeklinde kullanmak isteyenler için (GeoIp ile ziyaretçinin adres (lokasyon) bilgilerini bulma) :

En hızlı ve en kolay kullanım şeklidir.Burada kurulumunu anlatacağım ücretsiz versiyonu olacağı için buradan ülke ve bölge bilgilerini içeren veritabanını buradan (GeoIP.dat), detaylı şehir bilgilerini içeren veritabanını ise buradan (GeoLiteCity) indirebilirsiniz. Ayrıca buradan ISP bilgilerini içeren veritabanını da buradan (GeoIPISP.dat) indirebelirsiniz.
Veritabanları .dat formatında kaydedilmiş. Bu veritabanlarını kullanmak için PHP geliştircileri için yazılmış bir kaç adet dosyayı yazacağımız index.php içerisinde include metoduyla php script'imize dahil edeceğiz. O dosyaların tümünu buradan bulabilirsiniz. Benim size anlacağım örnekte geoipregionvars.php, geoip.inc ve geoipcity.inc dosyalarını kullacağız. Bu dosyaları indirip web sunucunuzun "root" klasörüne ekleyin. İndirdiğiniz veritabanlarını da yine web sunucunuzun "root" klasöründe "data" adında klasör oluşturup içine ekleyin.
http://geolite.maxmind.com/download/geoip/api/php/ adresinde bulunan sample* başlıklı dosyaları inceleyerek istediğimiz bir uygulama geliştirebiliriz.
Uygulamamızın ismi index.php olsun. Bir tane text alanı içeren form koyalım. Bu text kutusuna istediğimiz bir ip adresini yazıp lokasyon ve ISP bilgilerini gösterelim. Daha önce söylediğim gibi geoipregionvars.php, geoip.inc ve geoipcity.inc dosyalarını geoip metodlarını kullabilmemiz için index.php dosyamıza dahil edeceğiz.

index.php dosyasının tamamı (GeoIp ile ziyaretçinin adres (lokasyon) bilgilerini bulma) :

 
   
<html> 
	<head> 
	</head>

	<body>            
		<form method="post" action= "   < ?php $_SERVER[PHP_SELF]   ?>    " >
			< label for="ip" >IP'yi girin ve enter'a basın: </label>
			< input type="text" id="ip" name="ip">
		 </form>
	 </body>
 </html>

 <?php
 //(GeoIp ile ziyaretçinin adres (lokasyon) bilgilerini bulma)
//gerekli dosyaları uygulamamıza dahil ediyoruz.
require_once("geoip.inc");
require_once("geoipregionvars.php");
require_once("geoipcity.inc");


//if kontrolü ile "ip" isimli text alanınına değer verilip verilmediğini 
//ve ip adresinin doğru girilip girilmediğini RegularExpressin ile kontrol ediyoruz.
if ( isset( $_POST[ip] )  &&  preg_match("/\b(?:\d{1,3}\.){3}\d{1,3}\b/", $_POST[ip] ) )
 {
	//ip numarasını al
	$ip=$_POST[ip];
	//ülke ve bölge bilgisini içeren veri dosyasını tanımlı metot ile açıyoruz
	$gicountry = geoip_open("data/GeoIP.dat",GEOIP_STANDARD);

	//girilen ip'ye göre bulunan ülke kodunu,ülke ismini ve ziyaretçi adresini ekrana bastırıyoruz.
	if (geoip_country_code_by_addr($gicountry, $ip) )
	{
		echo geoip_country_code_by_addr($gicountry, $ip) . "\t" .
         geoip_country_name_by_addr($gicountry, $ip) . "\n";
		//detaylı şehir bilgilerini içeren dosyayı açıyoruz.
		$gicity = geoip_open("data/GeoIPCity.dat",GEOIP_STANDARD);
		//ip'nin şehir bilgilerini içeren diziyi $record değişkenine atıyoruz
		$record = geoip_record_by_addr($gicity,$ip);
		//şehir bilgilerini içeren $record dizisinin tüm içeriğini ekrana bastırıyoruz. 
		echo "<pre>";
		print_r($record); 
		echo "</pre>";
	
		//ip'ye kayıtlı ISP (internet servise provider) bilgisini içeren veri dosyasını açıyoruz.
		$giisp = geoip_open("data/GeoIPISP.dat",GEOIP_STANDARD);
		//ISP bilgilarini alıyoruz.
		if ($isp = geoip_org_by_addr($giisp,$ip))
			//ISP bilgilerini bulursa ekrana bastırıyoruz.
			echo $ip."  has isp " . $isp . "\n";
		else
			echo "no isp found for ip: ".$ip."\n";
	//açılan veritabanlarını kapatıyoruz
	geoip_close($gicity);
	geoip_close($giisp);
	
	}
	else 
		echo "no location data found for ip: ".$ip;
	
	//açılan veritabanlarını kapatıyoruz
	geoip_close($gicountry);
}

	//$_SERVER['REMOTE_ADDR'] bize kullanıcının adresini döndürür
	 echo "<br><br>Sizin IP adresiniz: ".$_SERVER['REMOTE_ADDR']; 
?>   
Yukarıdaki örneği yazarken sample* başlıklı örnek dosyalardan yararlandım ve bir kısmını burada anlatmaya çalıştım. Siz de bu örneklere bakarak kendi uygulamanızı geliştirebilirsiniz. Mesela gelen kullanıcın lokasyon bilgilerini bulduğu taktirde yaratacağınız atıyorum Mysql veritabanına ziyeretçinin bilgilerini kaydedebilirsiniz.

Uygulamanın çalışır halini buradan test edebilirsiniz.

Uygulamamızda ip'yi biz giriyoruz fakat ip girmeden direk ziyaretçinin bilgilerini alabiliriz. Localhost olarak çalışan bir uygulamada ip 127.0.0.1 gözüktüğü için bu mümkün olmayacaktır fakat gerçek uygulamada bu daha mantıklı oluyor tabii. Bununla ilgili örneği ve yaptığımız uygulamayı içeren dosyayı GeoIp ile ziyaretçinin adres (lokasyon) bilgilerini bulma script dosyaları indirip inceleyebilir ve GeoIp ile ziyaretçinin adres (lokasyon) bilgilerini bulma örneği da çalışır halde göz atabilirsiniz.

Bunun dışında GeoIp ile yine veritabanı aracılığıyla kullanıcının internet hızını (dsl, dial-up ... ), DNS'a ait bilgileri ve IP'ye kayıtlı organizasyon isim bilgilerini de alabilirsiniz.
yazan Zülküf Küçüközer tarih   31st July 2009
primary key words  Php | Geoip | Ziyaretçi bilgi | Ip okunma  17547
secondary key words  Apache | Lokasyon
writing serif writing 15th July 2013
Çok tesekkür ederim :)