Hajde da usavršimo svoje veštine u radu sa cURL-om. PHP CURL - Funkcije i primjeri upotrebe Često korištene CURL funkcije i konstante

c URL je vrlo koristan alat komandne linije za prijenos podataka sa ili na server. Curl podržava različite protokole kao što su FILE, HTTP, HTTPS, IMAP, IMAPS, LDAP, DICT, LDAPS, TELNET, FTPS, GOPHER, RTMP, RTSP, SCP, SFTP, POP3, POP3S, SMB, SMBS, SMTP, SMTPS i TFTP .

cURL se može koristiti na razne različite i zanimljive načine. Pomoću ovog alata možete preuzimati, otpremati i upravljati datotekama, provjeriti svoju adresu e-pošte ili čak ažurirati svoj status na nekim web stranicama društvenih medija ili provjeriti vrijeme napolju. U ovom članku ćemo pogledati pet najkorisnijih i osnovnih upotreba alata cURL na bilo kojoj .

1. Provjerite URL

Jedna od najčešćih i najjednostavnijih upotreba cURL-a je ispisivanje same naredbe praćene URL-om koji želite testirati

Curl https://domain.ru

Ova komanda će prikazati sadržaj URL-a na vašem terminalu

2. Sačuvajte URL izlaz u datoteku

Curl -o web stranica https://domain.ru % Ukupno % primljenih % Xferd Prosječna Brzina Vrijeme Vrijeme Vrijeme Trenutno Dload Upload Ukupno utrošeno lijevo Brzina 100 41793 0 41793 0 0 275k 0 --:--:-- - -:-- :-- --:--:-- 2.9M

U ovom primjeru, izlaz će biti spremljen u datoteku pod nazivom 'website' u trenutnom radnom direktoriju.

3. Učitavanje datoteka koristeći Curl

Možete preuzeti datoteke koristeći Curl dodavanjem opcije -o naredbi. Koristi se za spremanje datoteka na lokalnom serveru sa istim imenima kao na udaljenom serveru

Curl -O https://domain.ru/file.zip

U ovom primjeru, arhiva 'file.zip' će biti preuzeta u trenutni radni direktorij.

Također možete otpremiti datoteku s drugim imenom dodavanjem opcije -o u cURL.

Curl -o archive.zip https://domain.ru/file.zip

Tako će arhiva 'file.zip' biti preuzeta i sačuvana kao 'Archive.zip'.

cURL se također može koristiti za preuzimanje više datoteka odjednom, kao što je prikazano u primjeru ispod

Curl -O https://domain.ru/file.zip -O https://domain.com/file2.zip

Curl se također može koristiti za siguran prijenos datoteka preko SSH-a pomoću sljedeće naredbe

Curl -u korisnik sftp://server.domain.ru/path/to/file

Imajte na umu da morate koristiti punu putanju do datoteke koju želite preuzeti

4. Uzmite informacije iz HTTP zaglavlja web stranice

Možete lako dobiti informacije o HTTP zaglavlju sa bilo koje web stranice dodavanjem opcije -I ('i') u cURL.

Curl -I http://domain.ru HTTP/1.1 200 OK Datum: ned, 16. oktobar 2016. 23:37:15 GMT Server: Apache/2.4.23 (Unix) X-Powered-By: PHP/5.6.24 Veza : zatvori Content-Type: text/html; charset=UTF-8

5. Pristup FTP serveru

Da biste pristupili FTP serveru koristeći Curl, trebate koristiti sljedeću naredbu

Curl ftp://ftp.domain.ru -- korisničko ime: lozinka

Curl će se povezati na FTP server i izlistati sve datoteke i direktorije u korisničkom kućnom direktoriju

Možete preuzeti fajl koristeći FTP

Curl ftp://ftp.domain.ru/file.zip -- korisničko ime: lozinka

i prenesite datoteku na FTP server

Curl -T file.zip ftp://ftp.domain.ru/ --korisničko ime: lozinka

Curl stranicu možete provjeriti ručno da vidite sve dostupne cURL opcije i njegovu funkcionalnost

Man curl

PS. Ako vam se svidjela ova objava, podijelite je sa svojim prijateljima na društvenim mrežama koristeći dugmad ispod ili jednostavno ostavite komentar. Hvala ti.

Pravi praktičan primjer: potrebno je ponovo pokrenuti ruter (modem) da biste promijenili IP adresu. Da biste to učinili, morate se: prijaviti na ruter, otići na stranicu za održavanje i kliknuti na dugme „Ponovo pokreni“. Ako ovu radnju treba izvesti nekoliko puta, onda se postupak mora ponoviti. Slažete se, ne želite da radite ovu rutinu svaki put ručno. cURL vam omogućava da sve ovo automatizujete. Sa samo nekoliko cURL naredbi možete postići autorizaciju i završiti zadatak na ruteru.

  • cURL je koristan za preuzimanje podataka sa web stranica na komandnoj liniji.
Još jedan praktičan primjer: želimo da implementiramo prikaz opšte statistike za nekoliko sajtova. Ako koristimo cURL, onda ovo postaje potpuno trivijalan zadatak: pomoću cURL-a se autentifikujemo na usluzi prikupljanja statistike (ako je potrebno), zatim (opet pomoću cURL komandi) dobijamo potrebne stranice, analiziramo podatke koji su nam potrebni; postupak se ponavlja za sve naše stranice, zatim dodajemo i prikazujemo konačni rezultat.

One. slučajevi korišćenja cURL-a su sasvim realni, iako je u većini slučajeva cURL potreban programerima koji ga koriste za svoje programe.

CURL podržava mnoge protokole i metode autorizacije, može prenositi datoteke, ispravno radi s kolačićima, podržava SSL certifikate, proksije i još mnogo toga.

cURL u PHP-u i komandnoj liniji

CURL možemo koristiti na dva glavna načina: u PHP skriptama i na komandnoj liniji.

Da biste omogućili cURL u PHP-u na serveru, morate dekomentirati red u datoteci php.ini

Extension=php_curl.dll

A zatim ponovo pokrenite server.

Na Linuxu morate instalirati curl paket.

Na Debianu, Ubuntu ili Linux Mintu:

$ sudo apt-get install curl


Na Fedora, CentOS ili RHEL:

$ sudo yum install curl

Da bismo jasno uočili razliku u upotrebi u PHP-u i na komandnoj liniji, izvršićemo iste zadatke dvaput: prvo u PHP skripti, a zatim na komandnoj liniji. Pokušajmo da se ne zbunimo.

Preuzimanje podataka pomoću cURL-a

Preuzimanje podataka koristeći cURL u PHP-u

Primjer u PHP-u:

Sve je vrlo jednostavno:
$target_url- adresa stranice koja nas zanima. Nakon adrese stranice možete staviti dvotočku i dodati adresu porta (ako se port razlikuje od standardnog).

curl_init- inicijalizira novu sesiju i vraća ručku, koja je u našem primjeru dodijeljena varijabli $ch.

Zatim izvršavamo zahtjev sa funkcijom cURL curl_exec, kojem se deskriptor prosljeđuje kao parametar.

