miffmedia.com

I još po nešto...

RSS feed je opšte poznato, dobra stvar. Koriste ga svi, developeri, blogeri, surferi... E sad, ovo pišem za ovu moju vrstu, prvenstveno za početnike, ali...

RSS, je ustvari formatirani sadržaj sa nekog sajta/bloga/portala... u XML formatu(najprostije receno). Inace ovde možete da prostudirate sve o XML-u, a na W3 gomila primera i objašnjenja. Uglavnom XML je dobar za slanje i čuvanje odredjenih podataka.

 Potrebno nam je dalje, cURL u PHP-u moram da napomenem,(podrazumeva se server sa instaliranim PHP-om). Curl(libcurl) je inače biblijoteka(library) i omogućava konektovanje i komuniciranje na server(različitih vrsta) i protokola. Inače dodata je od verzije 4.0 i meni bitno da podržava HTTP, HTTPS protokole, podržava još gomilu ali nisam imao prilika.

Za Linux - ekipu:  "instaliranje" libcurl-a

sudo apt-get install php5-curl


a za Win korisnike, dovoljno je u php.ini fajlu da odkomentarišete liniju sa curl-mod ili slično :)

Dakle imamo sa jedne strane PHP sa cURL mogućnostima, a sa druge strane feed koji nam je potreban(razloga ima puno).

$r = curl_init("http://www.nekisajt.com/feed.xml");

Ovom linijom smo inicirali curl, konkretno sa ovom adresom

curl_setopt($r, CURLOPT_RETURNTRANSFER, true);
curl_setopt($r, CURLOPT_HEADERor: #339933;">, 0);

ove dve linije se odnose na konekciju, i prva ima tri parametra: $r tj. resurs sa koga se vuče ranije definisan, drugi parametar je jak o bitan CURLOPT_RETURNTRANSFER, jer podrazumevano libcurl samo šalje podatke i ne čeka odgovor (response), što je dobro u nekim slučajevima, ali kako nam je potreban rss feed moramo da sačekamo odziv kako bi server dozvolio konekciju :), treći parametar je vrednost koja se tiče drugog parametra i ona je bool (true ili false).

Sledeći korak je: izvršiti konekciju, sačekati odziv i zatvoriti. U dve linije koda:

$rss = curl_exec($r);
curl_close($r);


Sada je pola posla urdjeno, ostaje nam manipulacija podacima koje smo pokupili. Sada, postoje razne tehnike za parsovanje XML kao sto su regular exspressions,str_replace i jos po koja, ali sve te tehnike troše resurse malo više, mnogo koda za ništa i od petice(PHP) postoji SimpleXML!

Rad sa SimpleXML je jednostavan i u dokumentaciji ima desetak bibljoteka koje su lepo opisane, nema potrebe za posebnom instalacijom, već je ugradjeno u PHP.

Imamo $rss varijablu koja "nosi" celokupni xml, treba samo pozvati SimpleXML sa dva parametra:

$feed = new SimpleXmlElement($rss, LIBXML_NOCDATA);

Inicijalizovali smo, i prosledili nasu $rss varijablu,  LIBXML_NOCDATA je parametar koji da se CDATA tretira kao tekst (više o ovome neki drugi put), može se proslediti i treći parametar koje je bool(true ili false) podrazumevano je false, da se prosledi treći parametar true, $rss bi morao da bude putanja do XML fajla a ne varijabla sa podacima. Tako da cURL nebi bio ni potreban :) teoretski.

Ako vas interesuje šta se dogadja i šta smo ustvari napisali koristite  var_dump($feed) ili

print_r($feed);

Sad ide teži deo, pošto neko "pušta" feed u RSS, a neko u ATOM formatu, trebalo bi detektovati na neki način, ovakav recimo:

if(isset($feed->channel))
{
    daj_RSS($feed);
}
if(isset($feed->entry))
{
    daj_Atom($feed);
}

dobra stvar je ta što RSS ima a ATOM , tako da smo pomoći if proverili koji je ko. Pa shodno tome, pozvana je odgovarajuća funkcija.

RSS funkcija igleda ovako:

function daj_RSS($xml)
{
    echo "".$xml->channel->title."";
    $cnt = count($xml->channel->item);
    for($i=0; $i<$cnt; $i++)
    {
    $url     = $xml->channel->item[$i]->link;
    $title     = $xml->channel->item[$i]->title;
    $desc = $xml->channel->item[$i]->description;
    echo ''.$title.''.$desc.'';
    }
}

rss je mnogo lakši za čitanje, jer ne sadrži previše atributa u tagovima, dok je sa atom-om situacija malo teža jer moramo da pročitamo atribut:

function daj_Atom($xml)
{
    echo "".$xml->author->name."";
    $cnt = count($xml->entry);
    for($i=0; $i<$cnt; $i++)
    {
    $urlAtt = $xml->entry[$i]->link->attributes();
    $url    = $urlAtt['href'];
    $title     = $xml->entry[$i]->title;
    $desc    = strip_tags($xml->entry[$i]->content);
        echo ''.$title.''.$desc.'';

    }
}

Ostaje vam samo da u $r varijablu postavite neki link i testirate.

5 komentara na 'PHP, RSS i cURL'

nije bas za pocetnike, ali je veoma razumljivo.
sam kad bi font bio manje zelen u "code", oci mi ispadose od toliko kontrasta...

@ivice pa zato je kontrastno da ti se ureze u pamcenje ;)
Bar ja tu tehniku brzog ucenja koristim :D

Ostavi komentar

Komentar: