Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Programi
  • Korištenje curl iz komandne linije. Učitavanje web datoteka iz komandne linije

Korištenje curl iz komandne linije. Učitavanje web datoteka iz komandne linije

c URL je vrlo koristan alat komandne linije za prijenos podataka na ili sa servera. 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 načine. na zanimljive načine... Pomoću ovog alata možete preuzimati, prenositi i upravljati datotekama, provjeriti svoju adresu e-pošte ili čak ažurirati svoj status na nekim web stranicama. društvenim medijima ili provjerite kakvo je vrijeme napolju. U ovom članku ćemo pokriti pet najkorisnijih i najosnovnijih upotreba cURL alata za svakoga.

1. Provjerite URL

Jedna od najčešćih i najjednostavnijih upotreba cURL-a je ispisivanje same naredbe, a zatim URL-a koji želite provjeriti

Curl https://domain.ru

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

2. Sačuvajte izlazni URL u datoteku

Curl -o web stranica https://domain.ru% Ukupno% primljenih% Xferd Prosječna brzina Vrijeme Vrijeme Vrijeme Trenutno preuzimanje 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 fajlova sa Curl

Možete preuzeti datoteke koristeći Curl dodavanjem opcije -o naredbi. Koristi se za spremanje datoteka u lokalni server 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 učitati 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 u isto vrijeme, 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 sigurno učitavanje 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

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

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

5. Pristup FTP serveru

Za pristup FTP serveru koristeći Curl, koristite 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 otpremite datoteku na FTP server

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

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

Man curl

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

Često moramo da preuzimamo razne datoteke sa interneta, npr. izvršne datoteke programe, datoteke skripta, izvorne arhive. Ali to ne mora uvijek biti urađeno preko pretraživača. U mnogim situacijama mnogo je lakše izvršiti sve radnje preko terminala. Jer na ovaj način možete automatizirati proces. S druge strane, webmasteri moraju s vremena na vrijeme testirati pristupačnost web stranice, provjeravati poslana i primljena zaglavlja i još mnogo toga.

Da biste riješili takve probleme i zadatke sličnog kruga, možete koristiti uslužni program curl. Omogućuje vam rješavanje mnogo šireg spektra zadataka, uključujući čak i imitaciju radnji korisnika na stranici. U ovom članku ćemo pogledati kako koristiti curl, šta je to i zašto je ovaj program potreban.

U stvari, curl je više od samo uslužnog programa komandne linije za Linux ili Windows. Ovo je skup biblioteka koje implementiraju osnovnu funkcionalnost rada sa njima URL stranice i prijenos datoteka. Biblioteka podržava sledeće protokole: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, kao i POP3, IMAP i SMTP. Odličan je za simulaciju radnji korisnika na stranicama i drugih URL operacija.

Podrška Curl biblioteke je dodana mnogima različitim jezicima programiranje i platforme. Uslužni program curl je nezavisni omot oko ove biblioteke. Upravo na ovaj uslužni program ćemo se fokusirati u ovom članku.

Curl komanda

Prije nego pređemo na opis načina na koji se može koristiti curl linux komanda, pogledajmo sam uslužni program i njegove glavne opcije koje su nam potrebne. Sintaksa uslužnog programa je vrlo jednostavna:

$ veza sa opcijama curl

Pogledajmo sada glavne opcije:

  • -# - prikaz jednostavne trake napretka tokom učitavanja;
  • -0 - koristiti http 1.0 protokol;
  • -1 - koristiti tlsv1 protokol za šifriranje;
  • -2 - koristite sslv2;
  • -3 - koristite sslv3;
  • -4 - koristiti ipv4;
  • -6 - koristiti ipv6;
  • -A- navedite vašeg USER_AGENT;
  • -b- sačuvati kolačić u datoteku;
  • -c- poslati kolačić na server iz datoteke;
  • -C- nastaviti učitavanje datoteke od tačke prekida ili navedenog pomaka;
  • -m - maksimalno vrijemečekanje odgovora od servera;
  • -d- slanje podataka POST metodom;
  • -D- sačuvati zaglavlja koje je server vratio u datoteku;
  • -e- postavite polje Referer-uri, označava sa kojeg sajta je korisnik došao;
  • -E- koristiti eksterni SSL certifikat;
  • -f- ne prikazuju poruke o greškama;
  • -F- slanje podataka u obliku obrasca;
  • -G- ako je ova opcija omogućena, tada će svi podaci navedeni u opciji -d biti prebačeni metodom GET;
  • -H- transfer zaglavlja na server;
  • -Ja- primati samo HTTP zaglavlje, a zanemariti cijeli sadržaj stranice;
  • -j- čitanje i slanje kolačića iz datoteke;
  • -J- ukloniti zaglavlje iz zahtjeva;
  • -L- prihvataju i obrađuju preusmjeravanja;
  • -s - maksimalni iznos preusmjerava koristeći lokaciju;
  • -o- izlaz sadržaja stranice u datoteku;
  • -O- sačuvati sadržaj u datoteku sa imenom stranice ili datoteke na serveru;
  • -p- koristiti proxy;
  • --proto- naznačiti protokol koji će se koristiti;
  • -R- uštedjeti vrijeme zadnja promjena izbrisana datoteka;
  • -s- prikazati minimum informacija o greškama;
  • -S- prikaz poruka o greškama;
  • -T- uploadati datoteku na server;
  • -v- najdetaljniji rezultat;
  • -y - minimalna brzina preuzimanja;
  • -Y- maksimalna brzina preuzimanja;
  • -z- preuzmite datoteku samo ako je izmijenjena kasnije od navedenog vremena;
  • -V- prikazati verziju.

Ovo nisu sve curl linux opcije, ali evo svih osnovnih koje ćete morati da koristite.

