Kişisel bir web günlüğü

SimplePie sınıfı ile RSS çıktılarını okumak

simplepieRSS bana göre web dünyasındaki en önemli teknolojilerden birisidir. İlk olarak Netscape tarafından geliştirilmeye başlanan bu teknoloji ile yüzlerce web sitesini gezip hangisinin içeriği yenilenmiş hangisinin yenilenmemiş tek tek kontrol etmekten kurtulmuş olduk. Özellikle blog siteleri ile kullanır olduğumuz bu önemli teknolojiyi çeşitli nedenlerden dolayı (örneğin bloglardan.com gibi bir web sitesi hazırlamak için) kendi uygulamalarımızda işlemek gerekebiliyor. İşte PHP dili ile yazılmış bir sınıf (class) olan SimplePie sınıfı bu konuda bize yardımcı oluyor.

SimplePie sınıfını tanıyalım

Öncelikle "neden SimplePie kullanacağız?" sorusuna cevap aramalıyız. RSS teknolojisi sayesinde bir web sitesinin özet bilgileri bir XML formatında sunulmaktadır. Fakat bu formatta, RSS teknolojisinin sürümlerine göre farklılıklar olabiliyor. Örneğin rss 1.0 sürümüyle, rss 2.0 sürümünde sunulan formatlar farklıdır. Bir de buna daha yeni bir format olan atom formatını ekleyebiliriz. Böyle olunca PHP kullanarak bir RSS çıktısı okuyacağımız zaman bu format farklılıkları bizi uğraştıracaktır. Oysaki SimplePie sınıfı bu farklılıkları sorun etmez ve pek çok formatı destekler.

SimplePie yalnızca RSS çıktılarını okumak amacıyla programlanmıştır. Bu sınıf ile yeni bir RSS çıktısı oluşturamazsınız, önünüze gelen her XML dosyasını okuyamazsınız. PHP 4.3.0 ve üzeri bir sürümde çalışabiliyor. Sınıf içerisindeki metodları gösteren ve iyi dökümante edilmiş yardım sayfaları vardır. Ayrıca ücretsizdir. Download sayfasından en son sürümünü indirebilirsiniz.

SimplePie sınıfını kullanalım

İlk önce download sayfasından zip'lenmiş olarak indirdiğiniz dosyayı web klasörünüzün içindeki simplepie isimli bir alt klasöre çıkartmanız gerekiyor. Yani web tarayıcınıza "http://localhost/simplepie/" adresini yazdığınızda bu klasöre ulaşabiliyor olmalısınız. Bu klasördeki simplepie.inc isimli dosyayı simplepie.php olarak isimlendirin. Sonra boş bir index.php dosyası oluşturun. Son olarak da ileride lazım olacağı için cache isimli bir alt daha klasör oluşturun. Bu işlemlerden sonra simplepie klasöründeki diğer dosyaları ve klasörleri silebilirsiniz. Son durumda klasör şöyle görünüyor olmalıdır:

simplepie

Şimdi "index.php" dosyasını açalım ve adım adım kodları yazmaya başlayalım.

1. adım:

  1. <?php
  2. require_once 'simplepie.php';
  3.  
  4. $feed = new SimplePie();

İlk adımda SimplePie sınıfını index.php dosyamıza dahil ettik ve kullanıma hazırladık.

2. adım:

  1. $feed->set_feed_url('http://www.eburhan.com');
  2. $feed->init();
  3. $feed->handle_content_type();

İkinci adımda rss çıktısını okuyacağımız web sitesinin adresini set_feed_url metoduna girdik. Bu metoda doğrudan rss çıktısının adresini de girebilirsiniz. init metodu ile de rss çıktısını okuma işlemini başlatmış oluyoruz. handle_content_type metodu ise rss çıktısının karakter kodlaması ve içerik türü ile ilgili bir takım ön işlemlerin yapılmasını sağlar. Bunu kullanmak zorunlu değil ama kullanmadığınızda karakter sorunu olabilir.

3. adım:

  1. if($feed->error()) {
  2.     echo '<strong>SimplePie Hatası</strong>: '.$feed->error();
  3.     exit();
  4. }