Sve je vrlo logično, ali kada se ova skripta izvrši, sadržaj stranice će biti prikazan na našoj stranici. Ali šta ako ne želimo prikazati sadržaj, već ga želimo zapisati u varijablu (za naknadnu obradu ili raščlanjivanje).

Dodajmo malo našoj skripti:

0) ( echo "Curl error: " . curl_error($ch); ) curl_close($ch); ?>

Imamo liniju curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);.

curl_setopt- postavlja opcije. Kompletnu listu opcija možete pronaći na ovoj stranici:

Skriveno od gostiju

$response_data = curl_exec($ch);

Sada je vrijednost skripte dodijeljena varijabli $response_data, s kojom se mogu izvršiti daljnje operacije. Na primjer, možete prikazati njegov sadržaj.

Šavovi

If (curl_errno($ch) > 0) ( echo "Curl error: " . curl_error($ch); )

služe za otklanjanje grešaka u slučaju da dođe do greške.

Preuzimanje podataka pomoću cURL-a na komandnoj liniji

U komandnoj liniji samo ukucajte

gde umesto mi-al.ru- adresu Vaše web stranice.

Ako trebate kopirati podatke u varijablu umjesto da prikažete rezultat na ekranu, učinite ovo:

Temp="curl mi-al.ru"

Međutim, neki podaci se i dalje prikazuju:

Da biste spriječili njihovo prikazivanje, dodajte ključ -s:

Temp="curl -s mi-al.ru"

Možete pogledati šta je snimljeno:

Echo $temp | manje

Osnovna i HTTP autentifikacija

Autentifikacija, jednostavno rečeno, je unos korisničkog imena i lozinke.

Osnovna provjera autentičnosti je autentifikacija zasnovana na serveru. Za to se kreiraju dva fajla: .htaccess I .htpasswd

Sadržaj .htaccess datoteke je otprilike ovako

AuthName "Samo za registrovane korisnike!" AuthType Basic zahtijeva validan korisnik AuthUserFile /home/freeforum.biz/htdocs/.htpassw


Sadržaj .htpasswd datoteke je otprilike ovako:

Mial:CRdiI.ZrZQRRc

One. heš za prijavu i lozinku.

Kada pokušate pristupiti folderu zaštićenom lozinkom, pretraživač će prikazati nešto poput ovoga:

HTTP autentifikacija je slučaj kada unesemo login i lozinku u obrazac na web stranici. Ova autentifikacija se koristi prilikom prijavljivanja na poštu, forume itd.

Osnovna cURL autentifikacija (PHP)

Postoji web stranica

Skriveno od gostiju

Isprobajmo našu početnu skriptu:

0) ( echo "Curl error: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?>

Iako skripta vjeruje da nema greške, izlaz nam se uopće ne sviđa:

Dodajte dva reda:

Curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "ru-board:ru-board");

U prvom redu postavljamo tip autentifikacije - osnovni. Drugi red sadrži ime i lozinku odvojene dvotočkom (u našem slučaju ime i lozinka su isti - ru-board). Ispalo je ovako:

0) ( echo "Curl error: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?> Pokušajmo: 30946 Odlično! Osnovna cURL autentifikacija (na komandnoj liniji) Ista stvar se može postići na komandnoj liniji sa jednom linijom: curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/

Nisam zaboravio da navedem tip autentifikacije, samo što je u cURL osnovni tip autentifikacije podrazumevani.

Sve je ispalo tako brzo na komandnoj liniji da sam iz frustracije napisao sljedeći program. Ona se povezuje na stranicu i preuzima najnovije ažuriranje:

Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o "Ažuriraj_FED_201(1).(2).(2).7z" | uniq | rep -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp

Uz još samo nekoliko naredbi možete dodati:

  • raspakivanje arhive u navedeni direktorij;
  • pokretanje ConsultantPlus ažuriranja (ovo su ažuriranja za njega);
  • možete provjeriti da li je posljednje dostupno ažuriranje već preuzeto ili se pojavilo novo;
  • dodajte sve u Cron za svakodnevna ažuriranja.
HTTP autentikacija cURL

HTTP cURL autentifikacija u PHP-u

moramo znati:

  • adresa na koju se šalju podaci za autentifikaciju
  • način slanja GET ili POST
  • Ulogovati se
  • lozinka
Ponekad ti podaci nisu dovoljni. Hajde da to shvatimo.

Adresa na koju trebate poslati podatke možete preuzeti iz obrasca za autentifikaciju. Na primjer:

Gledamo nekretninu akcija. One. poslednja stranica je login.php. Treba nam puna adresa, ovako

Skriveno od gostiju

Ovdje nalazimo i način slanja: method="post"

Znam i login i lozinku: admin i qwerasdfzxcv
One. Niz se šalje serveru iz obrasca pomoću POST metode. Teoretski, naša prethodna skripta, kojoj smo dodali novu liniju, trebala bi funkcionirati. One. autentifikacija se mora dogoditi.

0) ( echo "Curl error: " . curl_error($ch); ) else () curl_close($ch); ?>

Nova linija u skripti

curl_setopt($ch, CURLOPT_POSTFIELDS, "LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv");

Evo curl_setopt- funkcija koja nam je već poznata za postavljanje opcija za cURL, CURLOPT_POSTFIELDS- ovo je naziv opcije koju postavljamo. CURLOPT_POSTFIELDS sadrži sve podatke koji se prenose POST metodom. Pa, sama linija LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv- ovo su isti podaci koje prenosimo.

Ako pažljivo pregledate obrazac, vidjet ćete da sadrži i skrivena polja. I podaci se mogu obraditi ili dopuniti JavaScript-om. Sve ovo možete proučiti, ali ja više volim jednostavniju metodu.

Koristim Wireshark. Ovaj program je dizajniran za njušenje (presretanje) saobraćaja. I upravo u njemu je vrlo zgodno vidjeti šta se tačno prenosi na stranicu.

Pogledajte ovaj mali video:


One. sa adresom na koju se podaci prenose, dobro sam pogodio. No, ispostavilo se da je preneseni niz mnogo složeniji.

Unio sam ispravan parametar, a također sam malo izmijenio skriptu tako da se ne samo prijavljuje, već i prima nešto od rutera:

0) ( echo "Greška curl: " . curl_error($ch); ) else ( $target_url2 = "http://188.35.8.64:8080/bsc_wlan.php"; $ch2 = curl_init($target_url2); curl_setopt($ ch2, CURLOPT_RETURNTRANSFER, $response_data2 = curl_exec("|f.ssid.value = "(.*)";|", $response_data2, $results2); , "", $results2 = str_replace("";", "", $results2); echo "Naziv Wi-Fi mreže:); $results2
"; preg_match("|f_wpa.wpapsk1.value(.*)";|", $response_data2, $results3); $results3 = str_replace("f_wpa.wpapsk1.value", "", $results3); $results3 = str_replace("="", "", $results3); $results3 = str_replace("";", "", $results3); echo "Lozinka za Wi-Fi mrežu: $results3"; ) curl_close($ch); ?>

