asterisk
Birželis 13, 2006

Naudojam CURL

Šiame straipsnyje jūs sužinosite kas ta CURL biblioteka, kaip ją naudoti ir keletą jos opcijų.

Pradžia

Anksčiau ar vėliau jūs susiduriate su problema savo skriptuose: kaip paimti turinį iš kitų tinklalapių. Yra keletas būdų kaip tai padaryti ir turbūt paprasčiausias sprendimo būdas yra naudoti fopen() funkciją (jei ji įjunkta), tačiau ji neturi daug nustatymų. Kas jeigu jūs darote „web spider“ ir norite nustatyti savo user agent? Realiai tai padaryti su fopen negalima, taip pat negalima nustatyti request metodo (GET arba POST).

Štai kur mums padės CURL biblioteka. Straipsnyje sužinosite kaip ja naudotis ir ką ji gali. Pirmiausiai išmokime pagrindinius žingsnius.

Pagrindai

Pirmasis žingsnis naudojantis CURL yra sukurti naują CURL šaltinį pasinaudojant curl_init() funkcija, kaip čia:

<?php
// sukuriam curl saltini
$ch = curl_init();
?>

Dabar kai turime curl šaltinį galime peržiūrėti, kokią nors svetainę, nurodant jos adresą su curl_setopt() funkcija:

<?php
// nustatom url ir kitas opcijas su curl_setopt
curl_setopt($ch, CURLOPT_URL, "http://www.google.lt/");
?>

Dabar su funkcija curl_exec() paimsime įvesto adreso turinį ir jį atspausdinsime:

<?php
// imam url ir spausdinam
curl_exec($ch);
?>

Pabaigoje reikia baigti curl šaltinį, jog atlaisvintumėme sistemos išteklius. Tai galim padaryti su curl_close() funkcija:

 <?php
// isjungiam curl
curl_close($ch);
?>

Na atrodo pagrindai yra, dabar viską sujungiam ir gaunam šiokį tokį skriptuką:

<?php 
 
// sukuriam curl saltini
$ch = curl_init();
 
// nustatom url ir kitas opcijas su curl_setopt
curl_setopt($ch, CURLOPT_URL, "http://www.google.lt/");
 
// imam url ir spausdinam
curl_exec($ch);
 
// isjungiam curl
curl_close($ch);
 
?>