Üçüncü adımda basit bir hata kontrolü yapıyoruz. Yani ikinci adımda "init" metodu ile başlattığımız rss çıktısını okuma işleminin başarılı olup olmadığını kontrol ettiriyoruz. Eğer bir hata oluştuysa bu hatayı yine error metodu ile ekrana yazdırıyoruz.

4. adım:

  1. $limit = $feed->get_item_quantity(5);
  2. printf("<h1>%s</h1>", $feed->get_title());

Dördüncü adımda, okuduğumuz rss çıktısına ait kaç adet yazının ekrana yazdırılacağını belirtiyoruz ve $limit isimli bir değişkene kaydediyoruz. Biz burada eburhan.com'a ait son 5 yazının ekrana yazılması gerektiğini belirtmiş olduk. Sonraysa get_title metodu ile, okuduğumuz rss çıktısının başlığını ekrana yazdırıyoruz.

5. adım:

  1. for($i=0; $i<$limit; ++$i)
  2. {
  3.     $item = $feed->get_item($i);
  4.  
  5.     printf("<h3><a href=\"%s\"?phpMyAdmin=sTfRvBzMpHQj7RuyjeTqJbvr0wb>%s</a></h3>", $item->get_permalink(), $item->get_title());
  6.     printf("<p>%s</p>", $item->get_description());
  7.     printf("<p><small>%s</small></p>", $item->get_date('d.m.Y H:i'));
  8.  
  9.     print '<hr/>';
  10. }
  11.  
  12. ?>

Bu son adımda bir döngü açtık ve dördüncü adımdaki $limit değişkenini kullanarak bu döngünün kaç defa işleyeceğini belirttik. Hemen döngünün alt satırında o anki yazının bilgilerini alıyoruz ve $item değişkenine atıyoruz. Sonrasında bu değişken üzerinden o anki yazının adres, başlık, içerik ve tarih bilgilerine ulaşarak ekrana yazdırıyoruz.

Toplam 5 adımda yazmış olduğumuz kodların tamamına gözatalım:

  1. <?php
  2. require_once 'simplepie.php';
  3.  
  4. $feed = new SimplePie();
  5. $feed->set_feed_url('http://www.eburhan.com');
  6. $feed->init();
  7. $feed->handle_content_type();
  8.  
  9. if($feed->error()) {
  10.     echo '<strong>SimplePie Hatası</strong>: '.$feed->error();
  11.     exit();
  12. }
  13.  
  14. $limit = $feed->get_item_quantity(5);
  15. printf("<h1>%s</h1>", $feed->get_title());
  16.  
  17. for($i=0; $i<$limit; ++$i)
  18. {
  19.     $item = $feed->get_item($i);
  20.  
  21.     printf("<h3><a href=\"%s\"?phpMyAdmin=sTfRvBzMpHQj7RuyjeTqJbvr0wb>%s</a></h3>", $item->get_permalink(), $item->get_title());
  22.     printf("<p>%s</p>", $item->get_description());
  23.     printf("<p><small>%s</small></p>", $item->get_date('d.m.Y H:i'));
  24.  
  25.     print '<hr/>';
  26. }
  27. ?>

Bu kodları "index.php" dosyasına kaydedip çalıştırdığınızda alttaki ekran görüntüsünde olduğu gibi bir çıktı almalısınız. Tabii ki bu esnada bir problem oluşmazsa :)

simplepie

SimplePie sınıfını ile önbellek (cache) işlemleri

Yukarıdaki örnekte, SimplePie sınıfı ile eburhan.com'un rss çıktısını okumayı öğrendik. Yaptığımız örnek uygulama her çalıştırıldığında SimplePie sınıfı eburhan.com'a bağlantı kuracaktır. Oysaki bu durum bir performans kaybına neden olabilir. Niye her seferinde eburhan.com'a bağlanalım, değil mi? Onun yerine 1 kere bağlantı kurmak, bu bağlantı sırasında alınan rss çıktısını bir dosyaya depolamak ve önümüzdeki 1 saat süresince işlemlerin bu dosya üzerinden yapılmasını sağlamak daha performanslı olacaktır.

