HELLO, I’M SERHAT AND THIS IS MY FANCY TITLE.

IP adreslerini MySQL'de kaydetmek

Öncelikle şuradaki güzel yazıyı okumanızı tavsiye ederim. Ciddi bir benchmark testi uygulanmış.

MySQL kendi içerisinde IP adresi barındırmak için kullanabileceğimiz iki güzel fonksiyonla gelir. Bunlar INET_ATON() ve INET_NTOA() fonksiyonlarıdır. INET_ATON() fonksiyonu string olan IP adresini, 32bitlik UNSIGNED INTEGER biçimine çevirir. INET_NTOA() ise bu işlemin tem tersini yapar.

Hemen test edelim:

mysql> SELECT INET_ATON("88.254.195.158");
+-----------------------------+
| INET_ATON("88.254.195.158") |
+-----------------------------+
|                  1493091230 |
+-----------------------------+
1 row in set (0.02 sec)
mysql> SELECT INET_NTOA("1493091230");
+-------------------------+
| INET_NTOA("1493091230") |
+-------------------------+
| 88.254.195.158          |
+-------------------------+
1 row in set (0.05 sec)

3 kısımdan oluşan, günlük olarak kullandığımız IP adresleri aslında bu işleme tabi tutulmuş adreslerdir. Yani normalde "88.254.195.158" olarak andığımız bir IP adresinin bilgisayar dilinde ki ifadesi "1493091230"dır.

varchar(15) olarak bu barındırma işlemini yaptığımızda, 4 byte'lık INT_UNSIGNED türüne göre her adres için ciddi anlamda kardayız. Yazı başında paylaştığım bağlantıya göre performanstaki fark %9 ila %12 arasında.

Peki veritabanında bu şekilde barınan 4 BYTE'lık veriyi PHP ile çağırmak istesem ve yine biz normal insanların okuyabileceği formata çevirmek istesem ne yaparım? Çok kolay:

echo long2ip("1493091230");

veya işlemi tam tersten uygulamak için:

echo ip2long("88.254.195.158");

Test ettiğinizde MySQL fonksiyonları ile bu fonksiyonların aynı sonuçları verdiğini göreceksiniz. var_dump() fonksiyonu da ekleyebilirsiniz - tür ve uzunluk bilgisini de basarsınız böylece;

echo var_dump(ip2long("88.254.195.158"));
echo var_dump(long2ip("1493091230"));
## string '88.254.195.158' (length=14)

Eğer IP adresi geçerli bir adres değil ise ip2long() fonksiyonu "NULL" döndürecektir. IP adreslerinin geçerliliğini sınamak için kolay bir yol olabilir. Ben her detayı öğrenmek istiyorum diyorsanız bu yazıyı da okuyabilirsiniz.

Hoşgeldin IPv6

Bu yazının tamamı IPV4 standartlarına göre yazılmıştır ve buradaki yöntemler yalnızca IPV4 için geçerlidir. Peki ya IPV6 standartları ne olacak? Onları çeviremez miyiz? Çeviririz tabi ki. Bu konu hakkında kaynak yok denebilecek kadar az, bu yüzden şuan okuduğunuz satırlar çok değerli.

IPV6'nın hayatımıza girmesiyle birlikte, PHP5 bu teknolojiye yönelik geliştirmelere kendisini de dahil etti. Aslında demin bahsettiğim konu içinde hayati bir önem taşıyor IPV6 durumu. IP adreslerinin 32 bit olmasından ve bundan tasarruf etmekten bahsetmiştim. Düşünsenize IPV6 adresler 32 değil, 128 bit! Yani tam 4 kat daha fazla veri demek veritabanlarınız için.

Aşağıda kullanacağım fonksiyonlar Linux üzerinde PHP'nin 5.1.0 sürümünden, Windows üzerinde ise 5.3.0 sürümünden önce çalışmayacaktır.

PHP'ye yeni eklenen inet_ntop() ve inet_pton() fonksiyonları bu işi yapmakta. Örnekleri PHP manual sayfalarında bulabilirsiniz. Zaten 2 tane örnek var ve bütün internette onlar dolaşıyor, daha tam net bilgiler yok bu konu hakkında.

Burada n => network, p => presentation veya printable kelimelerini temsil ediyor. Yani ntop => network to printable, pton => printable to network anlamına gelmekte.

Peki MySQL kanadında işler nasıl? MySQL şuan resmi olarak INET_ATON ve INET_NTOA gibi bir fonksiyon geliştirmedi. Bu işi yapmak için üçüncü parti bileşenlere ihtiyacımız var.

Şimdilik bu kadar.

Başarılar.

Date:
Categories: tech, database

Share this post!


Blog Comments powered by Disqus.