Kişisel bir web günlüğü

PHP’nin get_headers fonksiyonu

eburhanWeb üzerindeki pekçok işlem istemci-sunucu ilişkisi üzerine kuruludur. Sürekli istemci ile sunucu arasında bir iletişim vardır. Bu iletişimin ilk ayağını da Headers dediğimiz Başlık Bilgileri oluşturur. Sunucunun istemciye gönderdiği başlık bilgilerinde, kendisinden istenilen dosyanın var olup olmadığı, dosya varsa içerik türünün ne olduğu gibi önemli bilgiler yer alır. İşte bu bilgilere PHP 5 ile kullanıma sunulan get_headers fonksiyonuyla kolayca erişebiliyoruz.

1. get_headers fonksiyonunu tanıyalım

Diyelim ki tam adresi olan http://www.sitebilgi.net/css_js/anasayfa.css olan bir CSS dosyasını çekmek istiyorsunuz. Başlangıçta şu iki bilgiyi kontrol etmeniz lâzım:

  1. Dosya gerçekten var mı?
  2. Dosya gerçekten bir css dosyası mı?

Bu iki bilgiyi kontrol etmek için, yazının giriş kısmında değindiğim başlık bilgilerine bakabiliriz. Bu işlem için get_headers fonksiyonunu şöyle kullanıyoruz:

  1. <?php
  2.     $adres = 'http://www.sitebilgi.net/css_js/anasayfa.css';
  3.  
  4.     $baslik = get_headers($adres, 1);
  5.  
  6.     echo '<pre>';
  7.     print_r( $baslik );
  8.     echo '</pre>';
  9. ?>

Bu kodu çalıştırdığımızda alttaki gibi bir çıktı alırsınız ki bu, sunucunun size gönderdiği başlık bilgileridir:

ss-1

Bu çıktının ilk bilgisi ([0] => HTTP/1.1 200 OK) istekte bulunduğumuz dosyanın var olduğunu, son bilgisi ise ([Content-Type] => text/css) bu dosyanın içeririk türünün ne olduğunu belirtiyor.

2. get_headers fonksiyonunu geliştirelim

Bu fonksiyon gerçekten çok pratik fakat bazı eksiklikleri de yok değil. Örneğin bir adres başka bir adrese yönlendirilmişse sorun çıkartabiliyor. Ayrıca başında http:// eki olmayan adresleri sorgulayamıyor. İlk önce yönlendirme sorununa bakalım:

A) yönlendirme sorunu: Örneğin sitebilgi.com adresi, sitebilgi.net adresine yönlendirilmiştir. Eğer siz get_headers ile sitebilgi.com adresini sorgularsanız, sunucu size Location isimli bir başlık bilgisi daha gönderecektir ve bu bilgide hangi adrese yönlendirildiği yer alacaktır. Aynı durum SEO amacıyla yapılan yönlendirmelerde de geçerlidir. www.gopof.com adresinin gopof.com adresine yönlendirilmesi gibi...

ss-2

Öyleyse biz, Location bilgisinin olup olmadığını kontrol edelim. Eğer yönlendirme varsa yeni adresin başlık bilgilerini sorgulayalım. Bunu aşağıdaki kodlarla basit bir şekilde yapabiliriz:

  1. <?php
  2.     $adres = 'http://www.sitebilgi.com/';
  3.  
  4.     $baslik = get_headers($adres, 1);
  5.  
  6.     // yönlendirilme olup olmadığını kontrol et
  7.     // yönlendirme varsa, yeni adresin başlık bilgilerini al
  8.     if( isset($baslik['Location']) ) {
  9.         $baslik = get_headers($baslik['Location'], 1);
  10.     }
  11.  
  12.     echo '<pre>';
  13.     print_r( $baslik );
  14.     echo '</pre>';
  15. ?>

B) http:// sorunu: Sorgulama yaparken bu fonksiyonu get_headers('www.sitebilgi.net') şeklinde kullanırsanız hata verecektir. Bu hatayı da sorgulama öncesinde basit bir kontrol ile atlatabiliriz:

  1. <?php
  2.     $adres = 'www.sitebilgi.net';
  3.  
  4.     // http:// eki olup olmadığını kontrol et
  5.     if( !preg_match('|^(http://)|', $adres) ) {
  6.         $adres = 'http://'.$adres;
  7.     }
  8.  
  9.     $baslik = get_headers($adres, 1);
  10.  
  11.     // yönlendirilme olup olmaduğını kontrol et
  12.     // yönlendirme varsa, yeni adresin başlık bilgilerini al
  13.     if( isset($baslik['Location']) ) {
  14.         $baslik = get_headers($baslik['Location'], 1);
  15.     }
  16.  
  17.     echo '<pre>';
  18.     print_r( $baslik );
  19.     echo '</pre>';
  20. ?>

3. CURL varken neden get_headers kullanıyorsun?

CURL gerçekten çok muhteşem bir eklenti fakat her sunucuda kurulu olmayabiliyor. Kurulu olsa bile bazı sunucularda CURLOPT_FOLLOWLOCATION özelliğini kullanamayabiliyorsunuz. Bundan dolayı yönlendirilmiş adresleri takip edemiyorsunuz. Geçenlerde karşılaşmış olduğum bir hatayı aynen aktarıyorum:

Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /home/jstoolsn/public_html/curl.php on line 8

Bir de küçük bir hız testi yaptım. Farklı web sitelerinin başlık bilgilerini hem CURL hem de get_headers ile sorguladım ve her defasında bu işlemi 30 kez tekrarladım. Büyük bir bölümde, başlık bilgilerine get_headers ile daha hızlı eriştiğimi gördüm. Herhalde get_headers, PHP'nin yerleşik (built-in) bir fonksiyonu olduğu içindir. Test sonuçlarını aşağıdaki tablodan görebilirsiniz:

get_header ile curl arasındaki hız karşılaştırması
No Adres get_headers curl eklentisi
1 techcrunch.com 29 1
2 amazon.com 30 0
3 mynet.com 26 4
4 yahoo.com 25 5
5 microsoft.com 30 0

Bu tabloyu şöyle okumalısınız. Örneğin 4. sıradaki yahoo.com adresinin başlık bilgileri 30 kez sorgulanmış. Bunların 25 tanesinde get_headers fonksiyonu, 5 tanesinde ise Curl eklentisi daha hızlı işlem görmüş.

9 Ağustos 2008, 11:55 Programlama Bugün 10 kez, toplamda ise 4,475 kez okundu. , , ,
6 yorum var
  1. Gerçekten çok kullanışlı bir fonksiyon. Yine tam 12′den vurmuşsunuz:) Teşekkürler.

  2. Benim gibi php’de uygulama geliştirme safhasının çok başında biri için çok net bir anlatım olmuş, çok teşekkürler.

    Devamını bekliyoruz bu tip yazılarınızın ;)

  3. gerçekten güzel bir konuya değinmişsiniz,çok faydalı oldu teşekkürler.

  4. devamını bekliyoruz…

  5. ben daha çok asp ile çalışıyorum. PHP fazla profesyonel geliyor:D mantıksal ifadeleri aspde tanımlamak çok daha kolay.

  6. çok faydalı bir yazı teşekkürler…

İçinizde kalmasın, siz de yorum yazın

Copyright © 2009 eburhan.com | Structure Theme | XHTML 1.0 | Yukarı