(demo – http://pixel.lt/texts/sources/curl_01.php)
(source – http://pixel.lt/texts/sources/curl_01.phps)

Mūsų skriptas iškarto atspausdina kito puslapio turinį, tačiau ką daryti jei mes norime pirmiausiai apdirbti jį ? Tai ne problema, turim opciją CURLOPT_RETURNTRANSFER, kurios reikšmę nustačius TRUE, gausime turinį į kintamąjį, o ne iš karto jį atspausdinsime. Pavyzdukas:

<?php 
 
// sukuriam curl saltini
$ch = curl_init();
 
// nustatom url ir kitas opcijas su curl_setopt
curl_setopt($ch, CURLOPT_URL, "http://www.google.lt/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
// imam url ir perduodam kam reikia turini
$output = curl_exec($ch);
 
// isjungiam curl
curl_close($ch);
 
// Zaidziam su turiniu, keiciam 'Google' i 'PHP'
$output = str_replace('Google', 'PHP', $output);
 
// spausdinam galutini rezultata
echo $output;
 
?>

(demo – http://pixel.lt/texts/sources/curl_02.php)
(source – http://pixel.lt/texts/sources/curl_02.phps)

Aukščiau pateiktuose pavyzdžiuose jūs turbūt pastebėjot jog naudojom curl_setopt() funkciją jog nustatytume kaip puslapis bus pateikiamas ir pan., todėl čia slypi visa curl galia. Nustatydami daugybę įvairių opcijų, o jų yra nemažai, mes galime daug nuveikti, tad pažiūrėkime ką galime nuveikti su curl‘u šiek tiek plačiau.

Ką galima padaryti su curl nustatymais

Jei pažiūrėsite curl_setopt() funkcijos dokumentacijas, pastebėsite jog ten yra didelis sąrašas skirtingų nustatymų. Apžvelkime pačius įdomiausius.

Pirma įdomi opcija - CURLOPT_FOLLOWLOCATION. Kai nustatome true, curl automatiškai seks bet kokį peradresavimą (redirect‘ą). Pavyzdžiui, kai jūs bandote peržiūrėti PHP puslapį, o puslapio source yra header(”Location: http://belekur.kitur.lt/”), curl automatiškai keliaus į belekur.kitur.lt ir ims iš ten rezultatus. Pavyzdys:

 <?php 
 
// sukuriam curl saltini 
$ch = curl_init();
 
// nustatom url ir kitas opcijas su curl_setopt
curl_setopt($ch, CURLOPT_URL, "http://www.google.lt/");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
 
// imam url ir spausdinam
curl_exec($ch);
 
?>

(demo – http://pixel.lt/texts/sources/curl_03.php)
(source – http://pixel.lt/texts/sources/curl_03.phps)

Jei Google nuspręs mus persiųsti kitur, skriptukas keliaus į naują, google nurodytą, adresą. Du nustatymai susiję su šiuo yra CURLOPT_MAXREDIRS ir CURLOPT_AUTOREFERER.

CURLOPT_MAXREDIRS leidžia nustatyti kiek peradresavimų bus keliaujama. Jei CURLOPT_AUTOREFERER nustatytas į TRUE, curl automatiškai išsaugos Referer headerį kiekviename peradresavime. Nelabai svarbu, tačiau kartais praverčia.

Sekanti svarbus nustatymas yra CURLOPT_POST. Tai labai naudinga funkcija, kuri leidžia siųsti duomenis POST metodu, vietoje GET metodų. Šia funkcija naudojantis galima siųsti duomenis į formos duomenis į reikalinga puslapį nepildant formos. Pavyzdukas:

 <?php 
 
// sukuriam curl saltini 
$ch = curl_init();
 
// nustatom url ir kitas opcijas su curl_setopt
curl_setopt($ch, CURLOPT_URL, "http://pixel.lt/texts/sources/curl_handle_form.php");
 
// POST duomenys
$data['name'] = "pixel";
$data['surname'] = "lexip";
 
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 
// imam url ir spausdinam
curl_exec($ch);
 
?>

(demo – http://pixel.lt/texts/sources/curl_04.php)
(source – http://pixel.lt/texts/sources/curl_04.phps)

curl_handle_form.php source:

<?php 
echo '$_POST array:';
print_r ($_POST);
?>

(demo – http://pixel.lt/texts/sources/curl_handle_form.php)
(source –http://pixel.lt/texts/sources/curl_handle_form.phps)

Kaip matote taip tikrai lengva sumitinti formas, ir tai puikus kelias tikrinti visas savo formas jų nepildant kiekviena kartą.

CURLOPT_CONNECTTIMEOUT naudojamas nustatyti kiek laiko bus bandoma prisijungti. Tai labai svarbi funkcija, kadangi jei nustatysite per mažai jūsų skriptas gali neįvykdyti darbo, jei nustatysite per daug (pvz. 1000 ar 0 – be limito) skriptas gali lūžti. Panaši funkcija yra CURLOPT_TIMEOUT, kuri nustato kiek curl užklausos galės būti vykdomos. Jei nustatysite per mažą reikšmę, gali būti nebaigtas darbas jei tam reikia daug laiko.

Paskutinė įdomi opcija - CURLOPT_USERAGENT, kuri leidžia nustatyti „user agent“. Tai leidžia jums kurti savo web vorus (web spiders) su savo user agent‘ais. Pavyzdžiui:

<?php 
 
// sukuriam curl saltini
$ch = curl_init();
 
// nustatom url ir kitas opcijas su curl_setopt
curl_setopt($ch, CURLOPT_URL, "http://www.useragent.org/");
curl_setopt($ch, CURLOPT_USERAGENT, 'mano user agent/0.1');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
 
// imam url ir spausdinam
curl_exec($ch);
 
?>

Dabar, kai peržiūrėjome pačias įdomiausias opcijas su curl_setopt(), patyrinėkim curl_getinfo() funkciją ir kuo ji gali mums pasitarnauti.

Gauname informaciją apie puslapį

curl_getinfo() funkcija naudojama gauti įvairią informaciją apie peržiūrėtą puslapį. Jūs galite nustatyti kokią tiksliai informaciją norite gauti nustatant antrą argumentą arba tiesiog paliekate tik vieną nustatymą ir gaunate visą informaciją į array. Štai pavyzdys:

<?php 
 
// sukuriam curl saltini 
$ch = curl_init();
 
// nustatom url ir kitas opcijas su curl_setopt
curl_setopt($ch, CURLOPT_URL, "http://www.google.lt");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FILETIME, true);
 
// imam url ir perduodam kam reikia turini
$output = curl_exec($ch);
 
// Spausdinam visa informacija
print_r (curl_getinfo($ch));
 
?>

Tai tiek apie curl_getinfo(), dabar pakalbėkim apie praktinį curl panaudojimą.

Praktinis naudojimas

Pirmasis naudingas dalykėlis curl bibliotekoj yra galimybė ar puslapis egzistuoja. Taigi, pažiūrime puslapį ir patikriname atsakymo kodą (’response code’) (404 = nerasta, puslapis neegzistuoja). Pavyzdukas:

<?php 
 
// sukuriam curl saltini 
$ch = curl_init();
 
// nustatom url ir kitas opcijas su curl_setopt
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/does/not/exist");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
//  imam url ir perduodam kam reikia turini
$output = curl_exec($ch);
 
// Gaunam response koda
$response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
 
// Nerasta?
if ($response_code == '404') {
        echo 'Puslapis neegzistuoja :p';
} else {
        echo $output;
}
 
?>

(demo – http://pixel.lt/texts/sources/curl_getinfo.php)
(source – http://pixel.lt/texts/sources/curl_getinfo.phps)

Taip galime sukurti automatinę nuorodų tvarkyklę, kuri pasiims puslapį ir pažiūrės ar jis egzistuoja ar ne (pasinaudojant pateiktu kodu aukščiau).

Su Curl jūs taip pat galit pasirašyt savo web voriuką (spider), panašų į Google web spider, ar bet kokį kita web vorą. Kadangi čia straipsnis ne apie web vorus, tad šią temą ir baikim, plačiau apie juos kada nors vėliau parašysiu.

Pabaiga

Šiame straipsnyje parodžiau kaip naudoti CURL biblioteką ir paaiškinau keletą svarbiausių jos funkcijų.

Pagrindinėms užduotims, kaip pvz tiesiog puslapio parsisiuntimas, jums tikriausiai curl neprireiks. Tačiau darant ką nors labiau ‘advanced’ jūs tikriausiai jį naudosite.

Taigi netolimoje ateityje laukite straipsnio, kaip pasigaminti savo web voriuką, panašų į Google voriuką, tad nepamirškit sekti Pixel.lt naujienas.

Jei turit klausimų ar komentarų, prašome komentuoti žemiau arba rašyti aurelijus@astdev.lt

Panašūs straipsniai


“Naudojam CURL” komentarų: 8

  1. TominiX

    Is ties idomus straipsniukas, tik butu dar geriau jai parasytum dar daugiau.. :D
    Be to cURL tikrai lengviau uz socketus.. :)

  2. mant0x

    tikrai naudingas straipsniukas ;)

  3. Mantas

    Neveikia pavyzdžiai

  4. imsas

    Na, jis gali tarnauti ir nevien tik kaip spider. Jį galima priversti veikti kaip web clientą. Vartotojas gauna tik index.php u jungiasi prie web serviso is kurio gauna pagal jo access duomenis :) taip galima valdyti visa TVS sistema :P Na aisku tokie dalykai, jau seniai relizuoti, taip pogi ir mano, bet cia tiems kas neturi skill :D

  5. BFW

    beje, jei norime tiesiog patikrinti, ar veikia tam tikra nuoroda - galime nustatyti CURLOPT_NOBODY nuostatą. tuomet vietoje GET HTTP užklausos bus siunčiama HEAD užklausa. taip galima šiek tiek sutaupyti tinklo srauto ;)

    geras straipsnis!

  6. ixas

    Dar su juo galima padaryt flooderi aisku beveik wisur jau yra nuo to apsaugos, bet primityviuose tinklapiuose imanoma.. :)

  7. Vilius
  8. Istiktukas

    ir viskas paimta is php.net :)

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.