SimplePie sınıfı ile bir rss çıktısını önbelleğe almak için şu metodları kullanmalıyız:

  • enable_cache : önbellekleme işlemin aktifleştirilmesi gerektiğini belirtir
  • set_cache_duration: rss çıktısının kaç saniye süresince önbellek dosyasından okunacağını belirler
  • set_cache_location: önbellek dosyasının yerini belirtir

Önbellekleme işlemi için kullanılan bu medotları 2. adımdaki "init" metodundan hemen önce kullanabilirsiniz.

  1. $feed->enable_cache(true);
  2. $feed->set_cache_duration(600);
  3. $feed->set_cache_location('./cache');

Bu örnekte rss çıktısı okuma işleminin önbelleğe alınacağını belirtiyoruz. Daha sonra 600 saniye (10 dakika) süresince bu rss çıktısının internetten değil de, bir önbellek dosyasından okunacağını belirtiyoruz. Son olarak da önbellek dosyasının "cache" isimli bir klasör içerisine kaydedilmesini belirtiyoruz. Buradaki "cache" klasörünün yazılabilir olması gerektiğini hatırlatayım.

Sonuç

PHP ile bir rss çıktısı okumak için MagpieRSS ve lastRSS gibi başka sınıflar da mevcut. Fakat SimplePie sınıfı bana göre en ayrıntılı ve en kaliteli sınıftır. Ben burada küçük bir bölümünden bahsettim. Siz mutlaka yardım sayfaları'ndaki metodlari kendiniz tek tek deneyin. Bu yazıdaki örnekleri de buradan indirebilirsiniz.