Kako da koristim curl?

Pokrili smo sve što se tiče teorije rada sa uslužnim programom curl, sada je vrijeme da pređemo na praksu i razmotrimo primjere komande curl.

Najviše čest zadatak- to . Veoma je lako preuzeti fajl. Da biste to učinili, dovoljno je proslediti naziv datoteke ili html stranicu uslužnom programu u parametrima:

curl https://raw.githubusercontent.com/curl/curl/master/README.md

Ali ovdje vas čeka jedno iznenađenje, cijeli sadržaj datoteke će biti poslan na standardni izlaz. Da ga upišete u neki fajl koristite:

curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md

A ako želite da se rezultirajuća datoteka nazove isto kao datoteka na serveru, koristite opciju -O:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md

curl - # -C - -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Ako je potrebno, možete preuzeti nekoliko datoteka jednom komandom:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Još jedna stvar koja može biti korisna administratoru je preuzimanje datoteke samo ako je promijenjena:

curl -z 21-17.12. https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Ograničenje brzine

Možete ograničiti brzinu preuzimanja na potrebnu granicu kako ne biste preopteretili mrežu sa -Y opcijom:

curl --limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Ovdje morate odrediti broj kilobajta u sekundi koji se može preuzeti. Također možete prekinuti vezu ako brzina nije dovoljna, za ovo koristite opciju -Y:

curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md

Prijenos datoteka

curl -T login.txt ftp://speedtest.tele2.net/upload/

Ili provjerimo slanje datoteke putem HTTP-a, za to postoji posebna usluga:

curl -T ~ / login.txt http://posttestserver.com/post.php

Kao odgovor, uslužni program će vam reći gdje možete pronaći preuzetu datoteku.

Slanje POST podataka

POST metodom možete slati ne samo datoteke, već i sve podatke. Podsjećam da se ova metoda koristi za dostavljanje podataka iz različitih obrazaca. Koristite opciju -d da pošaljete takav zahtjev. Za testiranje ćemo koristiti istu uslugu:

curl -d "field1 = val & fileld2 = val1" http://posttestserver.com/post.php

Ako niste zadovoljni ovom opcijom podnošenja, možete se pretvarati da ste poslali obrazac. Postoji -F opcija za ovo:

curl -F " [email protected]; type = text / plain "http://posttestserver.com/post.php

Ovdje prosljeđujemo polje lozinke u obrascu, sa tipom običan tekst, možete proslijediti više parametara na isti način.

Slanje i primanje kolačića

Kolačiće ili kolačiće koriste web stranice za pohranjivanje određenih informacija na strani korisnika. Ovo može biti potrebno, na primjer, za autentifikaciju. Možete primati i prenositi kolačiće koristeći curl. Za spremanje primljenih kolačića u datoteku, koristite opciju -c:

curl -c cookie.txt http://posttestserver.com/post.php

Zatim možete poslati uvojak kolačića natrag:

curl -b cookie.txt http://posttestserver.com/post.php

Prenošenje i raščlanjivanje zaglavlja

Ne treba nam uvijek sadržaj stranice. Ponekad samo naslovi mogu biti interesantni. Za prikaz samo njih postoji opcija -I:

curl -I https: // stranica

A opcija -H dozvoljava ili nekoliko serveru, na primjer, možete poslati zaglavlje If-Modified-Since tako da se stranica vrati samo ako je promijenjena:

Curl autentifikacija

Ako server zahtijeva autentifikaciju nekog od uobičajenih tipova, na primjer, HTTP Basic ili FTP, tada se curl može vrlo lako nositi s ovim zadatkom. Da biste naveli podatke za autentifikaciju, jednostavno ih navedite odvojene dvotočkama u opciji -u:

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

Autentifikacija na HTTP serverima će raditi na isti način.

Korištenje proxyja

Ako trebate koristiti proxy server za preuzimanje datoteka, onda je i ovo vrlo jednostavno. Dovoljno je postaviti adresu proxy servera u opciji -x:

curl -x proxysever.test.com:3128 http://google.co.in

zaključci

U ovom članku pogledali smo kako koristiti curl, zašto vam je potreban ovaj uslužni program i njegove glavne značajke. Uprkos njihovoj sličnosti, oni su veoma različiti. Naredba curl linux je više za analizu i simulaciju različitih radnji na serveru, dok je wget pogodniji za preuzimanje datoteka i indeksiranje stranica.

Život web programera zamagljen je složenošću. Posebno je frustrirajuće kada je izvor ovih komplikacija nepoznat. Da li je problem sa slanjem zahtjeva, ili sa odgovorom, ili sa bibliotekom treće strane, ili vanjski API greši? Postoji gomila različitih adaptacija koje nam mogu olakšati život. Evo nekih alata komandne linije koje ja lično smatram neprocjenjivim.

cURL
cURL je program za prijenos podataka preko različitih protokola, sličan wgetu. Glavna razlika je u tome što wget po defaultu sprema u datoteku, dok cURL ispisuje na komandnoj liniji. Ovo čini vrlo lakim pregled sadržaja web stranice. Na primjer, evo kako brzo dobiti svoju trenutnu eksternu IP adresu:

$ curl ifconfig.me 93.96.141.93
Parametri -i(prikaži zaglavlja) i -Ja(prikaži samo zaglavlja) čine cURL odličnim alatom za otklanjanje grešaka u HTTP odgovorima i analizu šta vam tačno server šalje:

$ curl -I habrahabr.ru HTTP / 1.1 200 OK Server: nginx Datum: Čet, 18. avgust 2011. 14:15:36 GMT Tip sadržaja: tekst / html; charset = utf-8 Veza: Keep-alive Keep-alive: timeout = 25
Parametar -L takođe korisno, čini da cURL automatski prati preusmjeravanja. cURL podržava HTTP autentifikaciju, kolačiće, HTTP proxy tuneliranje, ručna podešavanja u naslovima i mnogo, mnogo više.

