410 likes | 527 Views
PHPConf 2008 Kaunas. Pasiimam duomenis iš trečiosios šalies šaltinių. Trumpai apie manę. Man 26 Su PHP dirbu 7 metus Taip pat galiu dirbti ir dirbu su: Ruby (RoR), Python, Java Per tą laiką teko dirbti 3 įmonėse Didžiausias ir sunkiausias projektas mano gyvenime: www.literotica.com
E N D
PHPConf 2008 Kaunas Pasiimam duomenis iš trečiosios šalies šaltinių
Trumpai apie manę • Man 26 • Su PHP dirbu 7 metus • Taip pat galiu dirbti ir dirbu su: Ruby (RoR), Python, Java • Per tą laiką teko dirbti 3 įmonėse • Didžiausias ir sunkiausias projektas mano gyvenime: www.literotica.com • Vadovai mano, kad aš esu visagalis
Kodėl tai aktualu? • Tai tenka daryti vis dažniau • Šaltinių įvairovė vis didėja • Tai ne tik RSS ar kitas XML pavyzdys • Tai ne visada paremta standartais • Tai ne visada taip paprasta, kaip atrodo • Kur dar tai galima panaudoti
Dažniausiai naudojame • readfile(<adresas>); • fopen(<adresas>); kartu su fpassthru() arba fread(); • file(<adresas>); • file_get_contents(<adresas>);
Paprasčiausias pavyzdys • Tai paprasčiausias variantas įgyvendinimo atžvilgiu. • Tai prasčiausias variantas saugumo atžvilgiu, blogiau galėtų būti tik include(<adresas>);
Paprastumas ne visada yra gerai • O jei šaltinis lėtai veikia? • O jei šaltinis išvis neveikia? • O jei šaltinį nulaužė? • O jei šaltinis pakeitė savo formatą? • Ar mes išnaudojome visas HTTP protokolo galimybes?
Sudėtingesnis metodas • Jų nėra tiek daug • curl/libcurl • fsockopen/Stream functions • Zend Framework: Zend_Http_Client • exec() + wget • Jie sudėtingesni • Jie suteikia daugiau galimybių
Kas tas curl? • curl – Client Url Library • Puikiai išvystyta biblioteka, skirta darbui su įvairias protokolais • Integruota į PHP (PHP plėtinys php_curl) • Turi daug įvairių nustatymų • Gali dirbti paraleliai su keliais adresais • Deja, išjungta pagal nutylėjimą
Dar truputis apie curl • Visa informacija yra http://lt.php.net/curl • Būtinai susipažinkite su curl_setopt funkcija ir jos konstantomis • Pravartu žinoti apie curl_getinfofunkciją ir jos grąžinamą rezultatą • Jeigu darote daug užklausų į vieną tinklapį, patarčiau nustatyti padorų “User Agent”
Fsockopen/Stream Functions • Pavadinimai kalba patys už save • Deja, neturiu patirties šioje srityje • Nes viską reikia kurti pačiam • O kai nėra reikalo tai daryti – tai neįdomu • Kam įdomų – daug informacijos yra adresu http://lt.php.net/fsockopen ir http://lt.php.net/stream
Zend Framework - Zend_Http_Client • Puikus PHP karkasas • Daug naudingų modulių • Pagrindinis kūrėjas yra Zend • Zend pats kontroliuoja kodą • Galima naudot tik atskiras dalis ir nebūtinai tinklapio kūrimui
Dar truputis apie Zend_Http_Client • Tai Zend Framework dalis • Ją naudoja kiti komponentai: visi, kas dirba su HTTP protokolu, todėl patartina ją mokėti naudotis • Naudoja Stream Functions: http://lt.php.net/stream • Galima sukurti savo adapterį
Apie ką nenorėčiau kalbėti • Nenorėčiau kalbėti apie exec() + wget • Tai komandinės eilutės įrankis palaikant HTTP ir FTP protokolus • Su exec() tai neefektyvu • Tai nuobodu • Tai labai labai retai naudojama • Tai labiau skirta administratoriams • Galima taip naudoti ir kitą programinę įrangą
Bet mes dar net nepriartėjome prie: • O jei šaltinis lėtai veikia? • O jei šaltinis išvis neveikia? • O jei šaltinį nulaužė? • O jei šaltinis pakeitė savo formatą? • Ar mes išnaudojome visas HTTP protokolo galimybes?
O jei šaltinis lėtai veikia? • Jūsų tinklapis irgi lėtai veikia • Gali išmesti klaidą • Sprendimai: • “Kešuokite” duomenis • Atsisakykite užklausų generuojant tinklapį • Sumažinkite atsakymo į užklausą laukimo laiką iki minimumo
O jei šaltinis išvis neveikia? • Jūsų tinklapis nieko nerodo, nebent klaidas • Kraunantis tikrai lėtai veikia (pauzė gali būti nuo 5 iki 60 sek.) • Sprendimai: • Jokių užklausų generuojant tinklapį • “Kešas”, “kešas”, “kešas”. • Pasenęs “kešas” netrinamas, kol sistema nėra įsitikinusi, kad naujas “kešas” yra sugeneruotas ir tinkamas • Pranešimai apie klaidas
O jei šaltinį nulaužė? • Na, mano pavyzdys tikrai šiuo atvejų ... • Tikrinkite gautus duomenis: • Duomenų formatą: content-type (text/plain, text/xml, text/html) • Duomenų “vidų”: ar tikrai tai XML/TXT/HTML • Duomenų atitikimą reguliariems išreiškimams • Pranešimai apie klaidas
O jei šaltinis pakeitė savo formatą? • Tai nebūtinai nulaužymas • Sistema turi būti tam paruošta • Protingas “kešo” naudojimas • Pranešimai apie klaidas vartotojams • Pranešimai apie klaidas kūrėjams • Tai atsitiks tada, kai Jus to visiškai nelauksite (iš patirties sakau)
Naudojame visas HTTP galimybes? • HTTP yra puikus protokolas • Jis yra dokumentuotas (RFC 2616) • Žiūrim ką turim? • If-Modified-Since • If-Match • Cache-Control • Deja, tai priklauso ir nuo šaltinio
GET /feed/ HTTP/1.1 Host: www.kurakin.info ... If-Modified-Since: Tue, 25 Mar 2008 18:19:12 GMT HTTP/1.x 304 Not Modified Date: Fri, 11 Apr 2008 18:52:55 GMT ... If-Modified-Since
GET /feed/ HTTP/1.1 Host: kurakin.info ... If-None-Match: "a25432-3d9-47891f60" HTTP/1.x 304 Not Modified Date: Fri, 11 Apr 2008 18:57:13 GMT ... Etag: "a25432-3d9-47891f60" If-Match
Cache-Control • Čia viskas nėra taip paprasta • Patariu pasidomėti HTTP 1.1 (RFC 2616) • Nepamirškite, kad “kešuoti” gali ir tarp Jūsų ir šaltinio esanti serveriai
Šaltinių įvairovė • Kai aš pradėjau, buvo HTTP ir HTML • HTML buvo neteisingas (angl.: not valid), neatspėjamas ir buvo tik PCRE ar EREGI • Kartais naudojome paprastą tekstą ar serialize/unserialize
Šaltinių įvairovė • Atsirado XML – pradėjome naudoti DOM, SipleXML • O dar RSS, ATOM, XML-RPC, SOAP ir kiti smagūs dalykai, API. • Dažnai jie visi remiasi HTTP protokolu
Kai nesilaikoma standartų • Vis dar yra poreikis gauti informaciją iš HTML puslapių • Dažnai būna neteisingas kodas • Įrankiai: • String functions • PREG/EREGI functions • Tidy
Dar apie Tidy • Turi labai daug nustatymų: http://tidy.sourceforge.net/docs/quickref.html • Galime HTML kodą paversti į XHTML ar XML • Galime kodą išvalyti nuo šiukšlių • Galime pašalinti klaidas
Taigi, jau turime standartą • Su standartais visi mokame dirbti • Vis dar lieka vietos PREG/EREGI • Jau galima naudoti DOM/SimpleXML • XPATH tampa mūsų draugu
Rezultatas • Aš tai daryčiau kartą per dieną • Tai daryčiau su “cron” pagalba • Taip, čia nėra patikrinimų kuriuos minėjau • Taip, juos turite kurti patys
Kur galima panaudoti šias žinias • XML failų kaip informacijos šaltinio naudojimas • Įvairių API naudojimas • Mokėjimo sistemų integracija • Informacijos gavimas iš nestandartinių/nepritaikytų šaltinių • Mažių paieškos sistemų kūrimas
Paprasta paieškos sistema • Tai visada atrodo nesudėtingai, kai pradedi • Parsisiunti puslapį • Įvertini turinį • Turini įdedi į indeksą • Sunkiausia – įvertinimo algoritmas
Pabaiga • Ačiū! • Kontaktas: sergej@kurakin.info • Informacijos šaltiniai: • http://www.php.net/ • http://framework.zend.com/ • http://www.google.com/ • Kiti interneto tinklapiai • Klausimai?