11 Mart 2008, 11:33 Programlama Bugün 1 kez, toplamda ise 7.267 kez okundu. , , ,
26 yorum var
  1. Valla hocam ellerine sağlık. Acemi biri olarak senin bilgilerinden faydalanmak gerekliliğini her yeni yazında daha iyi anlıyorum.

  2. Her site için yeniden kod yazmak zorunda mıyız?

  3. @henster
    set_feed_url metodunu inceleyebilirsin. Bu metoda bir dizi (array) içerisinde birden fazla web adresi veya rss adresi girebiliyorsun. Böylece ayrı ayrı kod yazmadan birden fazla rss çıktısını okumuş oluyorsun.

    $feed->set_feed_url(‘http://www.eburhan.com’);

    yerine

    $feed->set_feed_url(array(‘http://www.eburhan.com’, ‘http://www.henster.org/’));

    şeklinde tanımlama yapabilirsin.

  4. SimplePie’nin bir güzel özelliği de Türkçe karakterlerle sorun çıkartmıyor oluşu. Yaptığım testlerden MagpieRSS’in sorun çıkardığını görmüştüm. Makale için teşekkürler eburhan :)

  5. Güzel bi yazı olmuş :) Keşke pdf olarak arşivleyebilseydik :P

  6. demek bu iş için harici class’lar kullanmak gerekiyordu. Ben de php’nin kendisiyle bunu yapmak için baya uğraşmıştım ama istediğim gibi olmamıştı. bu yazı çok makbule geçti. Sağol erhan ;)

  7. Teşekkürler erhan, inceliyorum şimdi. (:

  8. valla ilaç gibi geldi :)

  9. slm yazı güzel olmuş teşekkürler. Simplepie sitesinde digg.com ile ilgili bir çalışma yapılmış ve rss’de digg.com’un resimleri de gelecek şekilde düzenlenmiş. acaba siz onu da anlatabilirmisiniz. teşekkürler.

  10. @onur

    resimleri de gelecek şekilde düzenlenmiş.

    Resimlerin de gelmesini istiyorsan yukarıdaki kodda

    $item->get_description()

    yerine

    $item->get_content()

    kullanmalısın. (get_content)

  11. Açıkçası uzun bir zaman önce bir uygulamada rastlamıştım “simplepie” uygulamasına. Farklı terimlerle arama yapmama rağmen Türkçe bir kaynağa ulaşamamış, tam olarak ne işe ayaradığını anlayamamıştım. Geçte olsa rastladım ve gerçekten yararlı oldu. Çok teşekkürler…

  12. scripti yerel sunucumda denedim gayet güzel çalışıyor, güncellemeleri vs okuyor ancak nedense web sunucuma attığımda okuduğu rss kaynağındaki bilgiler güncellenince, güncel bilgiler görünmüyor, cache ye okuma yazma izni veriyorum ama yinede olmuyor… cache içindeki localhost zamanından kalan dosyaları sildiğimde script çalışmıyor hata da vermiyor…. localhost da ki cachenin içindeki eski dosyaları alıp ftp ile web sunucudaki cachenin içine tekrar yükleyince haliyle çalışıyor… umarım sorunumu anlatmışımdır sizce neden olabilir?

  13. @emrah
    gerçekten ilginç bir sorun (: Sorunun neden kaynaklanabileceği konusunda bir fikrim yok ama sana şu önerim olacak. SimplePie’ı indirdikten sonra içerisindeki “compatibility_test” klasörünü sunucuna at ve bu klasör içerisindeki “php” dosyasını çalıştır. Böylece sunucunun, SimplePie’ın bütün gereksinimlerini karşılayıp karşılamadığını görebilirsin.

  14. dediğini yaptığımda sunucum SimplePie için oldukça konforlu gözüküyor ;) cache yerine mySQL ile deneyeceğim bir de…

    ayrıca bahsi geçen deneme şu: http://www.fermanyum.com/rss/

  15. Ayrıca jsonme sayesinde herhangi bir feed’i kolayca bir php dizisine atmak mümkün :D

  16. E olmayan burhan 5 Nisan 2008 20:02

    Hocam adaşım :) :)
    Yine çok güzel şeyler anlatmışsınız. Eline sağlık.Sitenizden çokça faydalandım. Sizden birçok şey öğrendim.
    Ohh içimde kalmadı söyledim işte :) :)

  17. Çok güzel bir açıklama olmuş. Teşekkürler. Bunu scrolling news tarzında blogdan haberler olarak kullanmak nasıl mümkün olabilir?

  18. merhaba
    ben simplepie de başka şeyler ekleme yapınca türkçe problemi çekiyorum mesela sayfaya bir form ekleyince türkçe karakter problemi çıkıyor. Bi yerlerde yanlış mı yapıyorum?

  19. Bu class ta TTNET’in rss ini okuyamadı :S

  20. ben bu class ı kullanarak bazı örneklerini gördüm youtube gibi sitelerden video da alınabiliyo bunun için nasıl bir kod sistemi kurmak gerekiyor bunu da anlatırsanız. simplepie kendi sitesinde newsblock demo orda bununla ilgili bişeyler var ama ben pek çözemedim ordaki anlatımları. bunun la ilgili bir anlatım yapar mısınız yoksa bu kodlamaüzerinde biriki değişiklik bunu yapabilir miyiz

  21. goran pandev 12 Ağustos 2009 11:17

    Merhaba,

    Faydalı bilgiler için çok teşekkürler..

    Türkçe karakter problemi yaşayan arkadaşlar sorunlarını şununla halledebilirler( ben halledebilmiştim en azından :) ) ;

    $feed->set_output_encoding(‘ISO-8859-9′);

  22. selamlar güzel bir anlatim tskler.Ben sadece menuleri yani konu basliklarini almak istiyorum..açıklama olmasini istemiyorum..acaba onu nasil yapabilirim ?

  23. Sevgili @eburhan;
    Ben de kullanayım dedim ama olmadı. Benim sitede çalışmadı.
    SimplePie Hatası: fsockopen error:
    şeklinde hata veriyor. Yardımcı olursan sevinirim.
    Saygılarımla.

  24. Merhabalar, bu sistemi localde kullandığımda problem yok
    fakat hosta attığımda bir hata alıyorum

    aldığım hata;

    php_cUrl timeout 28 sec.

    diye bir hata.. bu hatayı nasıl düzeltebilirim ?

    Şimdiden Teşekkür Ederim

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

Telif Hakkı © 2010 eburhan.com | Structure | XHTML