Opsada
Siege je alat za testiranje opterećenja. Osim toga, ima zgodnu opciju -gšto je vrlo slično curl –iL, ali vam također pokazuje zaglavlja http zahtjeva. Evo primjera sa google.com (neka zaglavlja su uklonjena radi sažetosti):

$ siege -g www.google.com GET / HTTP / 1.1 Host: www.google.com Korisnički agent: JoeDog / 1.00 (X11; I; Siege 2.70) Veza: zatvori HTTP / 1.1 302 Pronađena lokacija: http: // www.google.co.uk/ Content-Type: text / html; charset = UTF-8 Server: gws Dužina sadržaja: 221 Veza: zatvori GET / HTTP / 1.1 Host: www.google.co.uk Korisnički agent: JoeDog / 1.00 (X11; I; Siege 2.70) Veza: zatvori HTTP / 1.1 200 OK Content-Type: text / html; charset = ISO-8859-1 X-XSS-Zaštita: 1; mod = blok Veza: zatvori
Ali ono za šta je Siege zaista odličan je testiranje opterećenja. Kao Apache benchmark ab, može poslati mnoge istovremene zahtjeve na stranicu i vidjeti kako upravlja prometom. Sljedeći primjer pokazuje kako testiramo Google sa 20 upita u trajanju od 30 sekundi, nakon čega daje rezultat:

$ siege -c20 www.google.co.uk -b -t30s ... Ukidanje opsade servera ... završeno. Transakcije: 1400 pogodaka Dostupnost: 100,00% Proteklo vrijeme: 29,22 sekundi Preneseni podaci: 13,32 MB Vrijeme odgovora: 0,41 sek Brzina transakcije: 47,91 trans / sec Protok: 0,46 MB / sec. Protok: 0,46 MB / sec. 4.08 Najkraća transakcija: 0.08
Jedna od najkorisnijih karakteristika Siege-a je da može raditi ne samo sa jednom adresom, već i sa listom URL-ova iz datoteke. Ovo je odlično za testiranje opterećenja jer možete simulirati promet u stvarnom svijetu na vašoj web-lokaciji, umjesto da samo ponavljate isti URL iznova i iznova. Na primjer, evo kako koristiti Siege za učitavanje servera koristeći adrese iz vašeg Apache dnevnika:

$ cut -d "" -f7 /var/log/apache2/access.log> urls.txt $ opsada -c -b -f urls.txt
Ngrep
Za ozbiljnu analizu saobraćaja, postoji Wireshark sa hiljadama podešavanja, filtera i konfiguracija. Postoji i verzija komandne linije tshark... Ali za jednostavne zadatke, Wireshark funkcionalnost smatram suvišnom. Pa sve dok mi ne treba moćno oružje, Ja koristim . Omogućava vam da uradite isto sa mrežnim paketima kao grep radi sa fajlovima.

Za web promet ćete gotovo uvijek htjeti koristiti parametar -W da sačuvate formatiranje stringova kao i opciju -q koji skriva suvišne informacije o neprikladnim paketima. Evo primjera naredbe koja presreće sve pakete naredbom GET ili POST:

Ngrep -q -W autorski red "^ (GET | POST). *"
Možete dodati dodatni filter za pakete, na primjer by dati domaćin, IP adresa ili port. Evo filtera za sve što dolazi i odlaznog saobraćaja na google.com, port 80, koji sadrži riječ “traži”.

Ngrep -q -W po liniji "pretraži" host www.google.com i port 80

Ovaj članak pretpostavlja da ste upoznati s osnovama umrežavanja i HTML-om.

Skriptiranje je bitno kada se gradi dobro kompjuterski sistem... Proširivost Unix sistema sa shell skriptama i raznim programima koji izvršavaju automatizovane komande jedan je od razloga zašto su tako uspešni.

Sve veći broj aplikacija koje se sele na web učinio je temu HTTP skriptiranja sve traženijom. Važni zadaci u ovoj oblasti su automatsko preuzimanje informacija sa Interneta, slanje ili preuzimanje podataka na web servere, itd.

Curl je alat komandne linije koji vam omogućava da izvršite sve vrste manipulacija i transfera URL-ova. Ovaj članak se fokusira na izradu jednostavnih HTTP zahtjeva. Pretpostavlja se da već znate gdje kucati

# curl --pomoć

# curl --ručno

za informacije o curl.

Curl nije alat koji će učiniti sve umjesto vas. Kreira zahtjeve, prima podatke i šalje podatke. Možda će vam trebati neka vrsta ljepila da sve spojite, možda neki skriptni jezik (poput bash) ili nekoliko ručnih poziva.

1. HTTP protokol

HTTP je protokol koji se koristi prilikom primanja podataka sa web servera. To je vrlo jednostavan protokol koji je izgrađen na vrhu TCP/IP. Protokol takođe omogućava slanje informacija serveru od klijenta koristeći nekoliko metoda, kao što će biti prikazano u nastavku.

HTTP su nizovi ASCII teksta koji se šalju od klijenta do servera za traženje akcije. Kada se primi zahtjev, server odgovara klijentu s nekoliko usluga tekstualni nizovi, a zatim i stvarni sadržaj.

Koristeći curl -v prekidač, možete vidjeti koje komande curl šalje serveru, kao i drugi informativni tekst. Prekidač -v je možda jedini način za otklanjanje grešaka ili čak razumijevanje interakcije između curl-a i web servera.

2. URL