Usput, ako vlasnik ažurira lozinku (ali ne ažurira firmver), tada se nova lozinka uvijek može pogledati na

Skriveno od gostiju

(Ovo je dobro poznata ranjivost u D-Link DIR-300, D-Link DIR-320 i D-Link DAP-1353 ruterima).

HTTP cURL autentifikacija na komandnoj liniji

Već znamo punu adresu, kao i niz koji se prenosi. Dakle, jednostavno je:

Curl --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php

Mislim da je sve jasno, pošto smo ove rokove već razmotrili. Ako nekome nije jasno neka pita u komentarima.

Primjer korištenja cURL-a za dohvaćanje i raščlanjivanje podataka bio bi sljedeći skup naredbi:

Curl -s --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/nulle &&nn > " && echo "Naziv Wi-Fi mreže" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f.ssid.value = "(.)*";" | sed "s/f.ssid.value = "//" | sed "s/";//" && echo "lozinka za Wi-Fi mrežu" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f_wpa.wpapsk1.(.)*";" | sed "s/f_wpa.wpapsk1.value//" | sed "s/";//" | sed "s/="//"

Ispravnije bi bilo napisati ovaj naslov na sljedeći način: „Složeni” slučajevi autorizacije. One. Stavite riječ "komplikovano" pod navodnike. Djeluju komplikovano samo na prvi pogled, kada nije jasno: gdje se šalje, koja su imena polja, šta se tačno šalje itd.

Ali, u stvari, svi se svode na POST ili GET metode. Da biste razumeli šta se tačno šalje, možete da sačuvate stranicu sa formularom na svoj disk i dodate funkciju za prikaz generisanih podataka za slanje dugmetu za slanje. Ili još jednostavnije - kao ja, Wireshark.

Ako su podaci točni, ali autentifikacija ne dolazi, onda morate kopati u sljedećim smjerovima:

  • postavite ispravan niz upućivača
  • postavite "ispravan" niz korisničkog agenta.
Sve ovo se može uraditi pomoću osnovnih cURL metoda, ali neću ulaziti u to. Lekcija je već bila dovoljno duga, ali želeo sam da pokažem i par trikova sa cURL-om.

Savjeti i trikovi cURL

cURL i primanje kolačića uz CURLOPT_COOKIEJAR

Mislim da je već jasno da cURL ispravno rukuje kolačićima - pohranjuje ih, koristi ih kada ih server zatraži, itd. Ali ponekad kolačiće treba sačuvati. Za ovo postoji opcija koja se zove CURLOPT_COOKIEJAR, ali je nije uvijek moguće koristiti. Tome je posvećen naš prvi trik.

Ponekad, zbog načina na koji je PHP konfigurisan na serveru, opcije kao što su CURLOPT_COOKIEJAR (omogućava vam da sačuvate primljene kolačiće u datoteku) i CURLOPT_COOKIEFILE (omogućava vam da koristite kolačiće iz datoteke) nisu nam dostupne. Jer kažu da koristeći ove opcije možemo ukrasti bilo koji fajl sa njihovog servera. Evo rješenja za ovaj problem:

1) Ne koristimo CURLOPT_FOLLOWLOCATION
2) Koristite curl_setopt($ch, CURLOPT_HEADER, 1)
3) Sakupite kolačiće iz zaglavlja ovako:

Preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $kolačići = implode(";", $rezultati);

4) Postavite ih koristeći curl_setopt($ch, CURLOPT_COOKIE, $cookies);

Drugi savjet. Od napadača se možemo pretvoriti u žrtve. Kako bismo izbjegli da postanemo žrtva napada čovjeka u sredini, radimo ovo.

Molimo vas, svi, prestanite postavljati CURLOPT_SSL_VERIFYPEER postavku na false ili 0. Ako vaša PHP instalacija nema ažurirani set root CA certifikata, preuzmite jedan sa curl web stranice i sačuvajte ga na svom serveru:

Skriveno od gostiju

Zatim postavite putanju u vašoj php.ini datoteci, na primjer na Windows-u:

Curl.cainfo=c:phpcacert.pem

Onemogućavanje CURLOPT_SSL_VERIFYPEER omogućava napad čovjeka u sredini (MITM), koji ne želimo!

Pa, posljednji savjet za danas. Jeste li znali da je moguć veliki broj asinhronih curl zahtjeva?

Za ovo možete koristiti curl_multi_init. Detalji i primjer koda u službenoj dokumentaciji

Skriveno od gostiju

Skriveno od gostiju


O cURL-u na komandnoj liniji

Skriveno od gostiju


Drugi deo cURL lekcije je takođe pripremljen za čitanje na ruskom: "".

cURL je poseban alat koji je dizajniran za prijenos datoteka i podataka koristeći URL sintaksu. Ova tehnologija podržava mnoge protokole kao što su HTTP, FTP, TELNET i mnoge druge. cURL je prvobitno dizajniran da bude alat za komandnu liniju. Na našu sreću, cURL biblioteka je podržana programskim jezikom PHP. U ovom članku ćemo se osvrnuti na neke od naprednih funkcija cURL-a, a dotaknuti ćemo se i praktične primjene stečenog znanja korištenjem PHP-a.

Zašto cURL?

U stvari, postoji dosta alternativnih načina za uzorkovanje sadržaja web stranice. U mnogim slučajevima, uglavnom zbog lijenosti, koristio sam jednostavne PHP funkcije umjesto cURL:

$content = file_get_contents("http://www.nettuts.com"); // ili $lines = file("http://www.nettuts.com"); // ili readfile("http://www.nettuts.com");

Međutim, ove funkcije nemaju praktički nikakvu fleksibilnost i sadrže ogroman broj nedostataka u pogledu rukovanja greškama itd. Osim toga, postoje određeni zadaci koje jednostavno ne možete postići sa ovim standardnim funkcijama: interakcija s kolačićima, autentifikacija, podnošenje obrasca, otpremanje datoteka itd.

cURL je moćna biblioteka koja podržava mnoge različite protokole, opcije i pruža detaljne informacije o URL zahtjevima.

Osnovna struktura

  • Inicijalizacija
  • Dodjela parametara
  • Izvršenje i dohvaćanje rezultata
  • Oslobađanje memorije

// 1. inicijalizacija $ch = curl_init(); // 2. specificirati parametre, uključujući url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. dobiti HTML kao rezultat $output = curl_exec($ch); // 4. zatvoriti vezu curl_close($ch);

Korak #2 (tj. pozivanje curl_setopt()) će biti razmatran mnogo više u ovom članku nego o svim ostalim koracima, jer U ovoj fazi se dešavaju sve najzanimljivije i najkorisnije stvari koje trebate znati. U cURL-u postoji ogroman broj različitih opcija koje se moraju specificirati da bi se URL zahtjev mogao konfigurirati na najpažljiviji način. Nećemo razmatrati cijelu listu, već ćemo se fokusirati samo na ono što smatram potrebnim i korisnim za ovu lekciju. Sve ostalo možete sami proučiti ako vas ova tema zanima.

Provjera greške

Osim toga, možete koristiti i uvjetne izraze da testirate da li je operacija uspješno završena:

// ... $output = curl_exec($ch); if ($output === FALSE) ( echo "cURL Greška: " . curl_error($ch); ) // ...

Ovdje vas molim da primijetite jednu vrlo važnu stvar: moramo koristiti “=== false” za poređenje, umjesto “== false”. Za one koji nisu upoznati, ovo će nam pomoći da razlikujemo prazan rezultat i logičku vrijednost false, što će ukazivati ​​na grešku.

Primanje informacija

Drugi dodatni korak je pribavljanje podataka o cURL zahtjevu nakon što je on izvršen.

// ... curl_exec($ch); $info = curl_getinfo($ch); echo "Uzeo". $info["total_time"] . "sekunde za url". $info["url"]; //...

Vraćeni niz sadrži sljedeće informacije:

  • "url"
  • "content_type"
  • "http_code"
  • “header_size”
  • “request_size”
  • "filetime"
  • “ssl_verify_result”
  • “redirect_count”
  • “ukupno_vrijeme”
  • “namelookup_time”
  • “connect_time”
  • “pretransfer_time”
  • “size_upload”
  • “size_download”
  • “speed_download”
  • “speed_upload”
  • “download_content_length”
  • “upload_content_length”
  • “starttransfer_time”
  • “redirect_time”

Detekcija preusmeravanja u zavisnosti od pretraživača

U ovom prvom primjeru, napisat ćemo kod koji može otkriti URL preusmjeravanja na osnovu različitih postavki pretraživača. Na primjer, neke web stranice preusmjeravaju pretraživače mobilnog telefona ili bilo kojeg drugog uređaja.

Koristit ćemo opciju CURLOPT_HTTPHEADER da definiramo naša odlazna HTTP zaglavlja, uključujući ime korisnika u pretraživaču i dostupne jezike. Na kraju ćemo moći odrediti koje nas web lokacije preusmjeravaju na različite URL-ove.

// testirati URL $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // testiranje pretraživača $browsers = array("standard" => array ("user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5) .6 (.NET CLR 3.5.30729)", "language" => "en-us,en;q=0.5"), "iphone" => niz ("user_agent" => "Mozilla/5.0 (iPhone; U CPU poput Mac OS X en) AppleWebKit/420+ (KHTML, kao Gecko) Verzija/3.0 Mobile/1A537a Safari/419.3", "jezik" => "en"), "francuski" => niz ("user_agent"; => "Mozilla/4.0 (kompatibilan; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "language" => "fr,fr-FR;q=0.5")); foreach ($urls kao $url) ( echo "URL: $url\n"; foreach ($preglednici kao $test_name => $browser) ( $ch = curl_init(); // specificirajte url curl_setopt($ch, CURLOPT_URL , $url // specificirajte zaglavlja za pretraživač curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Prihvati-Jezik: ($browser["language"]); )" )); // ne treba nam sadržaj stranice curl_setopt($ch, CURLOPT_NOBODY, 1); // trebamo dobiti HTTP zaglavlja curl_setopt($ch, CURLOPT_HEADER, 1); // vraća rezultate umjesto izlaza curl_setopt($ch, CURLOPT_RETURNTRANSFER, $output = curl_close($ch) da li je bilo HTTP preusmjeravanja("!Location: (.*)!"); , $matches) ( echo " $test_name: preusmjerava na $matches\n"; ) else ( echo "$test_name: nema preusmjeravanja\n"; ) ) echo "\n\n";

Prvo navodimo listu URL-ova web lokacija koje ćemo provjeriti. Tačnije, trebat će nam adrese ovih lokacija. Zatim moramo definirati postavke pretraživača za testiranje svakog od ovih URL-ova. Nakon toga ćemo koristiti petlju u kojoj ćemo proći kroz sve dobijene rezultate.

Trik koji koristimo u ovom primjeru za postavljanje cURL postavki će nam omogućiti da dobijemo ne sadržaj stranice, već samo HTTP zaglavlja (pohranjena u $output). Zatim, koristeći jednostavan regex, možemo utvrditi da li je string “Location:” bio prisutan u primljenim zaglavljima.

Kada pokrenete ovaj kod, trebali biste dobiti nešto poput ovoga:

Kreiranje POST zahtjeva za određeni URL

Prilikom formiranja GET zahtjeva, preneseni podaci se mogu proslijediti na URL putem „stringa upita“. Na primjer, kada pretražujete Google, pojam za pretraživanje se postavlja u adresnu traku novog URL-a:

Http://www.google.com/search?q=ruseller

Ne morate koristiti cURL da simulirate ovaj zahtjev. Ako vas lijenost potpuno savlada, koristite funkciju “file_get_contents()” da dobijete rezultat.

Ali stvar je u tome što neki HTML obrasci šalju POST zahtjeve. Podaci ovih obrazaca se prenose kroz tijelo HTTP zahtjeva, a ne kao u prethodnom slučaju. Na primjer, ako ste popunili obrazac na forumu i kliknuli na dugme za pretragu, tada će najvjerovatnije biti poslat POST zahtjev:

Http://codeigniter.com/forums/do_search/

Možemo napisati PHP skriptu koja može simulirati ovu vrstu URL zahtjeva. Prvo napravimo jednostavnu datoteku za prihvatanje i prikaz POST podataka. Nazovimo ga post_output.php:

Print_r($_POST);

Zatim kreiramo PHP skriptu da napravimo cURL zahtjev:

$url = "http://localhost/post_output.php"; $post_data = niz ("foo" => "bar", "query" => "Nettuts", "action" => "Pošalji"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // označava da imamo POST zahtjev curl_setopt($ch, CURLOPT_POST, 1); // dodaj varijable curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;

Kada pokrenete ovu skriptu trebalo bi da dobijete ovakav rezultat:

Dakle, POST zahtjev je poslan skripti post_output.php, koja zauzvrat daje superglobalni niz $_POST, čiji smo sadržaj dobili pomoću cURL-a.

Učitavanje fajla

Prvo, napravimo datoteku kako bismo je generirali i poslali u datoteku upload_output.php:

Print_r($_FILES);

A evo i koda skripte koji izvodi gornju funkcionalnost:

$url = "http://localhost/upload_output.php"; $post_data = niz ("foo" => "bar", // fajl za upload "upload" => "@C:/wamp/www/test.zip"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;

Kada želite da otpremite fajl, sve što treba da uradite je da ga prosledite kao normalnu promenljivu posta, kojoj prethodi simbol @. Kada pokrenete napisanu skriptu, dobit ćete sljedeći rezultat:

Višestruki cURL

Jedna od najvećih prednosti cURL-a je mogućnost stvaranja "više" cURL rukovalaca. Ovo vam omogućava da istovremeno i asinhrono otvorite vezu na više URL-ova.

U klasičnoj verziji cURL zahtjeva, izvršenje skripte je obustavljeno i čeka se završetak URL operacije zahtjeva, nakon čega skripta može nastaviti. Ako namjeravate komunicirati s cijelom gomilom URL-ova, to će dovesti do prilično značajnog ulaganja vremena, jer u klasičnoj verziji možete raditi samo s jednim URL-om odjednom. Međutim, ovu situaciju možemo ispraviti korištenjem posebnih rukovatelja.

Pogledajmo primjer koda koji sam uzeo sa php.net:

// kreiramo nekoliko cURL resursa $ch1 = curl_init(); $ch2 = curl_init(); // specificira URL i druge parametre curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); //kreirajte višestruki cURL rukovalac $mh = curl_multi_init(); //dodavanje nekoliko rukovaoca curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $active = null; //izvrši do ( $mrc ​​= curl_multi_exec($mh, $active); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc ​​== CURLM_OK) ( if (curl_multi_select($mh) != -1) ( uradi ( $mrc ​​= curl_multi_exec($mh, $active); ) while ($mrc == CURLM_CALL_MULTI_PERFORM ) ) //zatvaranje curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Ideja je da možete koristiti više cURL rukovalaca. Koristeći jednostavnu petlju, možete pratiti koji zahtjevi još nisu dovršeni.

U ovom primjeru postoje dvije glavne petlje. Prva do-while petlja poziva curl_multi_exec(). Ova funkcija se ne može blokirati. Radi najbrže što može i vraća status zahtjeva. Sve dok je vraćena vrijednost konstanta 'CURLM_CALL_MULTI_PERFORM', to znači da posao još nije završen (na primjer, http zaglavlja se trenutno šalju na URL); Zato nastavljamo provjeravati ovu povratnu vrijednost dok ne dobijemo drugačiji rezultat.

U sljedećoj petlji provjeravamo uvjet dok je varijabla $active = "true". To je drugi parametar funkcije curl_multi_exec(). Vrijednost ove varijable će biti "true" sve dok je bilo koja od postojećih promjena aktivna. Zatim pozivamo funkciju curl_multi_select(). Njegovo izvršenje je "blokirano" dok postoji barem jedna aktivna veza, sve dok se ne dobije odgovor. Kada se to dogodi, vraćamo se u glavnu petlju da nastavimo s izvršavanjem upita.

A sada da primijenimo ono što smo naučili na primjeru koji će mnogima biti zaista koristan.

Provjera veza u WordPress-u

Zamislite blog sa ogromnim brojem postova i poruka, od kojih svaka sadrži linkove na vanjske internetske resurse. Neki od ovih linkova možda su već mrtvi iz različitih razloga. Stranica je možda izbrisana ili stranica možda uopće ne radi.

Napravit ćemo skriptu koja će analizirati sve linkove i pronaći web stranice koje se ne učitavaju i 404 stranice, a zatim nam dostaviti detaljan izvještaj.

Odmah da kažem da ovo nije primjer kreiranja dodatka za WordPress. Ovo je apsolutno dobar poligon za naše testove.

Hajde da konačno počnemo. Prvo moramo preuzeti sve linkove iz baze podataka:

// konfiguracija $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "www.mydomain.com"); $max_connections = 10; // inicijalizacija varijabli $url_list = array(); $working_urls = array(); $dead_urls = niz(); $not_found_urls = niz(); $active = null; // povezivanje na MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Ne mogu se povezati: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Može not select db: " . mysql_error()); ) // odaberite sve objavljene postove koji imaju veze $q = "IZABIR post_content IZ wp_posts GDJE post_content KAO "%href=%" I post_status = "objavi" I post_type = "post " "; $r = mysql_query($q) ili die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // dohvati veze koristeći regularne izraze if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $ odgovara) ) ( foreach ($ odgovara kao $url) ( $tmp = parse_url($url); if (in_array($tmp["host"], $excluded_domains)) (nastavi; ) $url_list = $url; )) ) / / ukloni duplikate $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Nema URL za provjeru"); )

Prvo generišemo konfiguracione podatke za interakciju sa bazom podataka, zatim pišemo listu domena koji neće učestvovati u proveri ($excluded_domains). Također definiramo broj koji karakterizira broj maksimalnih istovremenih veza koje ćemo koristiti u našoj skripti ($max_connections). Zatim se pridružujemo bazi podataka, biramo postove koji sadrže veze i akumuliramo ih u niz ($url_list).

Sljedeći kod je malo komplikovan, pa ga prođite od početka do kraja:

// 1. višestruki rukovalac $mh = curl_multi_init(); // 2. dodati skup URL-ova za ($i = 0; $i< $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // 3. инициализация выполнения do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 4. основной цикл while ($active && $mrc == CURLM_OK) { // 5. если всё прошло успешно if (curl_multi_select($mh) != -1) { // 6. делаем дело do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 7. если есть инфа? if ($mhinfo = curl_multi_info_read($mh)) { // это значит, что запрос завершился // 8. извлекаем инфу $chinfo = curl_getinfo($mhinfo["handle"]); // 9. мёртвая ссылка? if (!$chinfo["http_code"]) { $dead_urls = $chinfo["url"]; // 10. 404? } else if ($chinfo["http_code"] == 404) { $not_found_urls = $chinfo["url"]; // 11. рабочая } else { $working_urls = $chinfo["url"]; } // 12. чистим за собой curl_multi_remove_handle($mh, $mhinfo["handle"]); // в случае зацикливания, закомментируйте данный вызов curl_close($mhinfo["handle"]); // 13. добавляем новый url и продолжаем работу if (add_url_to_multi_handle($mh, $url_list)) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } } } // 14. завершение curl_multi_close($mh); echo "==Dead URLs==\n"; echo implode("\n",$dead_urls) . "\n\n"; echo "==404 URLs==\n"; echo implode("\n",$not_found_urls) . "\n\n"; echo "==Working URLs==\n"; echo implode("\n",$working_urls); function add_url_to_multi_handle($mh, $url_list) { static $index = 0; // если у нас есть ещё url, которые нужно достать if ($url_list[$index]) { // новый curl обработчик $ch = curl_init(); // указываем url curl_setopt($ch, CURLOPT_URL, $url_list[$index]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_multi_add_handle($mh, $ch); // переходим на следующий url $index++; return true; } else { // добавление новых URL завершено return false; } }

Ovdje ću pokušati sve detaljno objasniti. Brojevi na listi odgovaraju brojevima u komentaru.

  1. 1. Kreirajte višestruki rukovalac;
  2. 2. Napisat ćemo funkciju add_url_to_multi_handle() malo kasnije. Svaki put kada se pozove, počinje obrada novog URL-a. U početku dodajemo 10 ($max_connections) URL-ova;
  3. 3. Za početak, moramo pokrenuti funkciju curl_multi_exec(). Sve dok vraća CURLM_CALL_MULTI_PERFORM, još uvijek imamo nešto da radimo. Ovo nam je potrebno uglavnom za stvaranje veza;
  4. 4. Zatim dolazi glavna petlja, koja će raditi sve dok imamo barem jednu aktivnu vezu;
  5. 5. curl_multi_select() visi čekajući da se URL pretraga završi;
  6. 6. Još jednom, moramo natjerati cURL da obavi neki posao, naime dohvati podatke povratnog odgovora;
  7. 7. Informacije su ovdje provjerene. Kao rezultat izvršavanja zahtjeva, niz će biti vraćen;
  8. 8. Vraćeni niz sadrži cURL rukovalac. Koristićemo ga za odabir informacija o zasebnom cURL zahtjevu;
  9. 9. Ako je veza mrtva ili je skripta istekla, onda ne bismo trebali tražiti nikakav http kod;
  10. 10. Ako nam je link vratio stranicu 404, onda će http kod sadržavati vrijednost 404;
  11. 11. Inače, pred nama je radna karika. (Možete dodati dodatne provjere za kod greške 500, itd...);
  12. 12. Zatim uklanjamo cURL rukovalac jer nam više nije potreban;
  13. 13. Sada možemo dodati još jedan url i pokrenuti sve o čemu smo ranije govorili;
  14. 14. U ovom koraku, skripta završava svoj rad. Možemo ukloniti sve što nam nije potrebno i napraviti izvještaj;
  15. 15. Konačno ćemo napisati funkciju koja će dodati url rukovatelju. Statička varijabla $index će se povećavati svaki put kada se ova funkcija pozove.

Koristio sam ovu skriptu na svom blogu (sa nekim pokvarenim linkovima koje sam dodao namjerno da je testiram) i dobio sam sljedeći rezultat:

U mom slučaju, skripti je trebalo nešto manje od 2 sekunde da pređe kroz 40 URL-ova. Povećanje performansi je značajno kada se radi sa još više URL-ova. Ako otvorite deset veza u isto vrijeme, skripta se može izvršiti deset puta brže.

Nekoliko riječi o drugim korisnim cURL opcijama

HTTP autentifikacija

Ako URL ima HTTP autentifikaciju, lako možete koristiti sljedeću skriptu:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // specificiramo korisničko ime i lozinku curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // ako je preusmjeravanje dozvoljeno curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // zatim spremamo naše podatke u cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);

FTP upload

PHP takođe ima biblioteku za rad sa FTP-om, ali ništa vas ne sprečava da ovde koristite cURL alate:

// otvorite datoteku $file = fopen("/path/to/file", "r"); // url bi trebao sadržavati sljedeći sadržaj $url = "ftp://username: [email protected]:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); curl_close($ch);

Korištenje proxyja

Svoj URL zahtjev možete izvršiti putem proxyja:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // odredimo adresu curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // ako trebate dati korisničko ime i lozinku curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); curl_close($ch);

Funkcije povratnog poziva

Također je moguće odrediti funkciju koja će se pokrenuti čak i prije nego što cURL zahtjev završi. Na primjer, dok se sadržaj odgovora učitava, možete početi koristiti podatke bez čekanja da se potpuno učitaju.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function"); curl_exec($ch); curl_close($ch); funkcija progress_function($ch,$str) ( echo $str; vrati strlen($str); )

Funkcija poput ove MORA vratiti dužinu stringa, što je uslov.

Zaključak

Danas smo naučili kako možete koristiti cURL biblioteku za svoje sebične svrhe. Nadam se da ste uživali u ovom članku.

Hvala ti! ugodan dan!

CURL je softverski paket koji se sastoji od uslužnog programa komandne linije i biblioteke za prijenos podataka korištenjem URL sintakse.

CURL podržava mnoge protokole, uključujući DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet i TFTP.

Otpremite zaseban fajl
Sljedeća naredba će dobiti sadržaj URL-a i prikazati ga na standardnom izlazu (tj. vašem terminalu).

Curl https://mi-al.ru/ > mi-al.htm % Ukupno % primljenih % Xferd Prosječna Brzina Vrijeme Vrijeme Vrijeme Trenutni Dload Upload Ukupno potrošeno lijevo Brzina 100 14378 0 14378 0 0 5387 0 --: --:- - 0:00:02 --:--:-- 5387

Čuvanje cURL izlaza u datoteku
Rezultat komande curl možemo sačuvati u datoteku koristeći -o/-O opcije.
  • -o(o malim slovima) rezultat će biti sačuvan u datoteci navedenoj u komandnoj liniji
  • -O(velika slova O) ime datoteke će biti preuzeto iz URL-a i koristit će se za spremanje primljenih podataka.

$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html

Gettext.html stranica će sada biti sačuvana u datoteci pod nazivom 'mygettext.html'. Kada se curl pokrene s opcijom -o, prikazuje traku toka preuzimanja na sljedeći način.

% Ukupno % primljenih % Xferd Prosječna brzina Vrijeme Vrijeme Trenutno Učitavanje Učitavanje Ukupno potrošeno lijevo Brzina 66 1215k 66 805k 0 0 33060 0 0:00:37 0:00:24 0:00:13 45900 100 10 15 0 0 39474 0 0:00:31 0:00:31 --:--:-- 68987

Kada koristite curl -O (velika slova O), on će sam spremiti sadržaj u datoteku pod nazivom 'gettext.html' na lokalnom stroju.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html

Napomena: Kada curl treba da upiše podatke na terminal, onemogućuje traku napretka kako bi se izbjegla zabuna s odštampanim podacima. Možemo koristiti opcije '>'|'-o'|'-O' za prijenos rezultata u datoteku.

Preuzimanje više datoteka odjednom
Možemo preuzeti više datoteka odjednom tako što ćemo navesti sve URL-ove u komandnoj liniji.

Curl -O URL1 -O URL2

Naredba ispod će preuzeti i index.html i gettext.html i spremiti ih pod istim imenima u trenutnom direktoriju.

Curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html

Imajte na umu da kada preuzmemo više datoteka sa istog servera kao što je prikazano gore, curl će pokušati ponovo iskoristiti vezu.

Pratite zaglavlja HTTP lokacije sa -L opcijom
Podrazumevano, CURL ne prati HTTP lokaciju u zaglavljima (preusmjeravanja). Kada se tražena web stranica premjesti na drugu lokaciju, odgovarajući odgovor će biti poslan u zaglavljima HTTP lokacije.
Na primjer, kada neko upiše google.com u svoj pretraživač iz svoje zemlje, automatski će biti preusmjeren na 'google.co.xx'. Ovo se radi na osnovu HTTP zaglavlja lokacije kao što je prikazano ispod.

Curl https://www.google.com/?gws_rd=ssl

302 Premješteno

302 Premješteno

Dokument je premješten ovdje.

Gornji izlaz kaže da je traženi dokument premješten u '

Skriveno od gostiju

.
Možete reći curl-u da prati preusmjeravanja, to se radi pomoću opcije -L kao što je prikazano ispod. Sada će se preuzeti html izvorni kod

Skriveno od gostiju

.

Curl -L https://www.google.com/?gws_rd=ssl

Obnavljanje prethodnog preuzimanja

Koristeći opciju -C možete nastaviti preuzimanje koje je iz nekog razloga zaustavljeno. Ovo će biti korisno kada preuzimanje velikih datoteka ne uspije.
Ako kažemo '-C -', curl će tražiti odakle da nastavi preuzimanje. Također možemo specificirati '-C<смещение>'. Navedeni pomak bajta bit će preskočen s početka izvorne datoteke.
Započnite veliko preuzimanje sa curl i pritisnite Ctrl-C da ga zaustavite usred preuzimanja.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html ############## 20,1%

Injekcija je zaustavljena na 20,1%. Koristeći “curl -C -” možemo nastaviti učitavanje od mjesta gdje smo stali. Sada će se preuzimanje nastaviti sa 20,1%.

Curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html ############### 21,1%

Ograničenje brzine prenosa podataka
Brzinu prijenosa podataka možete ograničiti opcijom –limit-rate. Maksimalnu brzinu možete proslijediti kao argument.

$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html

Gornja naredba će ograničiti brzinu prijenosa na 1000 bajtova/sekundi. curl može koristiti veće brzine u vrhuncima. Ali prosječna brzina će biti otprilike 1000 bajtova u sekundi.
Ispod je traka napretka za gornju komandu. Možete vidjeti da je trenutna brzina oko 1000 bajtova.

% Ukupno % primljenih % Xferd Prosječna brzina Vrijeme Vrijeme Trenutno Učitavanje Učitavanje Ukupno potrošeno lijevo Brzina 1 1215k 1 13601 0 0 957 0 0:21:40 0:00:14 0:21:26 999 1 1145k 0 1 0 0 960 0 0:21:36 0:00:15 0:21:21 999 1 1215k 1 15601 0 0 962 0 0:21:34 0:00:16 0:21:18 999

Učitajte datoteku samo ako je promijenjena prije/poslije određenog vremena
Možete dobiti datoteke koje su se promijenile nakon određenog vremena koristeći opciju -z u curl-u. Ovo će raditi i za FTP i za HTTP.

Gornja naredba će učitati yy.html samo ako je izmijenjena u skorije vrijeme od datog datuma i vremena.

Gornja naredba će učitati file.html ako je izmijenjena prije datog datuma i vremena. Upišite 'man curl_getdate' da saznate više o različitim podržanim sintaksama za izraze datuma.

Prolazak HTTP autentifikacije u cURL
Ponekad web stranice zahtijevaju korisničko ime i lozinku za pregled svog sadržaja. Koristeći opciju -u, možete proslijediti ove vjerodajnice sa cURL na web server kao što je prikazano ispod.

$ curl -u korisničko ime: lozinka URL

Napomena: Prema zadanim postavkama, curl koristi HTTP osnovnu autentifikaciju. Možemo postaviti druge metode provjere autentičnosti koristeći –ntlm | –svariti.


cURL se takođe može koristiti za preuzimanje datoteka sa FTP servera. Ako je navedena FTP staza direktorij, tada će se po defaultu prikazati lista datoteka u njemu.

$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php

Gornja komanda će preuzeti datoteku xss.php sa ftp servera i sačuvati je u lokalnom direktorijumu.

$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/

Ovdje se URL odnosi na direktorij. Prema tome, cURL će navesti datoteke i direktorije na datom URL-u.


CURL podržava opsege navedene u URL-ovima. Kada se zada raspon, bit će učitane odgovarajuće datoteke unutar tog raspona. Ovo će biti korisno kada preuzimate pakete sa FTP mirror lokacija.

$ curl ftp://ftp.uk.debian.org/debian/pool/main//

Gornja naredba će ispisati sve pakete u rasponu a-z u terminalu.

Učitavanje fajlova na FTP server
Curl se takođe može koristiti za upload na FTP server sa -T opcijom.

$ curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com

Gornja komanda će otpremiti datoteku pod nazivom myfile.txt na FTP server. Također možete otpremiti više datoteka odjednom koristeći opsege.

$ curl -u ftpuser:ftppass -T "(file1,file2)" ftp://ftp.testserver.com

Opciono možemo koristiti “.” za primanje sa standardnog ulaza i prosljeđivanje na udaljenu mašinu.

$ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

Gornja komanda će primiti izlaz od korisnika sa standardnog ulaza i pohraniti sadržaj na ftp server kao 'myfile_1.txt'.
Možete navesti '-T' za svaki URL, a svaki par adresa-datoteka će odrediti šta će gdje učitati

Više informacija s povećanom opširnošću i opcijom praćenja
Možete saznati šta se dešava koristeći opciju -v. Opcija -v omogućava verbalni način rada i ispisuje detalje.

Curl -v https://www.google.co.th/?gws_rd=ssl

Gornja naredba će dati sljedeće

* Ponovo izgrađen URL na: https://www.google.co.th/?gws_rd=ssl * Ime hosta NIJE pronađeno u DNS kešu * Pokušavam 27.123.17.49... * Povezano na www.google.co.th (27.123. 17.49) port 80 (#0) > GET / HTTP/1.1 > Korisnički agent: curl/7.38.0 > Host: www.google.co.th > Prihvati: */* >< HTTP/1.1 200 OK < Date: Fri, 14 Aug 2015 23:07:20 GMT < Expires: -1 < Cache-Control: private, max-age=0 < Content-Type: text/html; charset=windows-874 < P3P: CP="This is not a P3P policy! See https://support.google.com/accounts/answer/151657?hl=en for more info." * Server gws is not blacklisted < Server: gws < X-XSS-Protection: 1; mode=block < X-Frame-Options: SAMEORIGIN < Set-Cookie: PREF=ID=1111111111111111:FF=0:TM=1439593640:LM=1439593640:V=1:S=FfuoPPpKbyzTdJ6T; expires=Sun, 13-Aug-2017 23:07:20 GMT; path=/; domain=.google.co.th ... ... ...

Ako su vam potrebne detaljnije informacije, onda možete koristiti opciju –trace. Opcija –trace će omogućiti potpuni dump praćenja svih dolaznih/odlaznih podataka za datu datoteku

Predlažem da malo popričamo o PHP programskom jeziku, a posebno da se dotaknemo teme ekstenzija CURL, tj. mogućnost interakcije sa različitim serverima koristeći različite protokole iz same PHP skripte.

Prije nego počnemo gledati curl, želim da vas podsjetim da smo se već dotakli PHP jezika, na primjer, u materijalu o učitavanju u Excel u PHP-u ili mogućnosti autentifikacije u PHP-u, a sada razgovarajmo o mogućnosti šaljite zahtjeve PHP-u.

Šta je CURL?

CURL je biblioteka PHP funkcija koje se mogu koristiti za slanje zahtjeva, kao što je HTTP, iz PHP skripte. CURL podržava protokole kao što su HTTP, HTTPS, FTP i druge. Možete slati HTTP zahtjeve koristeći metode GET, POST i PUT.

CURL može biti koristan u slučajevima kada trebate pozvati udaljenu skriptu i dobiti rezultat ili jednostavno spremiti HTML kod pozvane stranice, općenito, svako može pronaći svoju upotrebu, ali poenta je da možete slati zahtjeve dok skripta trči.

Povezivanje CURL biblioteke u PHP-u

Da biste koristili CURL biblioteku, morate je u skladu s tim povezati.

Bilješka! Kao primer, koristićemo PHP 5.4.39 na Windows 7, a koristićemo Apache 2.2.22 kao Web server.

Prva stvar koju treba da uradite je da kopirate biblioteke ssleay32.dll, libeay32.dll, libssh2.dll nalaze se u direktoriju sa PHP-om, u Windows sistemskom direktoriju, odnosno u C:\Windows\System32.

Zatim povežite biblioteku php_curl.dll na php.ini, tj. dekomentirajte sljedeći red

Biblioteka nije povezana

;extension=php_curl.dll

Biblioteka povezana

Extension=php_curl.dll

To je to, ponovo pokrenite Apache, pozovite funkciju phpinfo() i ako je veza uspješna, trebali biste imati curl sekciju


Ako ga nema, onda to znači samo jedno: biblioteka se nije učitala, najčešći razlog za to je taj što gore navedeni DLL-ovi nisu kopirani u sistemski direktorij Windows.

Primjer CURL - traženje udaljene stranice za prikaz na ekranu

U ovom primjeru, jednostavno ćemo zatražiti udaljenu stranicu putem HTTP-a koristeći GET metodu i prikazati njen sadržaj na ekranu.

Imamo test direktorij u kojem se nalaze 2 PHP fajla: test_curl.php i test.php, gdje je test_curl.php skripta gdje ćemo koristiti curl, a test.php udaljena skripta koju ćemo pozvati. Detaljno sam komentarisao kod.

Kod test_curl.php

Code test.php

Naslov 1"; prekid; slučaj 2: eho "<Н2>Naslov 2"; prekid; slučaj 3: eho "<Н3>Naslov 3"; prekid; ) ) ?>

Kao rezultat toga, ako pokrenete test_curl.php, vidjet ćete poruku “Heading 1” na ekranu, možete eksperimentirati sa prosljeđivanjem id parametara ( u ovom slučaju 2 ili 3).

CURL primjer - pozivanje udaljene skripte i dobivanje rezultata

Pokušajmo sada pozvati skriptu i dobiti rezultat, kako bismo je kasnije obrađivali, na primjer, upotrijebimo metodu POST. Ostavimo imena fajlova ista.

Kod test_curl.php

Code test.php

A ako pokrenemo test_curl.php, onda će na ekranu biti prikazano 111, tj. 1.11 dobiveno kao rezultat pristupa udaljenoj skripti, pomnoženo sa 100.

Sada razgovarajmo o funkcijama i njihovim konstantama.

Često korištene CURL funkcije i konstante

  • curl_init - Inicijalizira sesiju;
  • curl_close - Zatvara sesiju;
  • curl_exec - Izvršava zahtjev;
  • curl_errno - Vraća kod greške;
  • curl_setopt - Postavlja parametar za sesiju, na primjer:
    • CURLOPT_HEADER – vrijednost 1 znači da treba vratiti zaglavlja;
    • CURLOPT_INFILESIZE - parametar za određivanje očekivane veličine datoteke;
    • CURLOPT_VERBOSE - vrijednost 1 znači da će CURL prikazati detaljne poruke o svim izvršenim operacijama;
    • CURLOPT_NOPROGRESS – onemogućava indikator toka operacije, vrijednost 1;
    • CURLOPT_NOBODY – ako vam ne treba dokument, već su vam potrebna samo zaglavlja, onda postavite vrijednost na 1;
    • CURLOPT_UPLOAD - za upload fajla na server;
    • CURLOPT_POST – izvršiti zahtjev koristeći POST metodu;
    • CURLOPT_FTPLISTONLY — dobijanje liste fajlova u direktorijumu FTP servera, vrednost 1;
    • CURLOPT_PUT — izvršiti zahtjev koristeći metodu PUT, vrijednost 1;
    • CURLOPT_RETURNTRANSFER - vraća rezultat bez izlaza u pretraživač, vrijednost 1;
    • CURLOPT_TIMEOUT – maksimalno vrijeme izvršenja u sekundama;
    • CURLOPT_URL – određivanje adrese za kontakt;
    • CURLOPT_USERPWD - niz sa korisničkim imenom i lozinkom u obliku :;
    • CURLOPT_POSTFIELDS – podaci za POST zahtjev;
    • CURLOPT_REFERER - postavlja vrijednost HTTP zaglavlja “Referer:”;
    • CURLOPT_USERAGENT - postavlja vrijednost HTTP zaglavlja “User-Agent:”;
    • CURLOPT_COOKIE — sadržaj zaglavlja “Cookie:” koji će biti poslan uz HTTP zahtjev;
    • CURLOPT_SSLCERT - naziv datoteke sa certifikatom u PEM formatu;
    • CURLOPT_SSL_VERIFYPEER – vrijednost 0, kako bi se onemogućila verifikacija certifikata udaljenog servera (podrazumevano 1);
    • CURLOPT_SSLCERTPASSWD — lozinka za datoteku certifikata.
  • curl_getinfo - Vraća informacije o operaciji, drugi parametar može biti konstanta koja označava šta tačno treba prikazati, na primjer:
    • CURLINFO_EFFECTIVE_URL - posljednji korišteni URL;
    • CURLINFO_HTTP_CODE - zadnji primljeni HTTP kod;
    • CURLINFO_FILETIME — datum izmjene učitanog dokumenta;
    • CURLINFO_TOTAL_TIME — vrijeme izvršenja operacije u sekundama;
    • CURLINFO_NAMELOOKUP_TIME — vrijeme rješavanja imena servera u sekundama;
    • CURLINFO_CONNECT_TIME — vrijeme provedeno na uspostavljanju veze, u sekundama;
    • CURLINFO_PRETRANSFER_TIME — vrijeme proteklo od početka operacije do spremnosti za stvarni prijenos podataka, u sekundama;
    • CURLINFO_STARTTRANSFER_TIME — vrijeme proteklo od početka operacije do prijenosa prvog bajta podataka, u sekundama;
    • CURLINFO_REDIRECT_TIME — vrijeme utrošeno na preusmjeravanje, u sekundama;
    • CURLINFO_SIZE_UPLOAD - broj bajtova prilikom učitavanja;
    • CURLINFO_SIZE_DOWNLOAD - broj bajtova prilikom preuzimanja;
    • CURLINFO_SPEED_DOWNLOAD - prosječna brzina preuzimanja;
    • CURLINFO_SPEED_UPLOAD - prosječna brzina preuzimanja;
    • CURLINFO_HEADER_SIZE - ukupna veličina svih primljenih zaglavlja;
    • CURLINFO_REQUEST_SIZE - ukupna veličina svih poslatih zahtjeva;
    • CURLINFO_SSL_VERIFYRESULT - rezultat provjere SSL certifikata traženog postavljanjem parametra CURLOPT_SSL_VERIFYPEER;
    • CURLINFO_CONTENT_LENGTH_DOWNLOAD - veličina preuzetog dokumenta, očitana iz zaglavlja Content-Length;
    • CURLINFO_CONTENT_LENGTH_UPLOAD - veličina učitanih podataka;
    • CURLINFO_CONTENT_TYPE - sadržaj primljenog zaglavlja tipa sadržaja, ili NULL ako ovo zaglavlje nije primljeno.

Više o CURL funkcijama i konstantama za njih možete saznati na službenoj PHP web stranici -

Dijeli