28 Ağustos 2010 Cumartesi

Bir Adresin Varlığını Kontrol Etme

Özellikle dış kaynaklardan beslenen bir betiğiniz, yazınız varsa, kaynak olarak gösterdiğiniz web adresinin varlığını ya da siteniz içerisindeki bağlantılarda hata olup, olmadığını kontrol etmek isteyebilirsiniz. Daha doğrusu bir adresin kırık olup, olmadığını PHP kullanarak anlayabilirsiniz. Bunun için ise PHP'nin en güzel uzantılarından birisi olan Curl uzantısını kullanacağız. Dolayısıyla da sunucunuzda bu uzantının kurulu olması gerekiyor.

Curl ile bir adrese bağlanabilir, POST ile bilgi gönderebilir, hatta dosya bile yükleyebilirsiniz. Ancak biz Curl'i bir web adresinden dönen header (başlık) bilgilerini okumak ve yorumlamak için kullanacağız. Biliyorsunuz, bir web sayfasına bağlandığınızda eğer sayfa bulunamazsa 404 hatası alırsınız. Bu kod da header bilgisi olarak istemciye gönderilir. Bizim yapacağımız da Curl ile sayfanın header bilgisi içerisinde bu kodu aramak olacak. Kullanacağımız kod aşağıda olup, açıklamalara yorum olarak ulaşabilirsiniz.

PHP:
  1. $url = "http://www.makaledunyasi.net";
  2. //Kontrol edeceğimiz adres
  3. $ch = curl_init();
  4. //Curl uzantısını çağırıyoruz
  5. curl_setopt($ch, CURLOPT_URL, $url);
  6. //Bağlantı adresini tanımlıyoruz
  7. curl_setopt($ch, CURLOPT_HEADER, true);
  8. //Header bilgisini istiyoruz
  9. curl_setopt($ch, CURLOPT_NOBODY, true);
  10. //Body bilgisini istemiyoruz
  11. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  12. //Değerlerin alınmasını sağlıyoruz
  13. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  14. curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
  15. //Eğer yönlendirme varsa 10 kez takip etsin
  16. $data = curl_exec($ch);
  17. //Veriyi çekiyoruz
  18. curl_close($ch);
  19. //Bağlantıyı kesiyoruz
  20. preg_match_all("/HTTP\/1\.[1|0]\s(\d{3})/",$data,$matches);
  21. //Gelen header bilgisi içerisindeki hata kodunu ayıklıyoruz
  22. $code = end($matches[1]);
  23. //Hata kodunu alıyoruz. Eğer yönlendirme varsa en sonuncu adresinkini alıyoruz
  24. if(!$data) {
  25. //Veri yoksa adrese ulaşılamamıştır
  26. echo "Alan adı bulunamadı";
  27. } else {
  28. if($code==200) {
  29. //200 sayfanın var olduğunu belirtir
  30. echo "Sayfa Bulundu";
  31. } elseif($code==404) {
  32. //404 sayfanın bulunamadığını belirtir
  33. echo "Sayfa Bulunamadı";
  34. }
  35. }

Eğer kod içerisinde $data değişkenini yazdırmış olsaydık, aşağıdaki gibi bir header bilgisi alacaktık.

HTTP/1.1 200 OK Date: Wed, 31 May 2009 12:25:26 GMT Server: Apache X-Powered-By: PHP/5.1.2 X-Pingback: http://www.makaledunyasi.net/xmlrpc.php Status: 200 OK Content-Type: text/html; charset=UTF-8

Eğer sayfa bulunamasaydı Status: 200 yerine Status: 404 ifadesi dönecekti. Gelen bu header bilgisini ayıklamamız gerekecek. Bunun için ise aşağıdaki kodu kullandık:

PHP:
  1. preg_match("/HTTP\/1\.[1|0]\s(\d{3})/",$data,$matches);
  2. print_r($matches);

Koddaki preg_match fonksiyonundan dönen $matches değişkenini yazdırdığımızda aşağıdaki gibi bir ekran çıktısı alırız:

Array ( [0] => Status: 200 [1] => 200 )

Çıktıdan da anlaşılacağı üzere gelen durum kodu $matches[1] içerisinde saklı. Eğer yönlendirme varsa bu dizinin boyutu daha da artacağından, dizinin son elemanını aldık, gerisi de basit karşılaştırmalar yapmaktan ibaret.

Hiç yorum yok:

Yorum Gönder