Format Uniform Resource Locator (URL) specificira adresu određenog resursa na Internetu. Vjerovatno znate ovo, na primjer URL adrese: http://curl.haxx.se ili https://yourbank.com.

3. Preuzmite (GET) stranicu

Najjednostavniji i najčešći HTTP zahtjev je da dobijete sadržaj URL-a. URL može povezivati ​​na web stranicu, sliku ili datoteku. Klijent šalje GET zahtjev serveru i prima traženi dokument. Ako pokrenete naredbu

# curl http://curl.haxx.se

dobit ćete web stranicu prikazanu u prozoru vašeg terminala. Kompletan HTML dokument koji se nalazi na ovom URL-u.

Svi HTTP odgovori sadrže skup zaglavlja koja su obično skrivena. Da biste ih vidjeli zajedno sa samim dokumentom, koristite prekidač curl -i. Također možete zatražiti samo zaglavlja sa -I prekidačem (koji će natjerati curl da napravi HEAD zahtjev).

4. Obrasci

Obrasci su glavni način predstavljanja web stranice kao HTML stranice sa poljima u koja korisnik unosi podatke, a zatim klikne na dugme "OK" ili "Submit", nakon čega se podaci šalju na server. Server tada koristi primljene podatke i odlučuje kako dalje: tražiti informacije u bazi podataka, prikazati unesenu adresu na karti, dodati poruku o grešci ili koristiti informacije za autentifikaciju korisnika. Naravno, postoji neki program na strani servera koji prihvata vaše podatke.

4.1 GET

GET obrazac koristi metodu GET, na primjer na sljedeći način:

Ako otvorite ovaj kod u svom pretraživaču, vidjet ćete obrazac sa tekstualni okvir i dugme sa oznakom "OK". Ako unesete "1905" i kliknete OK, pretraživač će kreirati novi URL koji treba pratiti. URL će biti predstavljen kao string koji se sastoji od putanje prethodnog URL-a i niza poput "junk.cgi? Godina rođenja = 1905 i pritisnite = OK".

Na primjer, ako se obrazac nalazi na "www.hotmail.com/when/birth.html", tada će vas klikom na OK odvesti na URL "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK "...

Većina tražilice raditi na taj način.

Da bi curl obrazac bio GET zahtjev, jednostavno unesite ono što se očekuje od obrasca:

# curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"

4.2 POST

Metoda GET uzrokuje da se sve unesene informacije prikažu u adresnoj traci vašeg pretraživača. Možda je ovo dobro kada trebate označiti stranicu, ali je očigledan nedostatak kada upisujete u polja obrasca povjerljive informacije ili kada je količina informacija unesenih u polja prevelika (što rezultira nečitljivim URL-om).

HTTP protokol pruža POST metoda... Uz to, klijent šalje podatke odvojeno od URL-a i stoga ih nećete vidjeti u adresnoj traci.

Obrazac koji generiše POST zahtjev sličan je prethodnom:

Curl može formirati POST zahtjev sa istim podacima ovako:

# curl -d "godina rođenja = 1905 i pritisnite =% 20OK% 20" www.hotmail.com/when/junk.cgi

Ovaj POST zahtjev koristi "Content-Type application / x-www-form-urlencoded", što je najčešće korištena metoda.

Podaci koje šaljete serveru moraju biti ispravno kodirani, curl to neće učiniti umjesto vas. Na primjer, ako želite da vaši podaci sadrže razmak, trebate zamijeniti taj razmak sa% 20, itd. Nedostatak pažnje ovom pitanju - uobičajena greška, zbog čega se podaci ne prenose kako bi trebalo.

Još 1995. godine definiran je dodatni način prijenosa podataka preko HTTP-a. Dokumentovano je u RFC 1867, zbog čega se ponekad naziva RFC1867-posting.

Ova metoda je uglavnom dizajnirana za bolju podršku učitavanja datoteka. Obrazac koji omogućava korisniku da učita fajl izgleda ovako u HTML-u:

Imajte na umu da je Content-Type postavljen na multipart / form-data.

Da biste poslali podatke u takav obrazac koristeći curl, unesite naredbu:

# curl -F [email protected]-F pritisnite = OK

4.4 Skrivena polja

Uobičajeni način komuniciranja informacija o stanju u HTML aplikacijama je korištenje skrivenih polja u obrascima. Skrivena polja se ne popunjavaju, nevidljiva su korisniku i prosljeđuju se na isti način kao i obična polja.

Jednostavan primjer obrasca sa jednim vidljivim poljem, jednim skrivenim i dugmetom OK:

Da biste poslali POST zahtjev koristeći curl, ne morate razmišljati o tome da li je polje skriveno ili ne. Za curl, svi su isti:

# curl -d "godina rođenja = 1905. & pritisnite = OK & osoba = Daniel"

4.5 Saznajte kako izgleda POST zahtjev

Kada želite da popunite formular i pošaljete podatke serveru koristeći curl, verovatno želite da POST zahtev izgleda potpuno isto kao onaj koji se izvršava pomoću pretraživača.

Jednostavan način da vidite svoj POST zahtjev je da sačuvate HTML stranicu sa formom na disk, promijenite metodu u GET i kliknete na dugme Pošalji (također možete promijeniti URL na koji će se podaci slati).

Vidjet ćete podatke dodane URL-u, odvojene znakovima "?", kao što se očekuje kada koristite GET forme.

5. PUT

Možda je najbolji način za upload podataka na HTTP server korištenje PUT-a. Opet, ovo zahtijeva program (skriptu) na poleđini koji zna šta da radi i kako da primi HTTP PUT stream.

Pošaljite fajl na server koristeći curl:

# curl -T uploadfile www.uploadhttp.com/receive.cgi

6. Autentifikacija

Autentifikacija - prosljeđivanje korisničkog imena i lozinke serveru, nakon čega on provjerava da li imate pravo da uputite traženi zahtjev. Osnovna autentifikacija (koju curl koristi po defaultu) je čist tekst, što znači da korisničko ime i lozinka neće biti šifrirani, već samo malo prikriveni od strane Base64, što ga ostavlja otvorenim za napadače na putu između vas i HTTP servera.

Reći curl-u da koristi korisničko ime i lozinku:

# curl -u ime: lozinka www.secrets.com

Stranica može zahtijevati korištenje drugačije metode autentifikacije (pogledajte šta server piše u zaglavljima), u tim slučajevima možete koristiti ključeve --ntlm, --digest, --negotiate ili čak --anyauth. Ponekad se pristup eksternim HTTP serverima vrši preko proxyja, kao što se često radi u kompanijama i firmama. HTTP proxy može zahtijevati vlastito korisničko ime i lozinku za pristup Internetu. Odgovarajući curl ključ:

# curl -U proxyuser: proxypassword curl.haxx.se

Ako proxy zahtijeva NTLM autentifikaciju, navedite --proxy-ntlm, ako je metoda Digest, onda --proxy-digest.

Ako ne navedete lozinku u ključevima -u i -U, curl će od vas tražiti da je unesete interaktivni način rada.

Imajte na umu da kada je curl pokrenut, linija za pokretanje (zajedno sa ključevima i lozinkama) može biti vidljiva drugim korisnicima na vašem sistemu na listi zadataka. Postoje načini da se ovo spriječi. Više o tome u nastavku.

7. Referer

HTTP zahtjev može uključivati ​​polje "referer" koje pokazuje sa kojeg URL-a je korisnik došao ovaj resurs... Neki programi/skripte provjeravaju polje "referer" i ne izvršavaju zahtjev ako korisnik dolazi s nepoznate stranice. Iako je ovo glup način provjere, mnoge skripte ga koriste. Uz curl, možete staviti bilo šta u polje "referer" i natjerati ga da radi ono što želite.

To se radi na sljedeći način:

# curl -e http://curl.haxx.se daniel.haxx.se

8. Korisnički agent

Svi HTTP zahtjevi podržavaju polje "User-Agent", koje specificira korisnikovu klijentsku aplikaciju. Mnoge web aplikacije koriste ove informacije za prikaz stranice na ovaj ili onaj način. Web programeri kreiraju više verzija stranice za korisnike različitim pretraživačima poboljšati izgled, upotreba raznih javascript skripte, vbscript, itd.

Ponekad možete otkriti da curl vraća stranicu koja se razlikuje od onoga što ste vidjeli u svom pretraživaču. U ovom slučaju, samo je prikladno koristiti polje "Korisnički agent" kako biste još jednom obmanuli server.

Prikrij kovrdžavu kao Internet Explorer na Windows 2000 mašini:

# curl -A "Mozilla / 4.0 (kompatibilan; MSIE 5.01; Windows NT 5.0)"

Zašto ne postati Netscape 4.73 na Linux kutiji (PIII):

# curl -A "Mozilla / 4.73 (X11; U; Linux 2.2.15 i686)"

9. Preusmjeravanja

Kao odgovor na vaš zahtjev, server, umjesto same stranice, može vratiti indikaciju gdje pretraživač treba da ide dalje da stigne do željenu stranicu... Zaglavlje koje pretraživaču govori o ovom preusmjeravanju je "Lokacija:".

Prema zadanim postavkama, curl ne ide na lokaciju navedenu u "Location:", već jednostavno prikazuje stranicu kao i obično. Ali možete ga usmjeriti na sljedeći način:

# curl -L www.sitethatredirects.com

Ako koristite curl za POST zahtjeve na web lokaciju koja odmah preusmjerava na drugu stranicu, možete bezbedno koristiti kombinaciju -L i -d / -F. Curl će formirati POST zahtjev za prvu stranicu, a zatim GET zahtjev za sljedeću.

10. Kolačići

Sa kolačićima, web pretraživači kontrolišu stanje na strani klijenta. Kolačić je naziv sa priloženim sadržajem. Server, slanjem kolačića, saopštava klijentu putanju i ime hosta na koje kolačiće treba poslati sljedeći put, govori o trajanju kolačića i nekim drugim parametrima.

Kada se klijent poveže sa serverom na adresi navedenoj u prihvaćenom kolačiću, klijent šalje taj kolačić serveru (osim ako je životni vek istekao).

Mnoge aplikacije i serveri koriste ovu tehniku ​​da kombinuju više zahteva u jednu logičku sesiju. Da bi curl izvršio i ovu funkciju, moramo biti u mogućnosti da spremamo i šaljemo kolačiće, baš kao što to rade pretraživači.

Najjednostavniji način da pošaljete kolačić serveru kada se stranica primi koristeći curl je dodavanje odgovarajućeg ključa komandna linija:

# curl -b "ime = Daniel" www.cookiesite.com

Kolačići se šalju kao obična HTTP zaglavlja. Ovo omogućava curl-u da sačuva kolačiće uz očuvanje zaglavlja. Čuvanje kolačića koristeći curl vrši se naredbom:

# curl -D zaglavlja_i_kolačići www.cookiesite.com

(usput, za spremanje kolačića bolje je koristiti -c prekidač, više o tome u nastavku).

Curl ima potpuno funkcionalan rukovalac kolačićima, koji je koristan kada se želite ponovo povezati na server i koristiti kolačiće koji su zadnji put spremljeni (ili ručno obrađeni). Da biste koristili kolačiće pohranjene u datoteci, pozovite curl na sljedeći način:

# curl -b pohranjeni_kolačići_u_datoteci www.cookiesite.com

Motor curl kolačića je omogućen kada navedete prekidač -b. Ako želite da curl prihvata samo kolačiće, koristite -b sa datotekom koja ne postoji. Na primjer, ako želite da curl prihvati kolačiće sa stranice, a zatim slijedi preusmjeravanje (možda vraćanjem kolačića koji ste upravo prihvatili), možete pozvati curl ovako:

# curl -b nada -L www.cookiesite.com

Curl može čitati i pisati Netscape i Mozilla kolačiće. To je zgodan način za razmjenu kolačića između pretraživača i automatiziranih skripti. Prekidač -b automatski otkriva da li ovaj fajl kolačić navedenih pretraživača i njime rukuje na odgovarajući način, a pomoću prekidača -c / - cookie-jar, možete prisiliti curl da napiše novi kolačić kada se operacija završi:

# curl -b cookies.txt -c newcookies.txt www.cookiesite.com

11. HTTPS

Postoji nekoliko načina da osigurate svoje HTTP transfere. Najpoznatiji protokol za ovaj zadatak je HTTPS ili HTTP preko SSL-a. SSL šifrira sve podatke koji se šalju i primaju preko mreže, što povećava vjerovatnoću da se vaši podaci čuvaju u tajnosti.

Curl podržava zahtjeve prema HTTPS serverima zahvaljujući besplatnoj OpenSSL biblioteci. Zahtjevi se podnose na uobičajen način:

# curl https://that.secure.server.com

11.1 Certifikati

U svijetu HTTPS-a koristite certifikate pored korisničkog imena i lozinke za autentifikaciju. Curl podržava certifikate na strani klijenta. Svi certifikati su zaključani pristupnom frazom koju morate unijeti prije nego curl počne raditi s njima. Ključna fraza može se navesti ili na komandnoj liniji ili uneti interaktivno. Curl koristi certifikate poput ovog:

# curl -E mycert.pem https://that.secure.server.com

Curl također provjerava identitet servera provjeravanjem certifikata servera u odnosu na lokalno pohranjeni. Ako se pronađe neusklađenost, curl će odbiti da se poveže. Da zanemarite autentifikaciju, koristite prekidač -k.

Više informacija o certifikatima možete pronaći na http://curl.haxx.se/docs/sslcerts.html.

12. Proizvoljna zaglavlja zahtjeva

Možda ćete morati promijeniti ili dodati stavke individualni zahtjevi curl.

Na primjer, možete promijeniti POST zahtjev u PROPFIND i poslati podatke kao "Content-Type: text / xml" (umjesto uobičajenog Content-Type):

# curl -d " "-H" Content-Type: text / xml "-X PROPFIND url.com

Možete ukloniti bilo koje zaglavlje tako što ćete ga navesti bez sadržaja. Na primjer, možete ukloniti zaglavlje "Host:" i time učiniti zahtjev "prazan":

# curl -H "Host:" http://mysite.com

Također možete dodati naslove. Vašem serveru će možda trebati zaglavlje "Destination:":

# curl -H "Odredište: http://moo.com/nowhere" http://url.com

13. Otklanjanje grešaka

Često se dešava da web lokacija na zahtjeve za curl odgovara drugačije od zahtjeva pretraživača. U ovom slučaju, morate što više ličiti na curl pretraživaču:

  • Koristite --trace-ascii prekidač da sačuvate detaljan izveštaj o zahtevima kako biste ih kasnije mogli detaljno ispitati i razumeti problem.
  • Provjerite jeste li provjerili ima li kolačića i koristite ih ako je potrebno (pročitajte prekidač -b i sačuvajte -c)
  • Unesite jedan od najnovijih popularnih pretraživača u polje "user-agent".
  • Popunite polje "referer" kao što to čini pretraživač
  • Ako koristite POST zahtjeve, uvjerite se da su sva polja proslijeđena istim redoslijedom kao i pretraživač (vidi gore, tačku 4.5)

Dobar pomoćnik u ovom teškom zadatku je dodatak LiveHTTPHeader za Mozilla / Firefox, koji vam omogućava da vidite sva zaglavlja koja ovaj pretraživač šalje i prima (čak i kada koristite HTTPS).

Pristup nižeg nivoa je da se uhvati HTTP saobraćaj na webu pomoću programa kao što su ethereal ili tcpdump, a zatim analizira koja su zaglavlja primljena i poslana od strane pretraživača (HTTPS čini ovaj pristup neefikasnim).

RFC 2616 je obavezno čitanje za sve koji žele razumjeti HTTP protokol.

RFC 2396 objašnjava sintaksu za URL-ove.

RFC 2109 definira kako kolačići rade.

RFC 1867 definira format objave za otpremanje datoteke.

http://openssl.planetmirror.com - Početna stranica OpenSSL projekat

http://curl.haxx.se - početna stranica cURL projekta

cURL je poseban alat 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 pogledati neke od naprednih karakteristika cURL-a i također ih se dotaknuti praktična upotreba znanja stečena pomoću PHP-a.

Zašto cURL?

U stvari, ima ih mnogo alternativnim načinima uzorkovanje sadržaja web stranice. U mnogim slučajevima, uglavnom zbog lijenosti, koristio sam jednostavan 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 imaju ogroman broj nedostataka u pogledu rukovanja greškama itd. Osim toga, postoje specifične zadatke koje jednostavno ne možete riješiti zahvaljujući ovima standardne funkcije: interakcija kolačića, autentifikacija, podnošenje obrasca, otpremanje datoteka, itd.

cURL je moćna biblioteka koja podržava mnogo različitih protokola, opcija i pruža detaljne informacije o URL zahtjevima.

Osnovna struktura

  • Inicijalizacija
  • Dodjela parametara
  • Izvršavanje 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 u ovom članku mnogo više od svih ostalih koraka, jer u ovoj fazi se dešavaju sve najzanimljivije i najkorisnije stvari koje trebate znati. Postoji ogroman broj razne opcije koji mora biti specificiran da bi se URL zahtjev mogao konfigurirati na najpažljiviji način. Nećemo razmatrati cijelu listu kao cjelinu, već ćemo se fokusirati samo na ono što smatram potrebnim i korisnim za ovu lekciju. Ostalo možete sami proučiti ako vas ova tema zanima.

Provjera grešaka

Osim toga, možete koristiti i uslovne izraze za testiranje uspjeha:

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

Ovdje imajte na umu jednu vrlo važnu stvar za sebe: moramo koristiti “=== false” za poređenje, umjesto “== false”. Za one koji nisu upoznati, ovo će nam pomoći da razlikujemo prazan rezultat od booleove lažne vrijednosti, što će ukazivati ​​na grešku.

Primanje informacija

Još jedan dodatni korak je da dobijete podatke cURL zahtjeva nakon što je 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"
  • Veličina_preuzimanje
  • “Speed_download”
  • “Speed_upload”
  • "Download_content_length"
  • "Upload_content_length"
  • "Starttransfer_time"
  • "Redirect_time"

Detekcija preusmjeravanja zasnovana na pretraživaču

U ovom prvom primjeru, napisat ćemo kod koji može otkriti URL preusmjeravanja na osnovu različite postavke Pretraživač. Na primjer, neke web stranice preusmjeravaju pretraživače mobitel, ili bilo koji drugi uređaj.

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

// testirati URL $ urls = niz ("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) "," jezik "=>" en-us, en; q = 0,5 ")," iphone "=> niz (" user_agent "=>" Mozilla / 5.0 (iPhone; U ; CPU poput Mac OS X; en) AppleWebKit / 420 + (KHTML, poput 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)", "jezik" => "fr, fr-FR; q = 0,5")); foreach ($ urls kao $ url) (echo "URL: $ url \ n"; foreach ($ pretraživači kao $ test_name => $ pretraživač) ($ ch = curl_init (); // specificiraj url curl_setopt ($ ch, CURLOPT_URL, $ url); // postavite zaglavlja za pretraživač curl_setopt ($ ch, CURLOPT_HTTPHEADER, niz ("Korisnički agent: ($ pretraživač [" user_agent "])", "Prihvati-Jezik: ($ pretraživač [" jezik "]) " )); // ne treba nam sadržaj stranice curl_setopt ($ ch, CURLOPT_NOBODY, 1); // moramo dobiti HTTP zaglavlja curl_setopt ($ ch, CURLOPT_HEADER, 1); // vraća rezultate umjesto izlaza curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); $ output = curl_exec ($ ch); curl_close ($ ch); // da li je bilo HTTP preusmjeravanja? If (preg_match ("! Lokacija: (. *)!", $ Izlaz , $ odgovara)) (echo " $ test_name: preusmjerava na $ podudara se \ n ";) else (echo" $ test_name: nema preusmjeravanja \ n ";)) echo" \ n \ n ";)

Prvo, dajemo listu URL-ova web lokacija koje ćemo provjeriti. Tačnije, potrebne su nam adrese ovih lokacija. Zatim moramo definirati postavke pretraživača da testiramo svaki od ovih URL-ova. Nakon toga ćemo koristiti petlju u kojoj ćemo preći 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 $ izlazu). Zatim, koristeći jednostavan regex, možemo odrediti da li je linija "Location:" bila prisutna u primljenim zaglavljima.

Kada trčiš dati kod, trebali biste dobiti nešto poput sljedećeg:

Izrada POST zahtjeva za određeni URL

Prilikom formiranja GET zahtjev preneseni podaci mogu biti proslijeđeni URL-u putem „stringa upita“. Na primjer, kada pretražujete Google, pojam za pretraživanje se pojavljuje u adresnoj traci novog URL-a:

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

Ne morate koristiti cURL da simulirate ovaj zahtjev. Ako vas lijenost potpuno uhvati, koristite funkciju file_get_contents () da biste dobili rezultat.

Ali poenta je da 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 oponašati 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 za izvršavanje cURL zahtjeva:

$ 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 $ izlaz;

Kada pokrenete ovu skriptu, trebali biste dobiti sličan rezultat:

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

Upload fajla

Prvo, napravimo fajl za generisanje i slanje na upload_output.php:

Print_r ($ _ FILES);

A evo i koda skripte koji izvodi gornju funkcionalnost:

$ url = "http: //localhost/upload_output.php"; $ post_data = array ("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 $ izlaz;

Kada želite da otpremite fajl, sve što treba da uradite je da ga prosledite kao redovnu promenljivu posta, kojoj prethodi simbol @. Kada pokrenete skriptu koju ste napisali, dobit ćete sljedeći izlaz:

Višestruki cURL

Jedan od mnogih snage cURL je mogućnost kreiranja "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šavanje skripte je pauzirano i čeka se završetak URL operacije zahtjeva, nakon čega se skripta može nastaviti. Ako namjeravate komunicirati s cijelom gomilom URL-ova, to će oduzeti dosta vremena, jer u klasičnoj verziji možete raditi samo s jednim URL-om u isto vrijeme. Međutim, ovu situaciju možemo ispraviti korištenjem posebnih rukovatelja.

Hajde da pogledamo neki primer koda koji sam preuzeo sa php.net:

// kreiramo neke cURL resurse $ 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); // kreiramo višestruki cURL rukovalac $ mh = curl_multi_init (); // dodaj neke rukovaoce curl_multi_add_handle ($ mh, $ ch1); curl_multi_add_handle ($ mh, $ ch2); $ active = null; // izvršenje do ($ mrc = curl_multi_exec ($ mh, $ aktivno);) while ($ mrc == CURLM_CALL_MULTI_PERFORM); while ($ aktivan && $ mrc == CURLM_OK) (if (curl_multi_select ($ mh)! = -1) (do ($ mrc = curl_multi_exec ($ mh, $ aktivan);) 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. Prvo uradi-while petlja poziva funkciju 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, u ovom trenutku, http zaglavlja se šalju na URL); Zbog toga nastavljamo provjeravati ovu povratnu vrijednost dok ne dobijemo drugačiji rezultat.

U sljedećoj petlji provjeravamo uslov dok je varijabla $ aktivna = "true". To je drugi parametar funkcije curl_multi_exec (). Vrijednost ove varijable će biti jednaka "true", sve dok bilo koja od postojeće promjene je aktivan. Zatim pozivamo funkciju curl_multi_select (). Njegovo izvođenje je "blokirano" sve dok postoji barem jedan aktivna veza dok se ne dobije odgovor. Kada se to dogodi, vraćamo se u glavnu petlju kako bismo nastavili s izvršavanjem upita.

A sada primijenimo stečeno znanje na primjeru koji će vam biti od koristi veliki broj ljudi.

Provjera veza u WordPress-u

Zamislite blog sa ogromnim brojem postova i postova, od kojih svaki ima veze do vanjskih internetskih resursa. Neki od ovih linkova možda su već "mrtvi" iz različitih razloga. Stranica je možda uklonjena 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 dati detaljan izvještaj.

Moram odmah reći da ovo nije primjer kreiranja dodatka za WordPress. Ovo je samo 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 = niz ("localhost", "www.mydomain.com"); $ max_connections = 10; // inicijalizira varijable $ url_list = array (); $ work_urls = niz (); $ dead_urls = niz (); $ not_found_urls = niz (); $ active = null; // spojiti se na MySQL if (! mysql_connect ($ db_host, $ db_user, $ db_pass)) (die ("Nije se moglo povezati:". mysql_error ());) if (! mysql_select_db ($ db_name)) (die ("Može not select db: ". mysql_error ());) // odaberite sve objavljene postove sa linkovima $ q =" SELECT post_content IZ wp_posts GDJE post_content LIKE "% href =%" I post_status = "objavi" I post_type = "post "" ; $ r = mysql_query ($ q) ili die (mysql_error ()); dok ($ 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;)) ) / / / ukloniti 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 maksimuma istovremene veze koju ćemo koristiti u našoj skripti ($ max_connections). Zatim se prilažemo bazi podataka, odabiremo postove koji sadrže veze i pohranjujemo ih u niz ($ url_list).

Sljedeći kod je malo nezgodan, pa ga razumite od početka do kraja:

// 1.multiple handler $ 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 staviti na police. 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čeće da obrađuje novi URL. U početku dodajemo 10 ($ max_connections) URL-ova;
  3. 3. Da bismo započeli, moramo pokrenuti funkciju curl_multi_exec (). Sve dok vraća CURLM_CALL_MULTI_PERFORM, imamo još mnogo toga da uradimo. Ovo nam je potrebno uglavnom da bismo stvorili veze;
  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. Opet, moramo natjerati cURL da obavi neki posao, odnosno da dohvati podatke vraćenog odgovora;
  7. 7. Ovdje se provjeravaju informacije. Kao rezultat izvršenja zahtjeva, biće vraćen niz;
  8. 8. Vraćeni niz sadrži cURL rukovalac. Koristićemo ga za dohvaćanje informacija o pojedinačnom cURL zahtjevu;
  9. 9. Ako je link mrtav, ili je isteklo vrijeme izvršavanja skripte, onda ne treba tražiti nikakve http kod a;
  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 šifru 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 prije pričali;
  14. 14. U ovom koraku, skripta završava svoj rad. Možemo izbrisati sve što nam nije potrebno i napraviti izvještaj;
  15. 15. Konačno ćemo napisati funkciju koja će dodati url rukovatelju. Statička varijabla $ indeks će se povećavati svaki put ovu funkcijuće biti pozvan.

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

U mom slučaju, skripti je trebalo nešto manje od 2 sekunde da prođe kroz 40 URL-ova. Povećanje produktivnosti je značajno kada se radi sa više velika količina URL adrese. Ako otvorite deset veza istovremeno, skripta može raditi deset puta brže.

Nekoliko riječi o drugim korisnim cURL opcijama

HTTP autentikacija

Ako je uključeno URL adresa postoji HTTP autentifikacija, onda možete lako 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 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 koristite cURL alate:

// otvorite datoteku $ file = fopen ("/ path / to / file", "r"); // url treba sadržavati sljedeći sadržaj $ url = "ftp: // korisničko ime: [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, curl_setopt 1 $ ch, CURLOPT_INFILE, $ fp); curl_setopt ($ ch, CURLOPT_INFILESIZE, veličina datoteke ("/ putanja / do / datoteke")); // specificirajte ASCII mod curl_setopt ($ ch, CURLOPT_FTPASCII, 1); $ curl output = curl ( $ ch); curl_close ($ ch);

Korištenje proksija

Možete izvršiti svoj url zahtjev preko proxyja:

$ ch = curl_init (); curl_setopt ($ ch, CURLOPT_URL, "http://www.example.com"); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); // specificira 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; return strlen ($ str);)

Funkcija poput ove MORA vratiti dužinu niza, što je obavezno.

Zaključak

Danas smo pogledali kako možete koristiti cURL biblioteku u svom sebične svrhe... Nadam se da ste uživali u ovom članku.

Hvala! ugodan dan!

Top srodni članci