PHP CURL - funkcije i primjeri korištenja. Napredna upotreba cURL-a u PHP Curl opcijama komandne linije

(PHP 4 >= 4.0.2, PHP 5, PHP 7)

curl_setopt — Postavlja parametar za CURL sesiju

Lista parametara

cURL ručka dobijena od curl_init().

Parametar koji treba postaviti CURLOPT_XXX.

Vrijednost parametra opcije.

bool:

Parametar Bilješke
CURLOPT_AUTOREFERER ISTINITO za automatsko podešavanje na terenu Preporučitelj: u zahtjevima preusmjerenim zaglavljem Lokacija:.
CURLOPT_BINARYTRANSFER ISTINITO za vraćanje sirovog odgovora kada koristite konstantu CURLOPT_RETURNTRANSFER. Od PHP 5.1.3 ova opcija više nije potrebna: sirovi izlaz se uvijek vraća kada se koristi opcija CURLOPT_RETURNTRANSFER.
CURLOPT_COOKIESESSION ISTINITO da biste naložili trenutnoj sesiji da započne novu "sesiju" kolačića. Ovo će uzrokovati da libcurl ignorira sve kolačiće "sesije" koje je trebao učitati iz prethodne sesije. Prema zadanim postavkama, libcurl uvijek sprema i učitava sve kolačiće, bez obzira da li su "session" ili ne. Kolačići "sesije" su kolačići koji ne ističu i moraju postojati samo za trenutnu "sesiju".
CURLOPT_CERTINFO ISTINITO za izlaz informacija o SSL certifikatu za prijenos STDERR sa sigurnim vezama. Dodato u cURL 7.19.1. Dostupno počevši od PHP 5.3.2. Zahteva da ova opcija bude omogućena za ispravan rad CURLOPT_VERBOSE.
CURLOPT_CONNECT_ONLY ISTINITO govori biblioteci da izvrši potrebnu proxy autentifikaciju i postavljanje veze, ali ne prenosi podatke. Ova opcija je implementirana za HTTP, SMTP i POP3. Dodato u 7.15.2. Dostupno od PHP 5.5.0.
CURLOPT_CRLF ISTINITO za pretvaranje završetaka Unix linija u CRLF.
CURLOPT_DNS_USE_GLOBAL_CACHE ISTINITO za korištenje globalne DNS keš memorije. Ova opcija nije sigurna niti i omogućena je po defaultu.
CURLOPT_FAILONERROR ISTINITO za detaljan izvještaj o neuspjehu ako je primljeni HTTP kod veći od ili jednak 400. Zadano ponašanje vraća stranicu kao normalno, ignorirajući kod.
CURLOPT_FILETIME ISTINITO da pokušate dobiti datum izmjene udaljenog dokumenta. Ova vrijednost se može dobiti pomoću parametra CURLINFO_FILETIME iz funkcije curl_getinfo().
CURLOPT_FOLLOWLOCATION ISTINITO da prati bilo koji naslov "Lokacija: " poslao server u svom odgovoru (imajte na umu da se to dešava rekurzivno, PHP će pratiti sva poslana zaglavlja "Lokacija: ", osim kada je postavljena konstanta CURLOPT_MAXREDIRS).
CURLOPT_FORBID_REUSE ISTINITO da prisilite vezu da se zatvori nakon što je njena obrada završena tako da se ne može ponovo koristiti.
CURLOPT_FRESH_CONNECT ISTINITO da prisilite upotrebu nove veze umjesto keširane.
CURLOPT_FTP_USE_EPRT ISTINITO da koristite EPRT (i LPRT) za aktivno FTP otpremanje. Koristi FALSE kako biste onemogućili EPRT i LPRT i koristili samo PORT.
CURLOPT_FTP_USE_EPSV ISTINITO za početno testiranje EPSV komande tokom FTP transfera. Ako komanda ne uspije, vratit će se na PASV. Instaliraj unutra FALSE da onemogućite EPSV.
CURLOPT_FTP_CREATE_MISSING_DIRS ISTINITO za kreiranje direktorija koji nedostaju ako FTP operacija naiđe na nepostojeću stazu.
CURLOPT_FTPAPPEND ISTINITO da zapišete udaljenu datoteku do kraja, umjesto da je prepišete preko postojeće datoteke.
CURLOPT_TCP_NODELAY Trajno specificira da li opciju TCP_NODELAY treba postaviti ili obrisati (1 = postavljeno, 0 = obrisano). Podrazumevano, opcija je obrisana. Dostupno od PHP 5.2.1 za verzije napravljene sa libcurl 7.11.2 ili novijim.
CURLOPT_FTPASCII Nadimak CURLOPT_TRANSFERTEXT. Koristite ovo umjesto toga.
CURLOPT_FTPLISTONLY ISTINITO da vrati samo listu imena iz FTP direktorija.
CURLOPT_HEADER ISTINITO uključiti zaglavlja u izlaz.
CURLINFO_HEADER_OUT ISTINITO za praćenje niza upita. Dostupno počevši od PHP 5.1.3. Prefiks CURLINFO_ posebno koristio.
CURLOPT_HTTPGET ISTINITO da resetujete metodu HTTP zahteva na GET metodu. Budući da je GET default, ovaj parametar je potreban samo ako je metoda zahtjeva prethodno promijenjena.
CURLOPT_HTTPPROXYTUNNEL ISTINITO za tuneliranje kroz specificirani HTTP proxy.
CURLOPT_MUTE ISTINITO da potpuno onemogućite poruke funkcije cURL. Uklonjeno u cURL 7.15.5 (može se koristiti opcija CURLOPT_RETURNTRANSFER)
CURLOPT_NETRC ISTINITO da pročitate ~/.netrc datoteku za prijavu i lozinku za udaljenu lokaciju s kojom se uspostavlja veza.
CURLOPT_NOBODY ISTINITO da isključi tijelo odgovora iz izlaza. Metoda zahtjeva je postavljena na HEAD. Promjena ove postavke u FALSE ne mijenja ga nazad u GET.
CURLOPT_NOPROGRESS

ISTINITO da onemogućite indikator napretka na cURL transferima.

Komentar:

PHP automatski postavlja ovaj parametar na ISTINITO, promijenite ga samo u svrhu otklanjanja grešaka.

CURLOPT_NOSIGNAL ISTINITO da ignoriše bilo koju cURL funkciju koja šalje signale PHP procesu. Ova opcija je podrazumevano omogućena u višenitnim SAPI-ovima kako bi se omogućilo da parametri isteka vremena rade ispravno.
CURLOPT_POST ISTINITO da koristite običan HTTP POST. Ova POST metoda koristi normalnu , koji se obično koristi u HTML formama.
CURLOPT_PUT ISTINITO da preuzmete datoteku koristeći HTTP PUT metod. Datoteka koja se koristi mora biti podešena pomoću opcija CURLOPT_INFILE I CURLOPT_INFILESIZE.
CURLOPT_RETURNTRANSFER ISTINITO da vratite rezultat prijenosa kao string iz curl_exec() umjesto direktnog izlaza u pretraživač.
CURLOPT_SAFE_UPLOAD ISTINITO da onemogućite podršku za prefiks @ za preuzete fajlove u CURLOPT_POSTFIELDS, što znači da su vrijednosti proslijeđene sa @ mogu se bezbedno prenositi kao polja. Umjesto prefiksa, možete koristiti opciju CURLFile d. Dodato u PHP 5.5.0 sa podrazumevanom vrednošću FALSE. U PHP 5.6.0 postao je jednak standardno ISTINITO.
CURLOPT_SSL_VERIFYPEER FALSE da zaustavi cURL da provjerava host certifikat. Alternativni certifikati za provjeru mogu se specificirati pomoću parametra CURLOPT_CAINFO ili direktorij s certifikatima specificiranim parametrom CURLOPT_CAPATH. Podrazumevano je ISTINITO od cURL verzije 7.10. Zadana distribucija je instalirana počevši od cURL verzije 7.10.
CURLOPT_TRANSFERTEXT ISTINITO da koristite ASCII mod za FTP transfere. Kada koristite LDAP, podaci se vraćaju u običnom tekstu umjesto u HTML-u. Na Windows sistemima nit STDOUT ne postavlja na binarni način rada.
CURLOPT_UNRESTRICTED_AUTH ISTINITO da nastavite sa slanjem podataka za prijavu i lozinku tokom preusmjeravanja (kada koristite CURLOPT_FOLLOWLOCATION), čak i ako se ime hosta promijeni.
CURLOPT_UPLOAD ISTINITO da se pripremite za učitavanje datoteke na server.
CURLOPT_VERBOSE ISTINITO za prikaz dodatnih informacija. Zapisuje izlaz u tok STDERR, ili datoteku specificiranu parametrom CURLOPT_STDERR.

Za sljedeće vrijednosti parametara opcije, parametar vrijednosti mora biti tipa cijeli broj:

Parametar Postavite vrijednost vrijednosti Bilješke
CURLOPT_BUFFERSIZE Veličina bafera koji se koristi za svako čitanje. Međutim, ne postoji garancija da će ovaj zahtjev biti ispunjen. Dodato u cURL 7.10.
CURLOPT_CLOSEPOLICY Jedna od konstanti CURLCLOSEPOLICY_*.

Komentar:

Ova opcija je zastarjela jer nikada nije implementirana u cURL i nije radila.

Uklonjeno u PHP 5.6.0.
CURLOPT_CONNECTTIMEOUT Broj sekundi za čekanje prilikom pokušaja povezivanja. Koristite 0 da čekate beskonačno.
CURLOPT_CONNECTTIMEOUT_MS Broj milisekundi za čekanje prilikom pokušaja povezivanja. Koristite 0 da čekate beskonačno. Ako se libcurl kompajlira pomoću sistemskog standardnog razrjeđivača imena, tada će veza i dalje koristiti punu sekundu čekanja kao timeout, s minimalnim dozvoljenim timeoutom od 1 sekunde. Dodato u cURL verziji 7.16.2. Dostupno počevši od PHP 5.2.3.
CURLOPT_DNS_CACHE_TIMEOUT Broj sekundi koje DNS snima pohranjene u memoriji. Standardno, ovaj parametar je 120 (2 minute).
CURLOPT_FTPSSLAUTH Metoda FTP autentifikacije (u aktivnom načinu): CURLFTPAUTH_SSL(SSL se prvo provjerava), CURLFTPAUTH_TLS(TLS se prvo provjerava) ili CURLFTPAUTH_DEFAULT(cURL odlučuje sam). Dodato u cURL verziji 7.12.2.
CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE (podrazumevano, CURL bira koju verziju će koristiti), CURL_HTTP_VERSION_1_0 (prisilno HTTP/1.0) ili CURL_HTTP_VERSION_1_1 (prisilno HTTP/1.1).
CURLOPT_HTTPAUTH

Možete koristiti bitni operator | (ili) kombinirati nekoliko metoda zajedno. U ovom slučaju, cURL će ispitati server za podržane metode autorizacije i odabrati najbolji.

CURLAUTH_ANY je pseudonim CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLAUTH_ANYSAFE je pseudonim CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLOPT_INFILESIZE Očekivana veličina datoteke, u bajtovima, prilikom učitavanja datoteke na udaljeni server. Imajte na umu da korištenje ove opcije neće zaustaviti daljnje slanje podataka iznad ove vrijednosti, jer podaci koji se šalju zavise od rezultata CURLOPT_READFUNCTION.
CURLOPT_LOW_SPEED_LIMIT Gornji prag za brzinu prijenosa podataka, u bajtovima u sekundi. Verifikacija se odvija unutar CURLOPT_LOW_SPEED_TIME sekundi, nakon čega PHP smatra da je transfer prespor i prekida ga.
CURLOPT_LOW_SPEED_TIME Maksimalni broj sekundi tokom kojeg brzina prijenosa ne smije biti veća CURLOPT_LOW_SPEED_LIMIT, inače će PHP označiti transfer kao presporo i zaustaviti ga.
CURLOPT_MAXCONNECTS Maksimalan broj trajnih veza. Kada se dostigne ograničenje, parametar se koristi za određivanje veze koju treba zatvoriti. CURLOPT_CLOSEPOLICY.
CURLOPT_MAXREDIRS Maksimalan broj prihvaćenih preusmjeravanja. Koristite ovu opciju zajedno sa opcijom CURLOPT_FOLLOWLOCATION.
CURLOPT_PORT Alternativni priključak za povezivanje.
CURLOPT_POSTREDIR Bit maska ​​koja sadrži 1 (301 Trajno premješteno), 2 (302 pronađeno) i 4 (303 Vidi ostalo) za određivanje da li treba obraditi HTTP POST metodu kada je opcija omogućena CURLOPT_FOLLOWLOCATION ako se dogodila navedena vrsta preusmjeravanja. Dodato u cURL 7.19.1. Dostupno od PHP 5.3.2.
CURLOPT_PROTOCOLS

Bit maska ​​vrijednosti CURLPROTO_*. Ova maska ​​ograničava protokole koje koristi libcurl. Ovo vam omogućava da libcurl radi sa velikim brojem protokola i ograničite rad određenih transfera na samo njihov podskup. Podrazumevano, libcurl koristi sve podržane protokole. Vidi također parametar CURLOPT_REDIR_PROTOCOLS.

Ispravne vrijednosti protokola: CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_LDAP , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_LDAP , CURLCULE PRORLTOPS,DICPROTO_ ROTO_TFTP, CURLPROTO_ALL

CURLOPT_PROXYAUTH Metode HTTP autorizacije koje se koriste prilikom povezivanja na proxy server. Koristite iste bitne maske koje su opisane za parametar CURLOPT_HTTPAUTH. Trenutno su samo CURLAUTH_BASIC i CURLAUTH_NTLM podržani za proxy autorizaciju. Dodato u cURL verziji 7.10.7.
CURLOPT_PROXYPORT Broj porta proxy servera na koji se uspostavlja veza. Ovaj broj se također može postaviti pomoću parametra CURLOPT_PROXY.
CURLOPT_PROXYTYPE Ili CURLPROXY_HTTP (podrazumevano) ili CURLPROXY_SOCKS5 . Dodato u cURL 7.10.
CURLOPT_REDIR_PROTOCOLS Bit maska ​​vrijednosti CURLPROTO_*. Ova bitmaska ​​ograničava protokole koje koristi libcurl prilikom preusmjeravanja (sa uključenim parametrom CURLOPT_FOLLOWLOCATION). Ovo vam omogućava da ograničite skup protokola koji se koriste prilikom preusmjeravanja za neke prijenose. Podrazumevano, libcurl podržava sve protokole osim FILE i SCP. U verzijama prije 7.19.4, preusmjeravanje je korišteno za sve protokole bez izuzetka. Vidi također opis parametara CURLOPT_PROTOCOLS za listu konstanti sa vrijednostima protokola. Dodato u cURL verziji 7.19.4.
CURLOPT_RESUME_FROM Pomak početka prijenosa, u bajtovima.
CURLOPT_SSL_VERIFYHOST Koristite 1 da provjerite postojanje zajedničkog imena u SSL certifikatu. Koristite 2 da provjerite da li zajedničko ime postoji i da se također podudara sa specificiranim hostom. U borbenom okruženju, vrijednost ovog parametra bi trebala biti 2 (podešeno prema zadanim postavkama). Podrška za vrijednost 1 je uklonjena u cURL 7.28.1
CURLOPT_SSLVERSION Jedna od konstanti CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1(5) ili CURL_SSLVERSION_TLSv1_2 (6).
CURLOPT_TIMECONDITION Metoda interpretacije parametara CURLOPT_TIMEVALUE. Koristite CURL_TIMECOND_IFMODSINCE da vratite stranicu samo ako se promijenila od vremena navedenog u parametru CURLOPT_TIMEVALUE. Ako stranica nije izmijenjena, naslov će biti vraćen "304 nije modificirano", što implicira da je parametar CURLOPT_HEADER ugrađen u ISTINITO. Koristite CURL_TIMECOND_IFUNMODSINCE za suprotan efekat. Zadana vrijednost je CURL_TIMECOND_IFMODSINCE.
CURLOPT_TIMEOUT Maksimalan broj sekundi dozvoljen za izvršavanje cURL funkcija.
CURLOPT_TIMEOUT_MS Maksimalan broj milisekundi dozvoljen za izvršavanje cURL funkcija. Ako je libcurl napravljen korištenjem normalnog razrjeđivača imena sistema, tada će ovaj raspon veze i dalje koristiti vremenska ograničenja drugog zaokruživanja, sa minimalnim dozvoljenim timeoutom od jedne sekunde. Dodato u cURL verziji 7.16.2. Dostupno počevši od PHP 5.2.3.
CURLOPT_TIMEVALUE Broj sekundi od 1. januara 1970. Ovo vrijeme će koristiti parametar CURLOPT_TIMECONDITION. Po defaultu se koristi parametar CURL_TIMECOND_IFMODSINCE.
CURLOPT_MAX_RECV_SPEED_LARGE Ako brzina preuzimanja premaši ovu vrijednost (navedenu u bajtovima u sekundi) u prosjeku tokom cijelog prijenosa, preuzimanje će biti pauzirano kako bi se održala prosječna brzina manja ili jednaka ovom parametru. Podrazumevano, brzina nije ograničena.
CURLOPT_MAX_SEND_SPEED_LARGE Ako otpremanje na server premaši ovu vrijednost (navedenu u bajtovima u sekundi) u prosjeku tokom cijelog prijenosa, otpremanje će biti pauzirano kako bi se održala prosječna brzina manja ili jednaka ovom parametru. Podrazumevano, brzina nije ograničena. Dodato u cURL verziji 7.15.5. Dostupno počevši od PHP 5.4.0.
CURLOPT_SSH_AUTH_TYPES Bitmaska ​​koja se sastoji od jedne ili više konstanti: CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD. Instaliraj CURLSSH_AUTH_ANY kako bi libcurl samostalno izabrao jedan od njih. Dodato u cURL 7.16.1.
CURLOPT_IPRESOLVE Dozvoljava aplikaciji da odabere tip IP adrese s kojom je određeno ime hosta. Ovo je neophodno ako koristite ime hosta koje je izvedeno iz više od jedne verzije IP adrese. Moguće vrijednosti mogu biti CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6, i po defaultu CURL_IPRESOLVE_WHATEVER. Dodato u cURL 7.10.8.

Za sljedeće vrijednosti parametara opcije, parametar vrijednosti mora biti tipa string:

Parametar Postavite vrijednost vrijednosti Bilješke
CURLOPT_CAINFO Ime datoteke koja sadrži jedan ili više certifikata prema kojima će se čvorovi provjeravati. Ovaj parametar ima smisla samo kada se koristi u kombinaciji sa CURLOPT_SSL_VERIFYPEER. Zahtijeva apsolutnu putanju.
CURLOPT_CAPATH Direktorij koji sadrži nekoliko CA certifikata. Koristite ovu opciju u kombinaciji sa CURLOPT_SSL_VERIFYPEER.
CURLOPT_COOKIE Sadržaj zaglavlja "Kolačić:", koji se koristi u HTTP zahtjevu. Imajte na umu da je više kolačića odvojeno tačkom i zarezom nakon čega slijedi razmak (na primjer, " voće=jabuka; boja=crvena")
CURLOPT_COOKIEFILE Naziv datoteke koja sadrži kolačiće. Ova datoteka mora biti u Netscape formatu ili jednostavno HTTP zaglavlja upisana u datoteku. Ako je kao ime datoteke proslijeđen prazan niz, kolačići neće biti spremljeni, ali će njihova obrada i dalje biti omogućena.
CURLOPT_COOKIEJAR Ime datoteke u kojoj će biti sačuvani svi interni kolačići trenutnog prijenosa nakon zatvaranja ručke, na primjer nakon poziva curl_close.
CURLOPT_CUSTOMREQUEST

Umjesto toga se koristi metoda prilagođenog zahtjeva "UZMI" ili "GLAVA" prilikom postavljanja HTTP zahtjeva. Ovo je korisno za upite "IZBRIŠI" ili druge, rijeđe HTTP zahtjeve. Tačna značenja bila bi riječi poput "UZMI", "POŠTA", "POVEŽI" i tako dalje; one. Ovdje nemojte unositi cijeli red HTTP zahtjeva. Na primjer, indikacija "GET /index.html HTTP/1.0\r\n\r\n" biće pogrešno.

Komentar:

Nemojte koristiti ovu funkciju dok niste sigurni da server podržava ovu vrstu zahtjeva.

CURLOPT_EGDSOCKET Sviđa mi se CURLOPT_RANDOM_FILE, osim što je ime datoteke postavljeno na utičnicu Entropy Gathering Daemon.
CURLOPT_ENCODING Sadržaj zaglavlja "Prihvati kodiranje: ". Ovo omogućava dekodiranje zahtjeva. Podržana kodiranja su "identitet", "ispuhati" I "gzip". Ako je proslijeđen prazan niz, "" , šalje se zaglavlje koje sadrži sve podržane tipove kodiranja. Dodato u cURL 7.10.
CURLOPT_FTPPORT Vrijednost koja će se koristiti za određivanje IP adrese za FTP "PORT" naredbu. Komanda "PORT" govori serveru na koju IP adresu treba da se poveže. Ovo može biti IP adresa, ime hosta, ime mrežnog interfejsa (pod Unix-om) ili jednostavno "-" za korištenje zadane sistemske IP adrese.
CURLOPT_INTERFACE Naziv mrežnog sučelja za korištenje. Može biti ime interfejsa, IP adresa ili ime hosta.
CURLOPT_KEYPASSWD Lozinka je potrebna za korištenje privatnog ključa CURLOPT_SSLKEY ili CURLOPT_SSH_PRIVATE_KEYFILE. Dodato u cURL 7.16.1.
CURLOPT_KRB4LEVEL Sigurnosni nivo KRB4 (Kerberos 4). Bilo koja od sljedećih vrijednosti (redom od najslabije do najjače) je tačna: "jasno", "sigurno", "povjerljivo", "privatno".. Ako se navedeni niz razlikuje od datih vrijednosti, vrijednost će se koristiti "privatno". Postavljanje ove opcije na NULLće u potpunosti onemogućiti sigurnost KRB4. U ovom trenutku, KRB4 sigurnost radi samo sa FTP transakcijama.
CURLOPT_POSTFIELDS Svi podaci preneseni u HTTP POST zahtjevu. Da biste prenijeli datoteku, navedite prije imena datoteke @ , a također koristite punu putanju do datoteke. Tip datoteke se također može odrediti korištenjem formata " ;type=mimetype" nakon naziva datoteke. Ovaj parametar se može proslijediti kao url kodirani niz, kao " para1=val1¶2=val2&...", i to u obliku niza, čiji će ključevi biti imena polja, a vrijednosti njihov sadržaj. Ako je vrijednost niz, zaglavlje Content-Typeće biti postavljeno na multipart/form-data. Počevši od PHP 5.2.0, kada prenosite fajlove sa prefiksom @ , vrijednost mora biti niz. Od PHP 5.5.0, prefiks @ je zastarjelo i datoteke se mogu slati koristeći CURLFile. Prefiks @ može se onemogućiti kako bi se omogućile vrijednosti koje počinju sa @ postavljanjem opcije CURLOPT_SAFE_UPLOAD u značenju ISTINITO.
CURLOPT_PROXY HTTP proxy preko kojeg će se zahtjevi usmjeravati.
CURLOPT_PROXYUSERPWD Login i lozinka upisani u formular ":" , koristi se pri povezivanju preko proxyja.
CURLOPT_RANDOM_FILE Ime datoteke koja se koristi za inicijalizaciju generatora slučajnih brojeva za SSL.
CURLOPT_RANGE Raspon podataka za preuzimanje, u formatu "X-Y", a X ili Y se mogu izostaviti. HTTP protokol također podržava prijenos više raspona odvojenih zarezima, oni su navedeni u formatu "X-Y,N-M".
CURLOPT_REFERER Sadržaj zaglavlja "Preporučilac:", koji će se koristiti u HTTP zahtjevu.
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 Niz koji sadrži 32 heksadecimalne cifre. Niz mora biti MD5 kontrolni zbir javnog ključa udaljenog računara, a libcurl će resetovati vezu sa udaljenim hostom sve dok se kontrolni zbir ne poklopi sa javnim ključem. Ova opcija je samo za prijenos podataka koristeći SCP i SFTP. Dodato u cURL 7.17.1.
CURLOPT_SSH_PUBLIC_KEYFILE Ime datoteke za vaš javni ključ. Ako nije navedeno, libcurl podrazumevano postavlja datoteku $HOME/.ssh/id_dsa.pub ako je varijabla okruženja HOME postavljena i datoteku "id_dsa.pub" u trenutnom direktoriju ako HOME varijabla okruženja nije postavljena. Dodato u cURL 7.16.1.
CURLOPT_SSH_PRIVATE_KEYFILE Ime datoteke za vaš privatni ključ. Ako nije navedeno, libcurl podrazumevano postavlja datoteku $HOME/.ssh/id_dsa ako je postavljena varijabla okruženja HOME i datoteku "id_dsa" u trenutnom direktoriju ako varijabla okruženja HOME nije postavljena. Ako je datoteka zaštićena lozinkom, postavite lozinku pomoću CURLOPT_KEYPASSWD. Dodato u cURL 7.16.1.
CURLOPT_SSL_CIPHER_LIST Spisak šifri koje se koriste u SSL transferima. Na primjer, RC4-SHA I TLSv1 su važeće liste šifriranja.
CURLOPT_SSLCERT Ime datoteke s ispravno formatiranim PEM certifikatom.
CURLOPT_SSLCERTPASSWD Za korištenje certifikata potrebna je lozinka CURLOPT_SSLCERT.
CURLOPT_SSLCERTTYPE Format sertifikata. Podržani formati "PEM"(zadano), "DER" I "ENG". Dodato u cURL verziji 7.9.3.
CURLOPT_SSLENGINE ID mehanizma za šifriranje za SSL privatni ključ naveden u parametru CURLOPT_SSLKEY.
CURLOPT_SSLENGINE_DEFAULT Identifikator mehanizma šifriranja koji se koristi za asimetrične operacije šifriranja.
CURLOPT_SSLKEY Naziv datoteke privatnog ključa SSL.
CURLOPT_SSLKEYPASSWD

Tajna lozinka potrebna za korištenje privatnog SSL ključa navedenog parametrom CURLOPT_SSLKEY.

Komentar:

Pošto ovaj parametar sadrži vrijednu lozinku, zapamtite da ovu PHP skriptu čuvate na sigurnom mjestu.

CURLOPT_SSLKEYTYPE Vrsta privatnog ključa SSL specificiranog u parametru CURLOPT_SSLKEY. Podržane su sljedeće vrste ključeva: "PEM"(zadano), "DER" I "ENG".
CURLOPT_URL URL za preuzimanje. Ovaj parametar se također može postaviti prilikom inicijalizacije sesije koristeći curl_init().
CURLOPT_USERAGENT Sadržaj zaglavlja "Korisnički agent: ", poslano u HTTP zahtjevu.
CURLOPT_USERPWD Prijava i lozinka korišteni tokom povezivanja, navedeni u formatu ":" .

Za sljedeće vrijednosti parametara opcije, parametar vrijednosti mora biti niz:

Parametar Postavite vrijednost vrijednosti Bilješke
CURLOPT_HTTP200ALIASES Niz HTTP 200 odgovora koji će se tretirati kao tačni odgovori, a ne kao pogrešni. Dodato u cURL verziji 7.10.3.
CURLOPT_HTTPHEADER Niz postavljenih HTTP zaglavlja, u formatu niz ("Tip sadržaja: tekst/običan", "Dužina sadržaja: 100")
CURLOPT_POSTQUOTE Niz FTP komandi koje se izvršavaju na serveru nakon što je FTP zahtjev završen.
CURLOPT_QUOTE Niz FTP komandi koje se izvršavaju na serveru prije upućivanja FTP zahtjeva.

Za sljedeće vrijednosti parametara opcije, parametar vrijednosti mora biti rukohvat toka (vraća ga, na primjer, funkcija fopen()):

Parametar Postavite vrijednost vrijednosti
CURLOPT_FILE Datoteka u koju će biti upisan rezultat prijenosa. Zadani izlazni tok STDOUT(prozor pretraživača).
CURLOPT_INFILE Datoteka iz koje se podaci trebaju čitati kada se uploaduju na server.
CURLOPT_STDERR Alternativni izlazni fajl greške koji se koristi umjesto toka greške STDERR.
CURLOPT_WRITEHEADER Datoteka u koju će biti upisana zaglavlja trenutne operacije.

Za sljedeće vrijednosti parametara opcije, parametar vrijednosti mora biti valjano ime funkcije ili zatvaranje:

Parametar Postavite vrijednost vrijednosti
CURLOPT_HEADERFUNCTION Funkcija povratnog poziva uzima dva parametra. Prvi parametar je cURL ručka, drugi parametar je niz koji sadrži zaglavlja koja će se napisati. Zaglavlja moraju biti napisana pomoću ove funkcije povratnog poziva. Trebalo bi vratiti broj upisanih bajtova.
CURLOPT_PASSWDFUNCTION Funkcija povratnog poziva uzima tri parametra. Prvi parametar je cURL ručka, drugi parametar je string upita za lozinku, a treći parametar je maksimalna dužina lozinke. Trebalo bi vratiti niz koji sadrži lozinku.
CURLOPT_PROGRESSFUNCTION

Funkcija povratnog poziva uzima pet parametara. Prvi je deskriptor cURL, drugi je ukupan broj bajtova za koje se očekuje da će biti preuzeti sa servera, treći je broj već preuzetih bajtova, četvrti je ukupan broj bajtova za koji se očekuje da će biti poslani na server, i peti je broj već poslanih bajtova.

Komentar:

Funkcija povratnog poziva poziva se samo ako je opcija CURLOPT_NOPROGRESS postaviti na vrijednost FALSE.

Možete vratiti vrijednost različitu od nule da otkažete prijenos. U tom slučaju će se prikazati greška CURLE_ABORTED_BY_CALLBACK.

CURLOPT_READFUNCTION Funkcija povratnog poziva uzima tri parametra. Prvi parametar je cURL ručka, drugi parametar je stream resurs proslijeđen cURL-u preko opcije CURLOPT_INFILE, a treći parametar je maksimalna dozvoljena količina podataka za čitanje. Funkcija povratnog poziva mora vratiti niz dužine koja nije veća od tražene količine podataka, obično čitanjem iz proslijeđenog izvora strujanja. Trebalo bi vratiti prazan string da signalizira kraj datoteke EOF.
CURLOPT_WRITEFUNCTION Funkcija povratnog poziva uzima dva parametra. Prvi parametar je cURL ručka, a drugi parametar je niz koji sadrži podatke koji će biti upisani. Podaci se moraju pohraniti pomoću ove funkcije. Mora vratiti tačan broj upisanih bajtova, inače će preuzimanje biti prekinuto uz grešku.

Ostala značenja:

Povratne vrijednosti

Povratak ISTINITO po uspješnom završetku ili FALSE u slučaju greške.

Lista promjena

Verzija Opis
5.6.0 Opcija CURL_SAFE_UPLOAD sada ima zadanu vrijednost od ISTINITO.
5.6.0 Uklonjena opcija CURLOPT_CLOSEPOLICY i njegova pridružena značenja.
5.5.0 Resurs cURL se dodaje kao prvi argument funkciji povratnog poziva CURLOPT_PROGRESSFUNCTION.
5.5.0 Dodata opcija CURLOPT_SHARE.
5.3.0 Dodata opcija CURLOPT_PROGRESSFUNCTION.
5.2.10 Dodane opcije CURLOPT_PROTOCOLS I CURLOPT_REDIR_PROTOCOLS.
5.1.0 Dodane opcije CURLOPT_AUTOREFERER, CURLOPT_BINARYTRANSFER, CURLOPT_FTPSSLAUTH, CURLOPT_PROXYAUTH I CURLOPT_TIMECONDITION.
5.0.0 Dodane opcije CURLOPT_FTP_USE_EPRT, CURLOPT_NOSIGNAL, CURLOPT_UNRESTRICTED_AUTH, CURLOPT_BUFFERSIZE, CURLOPT_HTTPAUTH, CURLOPT_PROXYPORT, CURLOPT_PROXYTYPE, CURLOPT_SSLCERTTYPE I CURLOPT_HTTP200ALIASES.

Primjeri

Primjer #1 Inicijalizacija CURL sesije i učitavanje web stranice

// kreiramo novi cURL resurs
$ch = curl_init();

/* http://localhost/upload.php:
print_r($_POST);
print_r($_FILES);
*/

$ch = curl_init();

$data = array("name" => "Foo" , "file" => "@/home/user/test.png" );

Curl_setopt($ch, CURLOPT_URL, "http://localhost/upload.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Curl_exec($ch);
?>

Rezultat pokretanja ovog primjera:

Niz ( => Foo) Niz ( => Niz ( => test.png => image/png => /tmp/phpcpjNeQ => 0 => 279))

Bilješke

Komentar:

Prosljeđivanje niza na CURLOPT_POSTFIELDS kodira podatke kao multipart/form-data, dok će prosljeđivanje URL kodiranog stringa kodirati podatke kao application/x-www-form-urlencoded.

cURL je alat koji vam omogućava interakciju sa različitim serverima i podržava mnoge protokole: HTTP, FTP, TELNET, itd. cURL je izvorno uslužni program komandne linije. Ali, na našu sreću, PHP podržava rad sa cURL bibliotekom. U ovom članku ćemo pogledati netrivijalne primjere rada sa cURL-om.

Zašto cURL?

U stvari, postoji mnogo drugih načina da se pošalje zahtjev drugom serveru za, na primjer, preuzimanje sadržaja stranice. Mnogi ljudi, uglavnom iz lijenosti, koriste jednostavne PHP funkcije umjesto cURL:

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

Međutim, oni ne dozvoljavaju efikasno rukovanje greškama. Postoji i niz zadataka koje oni uopće ne mogu obaviti - na primjer, rad s kolačićima, autorizacija, zahtjevi za objavljivanje, preuzimanje datoteka.

cUrl je moćan alat koji podržava više protokola i pruža potpune informacije o zahtjevu.

cUrl Basics

Pre nego što pređemo na složene primere, pogledajmo osnovnu strukturu cURL zahteva u PHP-u. Da biste izvršili cURL zahtjev u PHP-u, morate poduzeti 4 glavna koraka:

  1. Inicijalizacija.
  2. Opcije podešavanja.
  3. Izvršavanje zahtjeva.
  4. Sredstva za čišćenje.
// 1. inicijalizacija $ch = curl_init(); // 2. postaviti opcije, uključujući URL curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. izvršavanje zahtjeva i primanje odgovora $output = curl_exec($ch); // 4. čišćenje resursa curl_close($ch);

U ovom članku ćemo uglavnom gledati na korak #2 jer se tu dešava magija. Lista cURL opcija je vrlo velika, tako da danas nećemo razmatrati sve opcije, već ćemo koristiti one koje su korisne za rješavanje konkretnih problema.

Praćenje grešaka

Ako je potrebno, možete dodati sljedeće linije za praćenje grešaka:

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

Imajte na umu da koristimo “===” umjesto “==” jer Potrebno je razlikovati prazan odgovor servera i logičku vrijednost FALSE, koja se vraća u slučaju greške.

Dobivanje informacija o zahtjevu

Drugi opcioni korak je pribavljanje informacija o cURL zahtjevu nakon što se on izvrši.

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

Kao rezultat, dobit ćete niz sa sljedećim informacijama:

  • "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"

Praćenje preusmjeravanja, ovisno o pretraživaču

U ovom primjeru ćemo napisati skriptu koja će otkriti preusmjeravanja na osnovu različitih postavki pretraživača. Na primjer, neke web stranice preusmjeravaju posjetitelje s mobilnih uređaja na posjetitelje iz drugih zemalja.

Koristit ćemo opciju CURLOPT_HTTPHEADER da postavimo vlastita zaglavlja, uključujući User-Agent i Jezik, i vidimo kamo nas web lokacije preusmjeravaju.

// URL-ovi $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // pretraživači $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 kao Mac OS X; en) AppleWebKit/420+ (KHTML, kao Gecko) Verzija/3.0 Mobile/1A537a Safari/419.3", "language" => "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 ($browseri kao $test_name => $browser) ( $ch = curl_init(); // postavite adresu curl_setopt($ch, CURLOPT_URL) , $url); // označava pretraživač i jezik koji se koristi 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); // trebaju nam samo zaglavlja curl_setopt($ch, CURLOPT_HEADER, 1); // umjesto toga vraćamo rezultat njegovog izlaza curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); // definirati preusmjeravanja u HTTP zaglavljima? if (preg_match("!Location: (.*)!" , $output, $matches)) ( echo "$test_name: preusmjerava na $matches\n"; ) else ( echo "$test_name: nema preusmjeravanja\n"; ) ) echo "\n\n"; )

U petlji provjeravamo pretraživače za svaki URL. Prvo postavljamo opcije za naš zahtjev: URL i pretraživač i jezik za testiranje.

Jer Postavili smo posebnu opciju; rezultat zahtjeva će sadržavati samo HTTP zaglavlja. Koristeći jednostavan regularni izraz, možemo provjeriti da li odgovor sadrži string "Location:".

Rezultat izvršenja skripte:

URL: http://www.cnn.com standard: preusmjerava na http://edition.cnn.com/ iphone: preusmjerava na http://edition.cnn.com/ francuski: preusmjerava na http://edition.cnn .com/ URL: http://www.mozilla.com standard: preusmjerava na https://www.mozilla.org/firefox/ iphone: preusmjerava na https://www.mozilla.org/firefox/ francuski: preusmjerava na https://www.mozilla.org/firefox/ URL: http://www.facebook.com standard: preusmjerava na https://www.facebook.com/ iphone: preusmjerava na http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr francuski: nema preusmjeravanja

Slanje POST zahtjeva

Prilikom izvođenja GET zahtjeva, podaci se mogu proslijediti u nizu upita. Na primjer, kada pretražujete na Googleu, vaš upit se prevodi u URL:

http://www.google.com/search?q=google

Da biste dobili rezultat ovog upita, nije vam potreban cURL, možete biti lijeni i koristiti "file_get_contents()".

Ali neki HTML obrasci koriste POST metodu. U ovom slučaju, podaci se šalju u tijelu poruke zahtjeva, a ne u samom URL-u.

Hajde da napišemo skriptu koja će slati POST zahtjeve. Prvo, napravimo jednostavnu PHP datoteku koja će prihvatiti ove zahtjeve i vratiti podatke poslane u njega. Nazovimo to post_output.php :

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

Ova skripta će ispisati:

Niz ( => bar => FooBar => Pošalji)

Ova skripta je poslala POST zahtjev u post_output.php fajl. koji je izbacio sadržaj niza $_POST i dobili smo ovaj odgovor koristeći cURL.

Učitavanje fajlova

Kao u prethodnom primjeru, napravimo fajl koji će prihvatiti zahtjeve, upload_output.php :

Print_r($_FILES);

I sama skripta koja preuzima fajlove:

$url = "http://localhost/upload_output.php"; $post_data = niz ("foo" => "bar", // fajl za upload "upload" => "@/tmp/desert.jpg"); $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;

Ako želite da otpremite datoteku, sve što treba da uradite je da prosledite putanju do nje, baš kao i normalan parametar POST zahteva, sa prefiksom "@". Rezultat skripte:

Niz ( => Niz ( => desert.jpg => application/octet-stream => /tmp/phpAhEvXy => 0 => 845941))

Multi cURL

Jedna od naprednih karakteristika cURL-a u PHP-u je mogućnost izvršavanja više zahteva istovremeno i asinhrono.

U normalnim uslovima, skripta se zaustavlja i čeka da se zahtev završi. A ako trebate izvršiti puno upita, to može potrajati, jer... izvodit ćete uzastopno. Ovo ograničenje se može zaobići:

// kreiranje rukovaoca $ch1 = curl_init(); $ch2 = curl_init(); // postavlja opcije 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šestruku cURL ručku $mh = curl_multi_init(); // dodaj rukovaoce curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $running = null; // izvršavanje zahtjeva do ( curl_multi_exec($mh, $running); ) while ($running > 0); // oslobađanje resursa curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Ideja je da možete kreirati više cURL ručki, kombinovati ih pod jednim multi-handle-om i izvršavati ih asinhrono.

Prvo, sve je isto kao i kod običnog cURL zahtjeva - kreira se deskriptor ( curl_init() ), parametri su postavljeni ( curl_setopt() ). Zatim se kreira multi-deskriptor ( curl_multi_init() ) i dodaju se prethodno kreirani regularni deskriptori ( curl_multi_add_handle() ). Umjesto normalnog pozivanja curl_exec(), mi ćemo pozvati curl_multi_exec() ova funkcija nas obavještava o broju aktivnih veza koristeći drugi parametar - $running. Dakle, petlja se izvodi sve dok $running ne postane jednak 0. I, naravno, nakon završetka rada potrebno je osloboditi resurse.

U ovom primjeru jednostavno šaljemo rezultat upita u STDOUT. Razmotrimo netrivijalan slučaj upotrebe multi cURL.

Provjera vanjskih veza u WordPress-u

Zamislite blog sa puno postova koji sadrže veze ka vanjskim stranicama. Neki od ovih linkova možda neće raditi.

Hajde da napišemo skriptu koja će pronaći sve neispravne veze i pokazati nam ih.

Prvo, moramo povući sve vanjske veze iz baze podataka:

// KONFIGURACIJA $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "site"); $max_connections = 10; $url_list = niz(); $working_urls = niz(); $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()); ) // uzmi sve postove sa linkovima u tekstu $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)) ( // prikuplja sve linkove koristeći regularni izraz if (preg_match_all("/href=\"(.*?)\"/", $d["post_content"], $matches )) ( foreach ($ odgovara kao $url) ( // filtrirati nepotrebne domene $tmp = parse_url($url); if (isset($tmp["host"]) && in_array($tmp["host"], $ excluded_domains)) ( nastavi; ) // sastavljamo $url_list = $url; ) ) ) // uklonimo ponavljanja $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Nema URL za provjeru"); )

U ovom dijelu skripte jednostavno izvlačimo sve vanjske veze iz baze podataka. Provjerimo ih:

$mh = curl_multi_init(); // 1. dodaj veze za ($i = 0; $i< $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // основной цикл do { curl_multi_exec($mh, $curRunning); // 2. один из потоков завершил работу if ($curRunning != $running) { $mhinfo = curl_multi_info_read($mh); if (is_array($mhinfo) && ($ch = $mhinfo["handle"])) { // 3. один из запросов выполнен, можно получить информацию о нем $info = curl_getinfo($ch); // 4. нерабочая ссылка if (!$info["http_code"]) { $dead_urls = $info["url"]; // 5. 404? } else if ($info["http_code"] == 404) { $not_found_urls = $info["url"]; // 6. верная ссылка } else { $working_urls = $info["url"]; } // 7. удаляем отработавший дескриптор curl_multi_remove_handle($mh, $mhinfo["handle"]); curl_close($mhinfo["handle"]); // 8. добавим новый урл add_url_to_multi_handle($mh, $url_list); $running = $curRunning; } } } while ($curRunning >0); curl_multi_close($mh); echo "==Mrtvi URL-ovi==\n"; echo implode("\n", $dead_urls) . "\n\n"; echo "==404 URL-ova==\n"; echo implode("\n", $not_found_urls) . "\n\n"; echo "==Radni URL-ovi==\n"; echo implode("\n", $working_urls); echo "\n\n"; // 9. dodaje ručku sa datom URL funkcijom add_url_to_multi_handle($mh, $url_list) ( statički $index = 0; // ako još uvijek postoje veze if (isset($url_list[$index])) ( // sve je kao i obično $ ch = curl_init(); // postavi opcije curl_setopt($ch, CURLOPT_URL, $url_list[$index]); // vrati umjesto da prikaže rezultat curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // dozvoli preusmjerava curl_setopt($ ch, CURLOPT_FOLLOWLOCATION, 1); // dobijemo samo zaglavlja radi uštede vremena curl_setopt($ch, CURLOPT_NOBODY, 1); // dodaj u multi-handle curl_multi_add_handle($mh, $ch); $index++; ) )

Pogledajmo detaljnije kod (numeracija odgovara komentarima u kodu):

  1. Dodamo početni broj deskriptora kako ne bismo preopteretili sistem nitima. Broj kontroliše varijabla $max_connections.
  2. Varijabla $curRunning pohranjuje broj pokrenutih niti, $running pohranjuje prethodnu vrijednost; ako postanu nejednake, onda je jedna od niti završila rad.
  3. Primamo informacije o ispunjenom zahtjevu.
  4. Ako nema odgovora sa servera, veza ne radi.
  5. Odgovor servera je 404.
  6. Inače link radi.
  7. Zahtjev je ispunjen, oslobađamo resurse.
  8. Dodajmo novi URL u multi deskriptor.
  9. Funkcija add_url_to_multi_handle() dodaje novi rukohvat sa datim URL-om u multi-deskriptor.

Pokrenimo skriptu:

Mrtvi URL-ovi== xample1234.com/ ==404 URL-ova== www.google.com/dsfasdfafd ==Radni URL-ovi== ru.php.net/manual/ru/function.time.php www.cssbuttongenerator.com/ csslint. net/codex.wordpress.org/Plugin_API/Action_Reference fortawesome.github.io/Font-Awesome/ fortawesome.github.io/Font-Awesome/ www.oracle.com/technetwork/java/javafx/downloads/index.html codex. wordpress.org/Plugin_API/Filter_Reference codex.wordpress.org/Roles_and_Capabilities code.google.com/p/google-api-php-client/wiki/OAuth2#Google_APIs_Console jplayer.org/ code.google.com/p/google-api -php-client/ developers.google.com/+/ accounts.google.com/ServiceLogin?service=devconsole&passive=1209600&continue=https%3A%2F%2Fcode.google.com%2Fapis%2Fconsole%2F&followup=https%3A%2F %2Fcode.google.com%2Fapis%2Fconsole%2F daneden.github.io/animate.css/github.com/daneden/animate.css ru2.php.net/manual/ru/function.autoload.php www.google. com/recaptcha/api/verify phpunit.de/phpunit.de/manual/current/en/phpunit-book.html

Provjera je trajala oko 2 sekunde. Pokretanjem 10 niti istovremeno, performanse se povećavaju 10 puta u poređenju sa redovnim cURL zahtjevima. Da biste dobili sadržaj odgovora servera, koristite funkciju curl_multi_getcontent($ch) , gdje je $ch deskriptor dobiven iz curl_multi_info_read() .

Ostale cURL karakteristike u PHP-u

HTTP autentifikacija

Ako HTTP zahtjev zahtijeva autentifikaciju, koristite sljedeći kod:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // šalje korisničko ime i lozinku curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // ako su preusmjeravanja dozvoljena curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // cURL će poslati lozinku nakon preusmjeravanja curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);

Upload preko FTP-a

PHP ima svoju biblioteku za rad sa FTP-om, ali možete koristiti i cURL:

// čitanje datoteke $file = fopen("/path/to/file", "r"); // url već sadrži potrebne podatke $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); // opcije curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ ch);curl_close($ch);

Korištenje proxyja

Zahtjevi se mogu podnijeti putem određenog proxyja:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // proxy adresa curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // ako je potrebna autorizacija curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); curl_close($ch);

Funkcije povratnog poziva

Moguće je koristiti povratne pozive dok je zahtjev pokrenut, bez čekanja da se završi. Na primjer, dok se odgovor servera preuzima, možemo koristiti podatke koji smo već primili bez čekanja na potpuno preuzimanje.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://example.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 povratnog poziva mora vratiti dužinu niza da bi zahtjev ispravno funkcionirao.

Svaki put kada se primi sljedeći dio odgovora servera, bit će pozvan povratni poziv.

Zaključak

U ovom članku pogledali smo napredne karakteristike cURL-a u PHP-u. Sljedeći put kada budete trebali napraviti URL zahtjeve, koristite cURL.

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

Da biste riješili takve probleme i probleme sličnog raspona, možete koristiti uslužni program curl. Omogućuje vam rješavanje mnogo šireg spektra problema, uključujući čak i simulaciju 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 osnovne mogućnosti rada sa URL stranicama i prijenosa datoteka. Biblioteka podržava rad sa protokolima: 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 operacija s URL-ovima.

Podrška za curl biblioteku je dodana mnogim različitim programskim jezicima i platformama. Uslužni program curl je nezavisni omot za ovu biblioteku. Upravo na ovaj uslužni program ćemo se fokusirati u ovom članku.

naredba curl

Prije nego što pređemo na opis načina na koji se može koristiti naredba curl linux, pogledajmo sam uslužni program i njegove glavne opcije koje će nam trebati. 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 Cookie u datoteku;
  • -c- poslati kolačić na server iz datoteke;
  • -C- nastaviti sa preuzimanjem datoteke od tačke prekida ili određenog odstupanja;
  • -m- maksimalno vrijeme čekanja na odgovor od servera;
  • -d- slanje podataka POST metodom;
  • -D- sačuvati zaglavlja koje je server vratio u datoteku;
  • -e- postavite polje Referer-uri, naznačujući s koje stranice 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 se svi podaci navedeni u opciji -d prenijeti pomoću GET metode;
  • -H- transfer zaglavlja na server;
  • -Ja- primiti samo HTTP zaglavlje i 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- maksimalan broj preusmjeravanja 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- sačuvati vrijeme posljednje izmjene udaljene datoteke;
  • -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- prikaz verzije.

Ovo nikako nisu sve opcije za curl linux, ali navodi osnove koje ćete morati da koristite.

Kako koristiti curl?

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

Najčešći zadatak je ovo. Preuzimanje datoteke je vrlo jednostavno. Da biste to učinili, samo prenesite 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. Za pisanje u bilo koji 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 za administratora 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 koristeći opciju -Y:

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, koristite opciju -Y za ovo:

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

Prijenos fajlova

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

Ili provjerimo je li datoteka poslana putem HTTP-a; za to postoji posebna usluga:

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

U odgovoru će vam uslužni program 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 slanje podataka različitih oblika. Da biste poslali takav zahtjev, koristite opciju -d. 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 šaljete obrazac. Postoji opcija za ovo -F:

curl -F "password=@pass;type=text/plain" http://posttestserver.com/post.php

Ovdje prosljeđujemo polje lozinke sa formom kao običan tekst, na isti način možete proslijediti nekoliko parametara.

Slanje i primanje kolačića

Kolačiće koriste web stranice za pohranu određenih informacija na strani korisnika. Ovo može biti potrebno, na primjer, za autentifikaciju. Možete slati i primati 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 curl kolačić natrag:

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

Prijenos i analiza zaglavlja

Sadržaj stranice nam nije uvijek potreban. Ponekad samo naslovi mogu biti zanimljivi. Za prikaz samo njih postoji opcija -I:

curl -I https://site

A -H opcija vam omogućava da pošaljete nekoliko ili više na server, na primjer, možete proslijediti zaglavlje If-Modified-Since tako da se stranica vrati samo ako je izmijenjena:

curl autentikacija

Ako server zahtijeva jednu od uobičajenih vrsta provjere autentičnosti, kao što je HTTP Basic ili FTP, onda curl može vrlo lako riješiti ovaj zadatak. Da biste naveli detalje o autentifikaciji, jednostavno ih navedite odvojene dvotočkom u opciji -u:

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

Provjera autentičnosti na HTTP serverima će se izvršiti na isti način.

Korištenje proxyja

Ako trebate koristiti proxy server za preuzimanje datoteka, onda je i to vrlo jednostavno. Dovoljno je navesti 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 je potreban ovaj uslužni program i njegove glavne mogućnosti. Uprkos njihovoj sličnosti sa njima, oni su veoma različiti. Naredba curl linux je više dizajnirana za analizu i simulaciju različitih radnji na serveru, dok je wget pogodniji za preuzimanje datoteka i indeksiranje stranica.

Ovaj članak će govoriti o tako moćnom alatu kao što je cURL, kao i o biblioteci za PHP koja omogućava pristup ovom alatu - libcurl. čemu sve ovo? Za komunikaciju sa serverom koristeći protokole za prijenos podataka, na primjer, http ili ftp. Ostali protokoli nam nisu posebno zanimljivi, ako neko želi dublje proći u ovu temu, morat će iskopati resurse na engleskom jeziku, a ovaj članak će sadržavati osnove i primjere korištenja.

Šta su zapravo cURL i libcurl? Opšte tačke

Dakle, biblioteka libcurl nam pruža mogućnost da prenosimo podatke na server i primamo odgovore od njega. Šta nam ovo daje? Sposobnost oponašanja ponašanja korisnika ili ! Možete primati sadržaj stranica za naknadno raščlanjivanje, možete primati zaglavlja odgovora usluge i programski se prijavljivati ​​na stranice, kreirati skripte za postavljanje poruka (na primjer, na Twitteru ili na forumima) ili informacija. Sve je ograničeno samo vašom maštom!

Instaliranje cURL-a na Denwer (Denver). Kako početi koristiti libcurl?

Prva stvar koju treba da uradimo je da instaliramo biblioteku. Na svom lokalnom računaru koristim Denwer build, kao i velika većina webmastera početnika, kojima je članak namijenjen. Iskusni korisnici koji samostalno instaliraju kombinaciju php+apache+mysql moći će da instaliraju cURL, nije na meni da im objašnjavam kako se to radi;) A mi početnici koristimo gotova rješenja da to olakšamo. Stoga, instalirajte libcurl na sljedeći način:

  • Preuzmite gotovi paket proširenja “PHP5: dodatni moduli”.
  • Shodno tome, mi ga ugrađujemo. Nista komplikovano, slazem se :)
  • Otvorite datoteku u Notepad-u (uvijek preporučujem Notepad++): X:/webservers/usr/local/php5/php.ini //gdje je X vaš disk na kojem je instaliran web server

    i uklonite tačku i zarez na početku pojmova:

    ;extension=php_curl.dll

  • Ponovo pokrećemo Denver server.

Spreman. Da biste provjerili funkcionalnost biblioteke, možete pozvati funkciju phpinfo() i tamo pronaći liniju: cURL podrška je omogućena. Čestitam na prvoj pobjedi.

Opis cURL-a i prvih koraka

Da biste započeli rad s alatom, potrebno ga je inicijalizirati. To se radi na sljedeći način:

$ch = curl_init();

Koristili smo funkciju inicijalizacije cURL sesije. U ovom slučaju, URL možete postaviti odmah, ovako:

$ch = curl_init("https://site");

A to možete učiniti kasnije, u opcijama. Redoslijed kojim su opcije instalirane nije bitan. To radi druga funkcija:

Curl_setopt (resource ch, string opcija, mješovita vrijednost)

Već smo kreirali prvi parametar ove funkcije, odnosno resurs ch, odmah iznad, ali postoji puno parametara opcija i vrijednosti. Mislim da ne biste trebali sve kopirati i zalijepiti ovdje, već samo dajte link na detaljan opis funkcije, nadam se da se niko neće uvrijediti: curl_setopt.

Navest ću primjer postavljanja opcija koristeći URL kao primjer:

$url = "https://site"; curl_setopt($ch, CURLOPT_URL,$url);

Još par primjera opcija podešavanja: hajde da dobijemo zaglavlje odgovora servera, a da ne dobijemo samu stranicu:

Curl_setopt($ch, CURLOPT_HEADER, 1); // čitanje zaglavlja curl_setopt($ch, CURLOPT_NOBODY, 1); // čitati SAMO zaglavlje bez tijela

Dakle, inicijalizirali smo sesiju, postavili parametre koji su nam potrebni, sada izvršavamo rezultirajući zahtjev, zatvaramo sesiju i prikazujemo rezultat:

$result = curl_exec($ch); curl_close($ch); echo $result;

Kao rezultat, dobijamo naš prvi potpuno funkcionalan primjer korištenja biblioteke libcurl:

$ch = curl_init(); $url = "https://site"; curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 1); // čitanje zaglavlja curl_setopt($ch, CURLOPT_NOBODY, 1); // čitamo SAMO zaglavlje bez tijela $result = curl_exec($ch); curl_close($ch); echo $result;

Kako to funkcionira, nadam se, jasno je, jer smo svaki korak posmatrali posebno :) Kao rezultat toga, sa servera dobijamo HTTP zaglavlje odgovora, koje ćemo svakako analizirati u nastavku kako bismo bolje razumjeli sve faze interakcije između pretraživač i server:

HTTP/1.1 200 OK Server: nginx/1.2..php 1

Fabulous! Primili smo zaglavlje odgovora sa servera i testirali biblioteku u akciji. Koliko nam je ovo korisno? Jer sada možete otprilike zamisliti slijed radnji kada radite sa cURL:

  • Inicijaliziraj sesiju (curl_init)
  • Postavite opcije koje su nam potrebne (curl_setopt)
  • Izvršite primljeni zahtjev (curl_exec)
  • Završi sesiju (curl_close)

Struktura zaglavlja HTTP zahtjeva

Na primjer, okrenuo sam se na ya.ru stranicu i pogledao generirani zahtjev pretraživača i odgovor primljen od servera. Evo ih:
Zahtjev
GET / HTTP/1.1 - Pokušavamo da dobijemo stranicu na /, odnosno glavnu stranicu koja se nalazi u korenu fascikle. Koristimo verziju protokola 1.1.
Korisnički agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Verzija/12.14— Predstavljamo se serveru, mi smo pretraživač Opera.
Host: ya.ru — Ime domene traženog resursa.
Prihvati: text/html, application/xml;q=0,9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0,1— Lista prihvatljivih formata resursa.
Prihvati-jezik: ru-RU,ru;q=0,9,en;q=0,8— Lista podržanih jezika.
Accept-Encoding: gzip, deflate— Podržane metode kodiranja.
Kolačić: yandexuid=HHHHH - Kolačići, ako je potrebno.
Veza: Keep-Alive - Molimo vas da ne prekidate vezu i ostanite u kontaktu.
Odgovori
HTTP/1.1 200 Ok - Dobili smo odgovor sa kodom 200, što znači da je sve u redu.
Server: nginx - Server se predstavio - ovo je nginx.
Datum: Sun, 10 Mar 2013 14:10:50 GMT— Trenutni datum i vrijeme na serveru.
Content-Type: text/html; charset=UTF-8— Tip sadržaja i kodiranje.
Veza: zatvori - server ne želi da održava stalnu vezu sa nama, pa ga odmah zatvara. Nova veza će biti uspostavljena za sljedeći zahtjev.
Kontrola predmemorije: bez predmemorije, bez trgovine, max-age=0, mora se ponovo potvrditi— Upravljanje keširanjem. U ovom slučaju je onemogućen.
Ističe: ned, 10. mart 2013. 14:10:50 GMT— Datum očekivanog isteka sjednice. U našem slučaju se poklapa sa vremenom otvaranja, pošto ga je server odmah zatvorio, odmah nakon obrade.
Zadnja izmjena: Sun, 10 Mar 2013 14:10:50 GMT— Vrijeme posljednje izmjene.
Content-Encoding: gzip — Metoda kodiranja informacija.
Kompletna lista svih parametara koji se mogu naći u zaglavlju HTTP zahtjeva može se naći na Wikipediji.
Sada imate grubu ideju o tome kako vaš pretraživač i web server međusobno komuniciraju. Ovo je vrlo korisno znati i razumjeti, jer ćemo pokušati emulirati radnje pretraživača koristeći libcurl biblioteku. Nastavi.

Primjer rada sa bibliotekom

Vjerujem da je nakon što su neke opće točke već jasne i sve izgleda jasno, onda je vrijeme da pređete na praksu i usavršite svoje vještine koristeći primjere. Lično me uvijek svrbe ruke da probam sve u praksi :)

Pošto je cURL tako dobar za parsere, hajde da razmotrimo funkciju dobijanja koda stranice po njegovoj adresi. U ovom slučaju, izlaz će biti niz s naslovom, sadržajem stranice, pa čak i kodovima grešaka ako nešto krene po zlu.

Funkcija get_web_page($url) ( $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Verzija/12.14"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURN); // vraća web stranicu curl_setopt($ch, CURLOPT_HEADER, 0); // ne vraća zaglavlja curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // prati preusmjeravanja curl_setopt($ch, CURLOPT_ENCODING, ""); // obrađuje svi kodiranja curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // vremensko ograničenje veze curl_setopt($ch, CURLOPT_TIMEOUT, 120); // vremensko ograničenje odgovora $ch_setopt(CURLOPT_CONNECTTIMEOUT, 120); , 10); // zaustavljanje nakon 10. preusmjeravanja $content = curl_exec($ch); $err = curl_errno($ch); $errmsg = curl_error($ch); $header = curl_getinfo($ch); curl_close( $ ch); $header["errno"] = $err; $header["errmsg"] = $errmsg; $header["content"] = $content; vrati $header; )

Ulazni parametri:
url — adresa stranice ili web lokacije.
Vrijednosti izlaznih parametara (niz sa tri elementa):
header['errno'] - ako je nešto pošlo po zlu, ovdje će biti kod greške.
header[‘errmsg’] – tekst greške će se pojaviti ovdje.
header['content'] - stvarna stranica\fajl\slika, itd.

Koristimo funkciju, na primjer, ovako:

$result = get_web_page("https://ya.ru"); if (($result["errno"] != 0)||($result["http_code"] != 200)) ( echo $result["errmsg"]; ) else ( $page = $result["content "]; echo $page; )

Sve bi trebalo proći bez grešaka i dobićete kod stranice u varijabli $page. Ako pokušamo da dobijemo nepostojeću stranicu yaaaaaaaaaaaa.ru, dobićemo grešku:

Nije moguće riješiti host: yaaaaaaaaaaaa.ru; Host nije pronađen

Sve je obrađeno korektno i lijepo :)
Zatim možete raditi šta god želite sa kodom stranice, na primjer, raščlaniti ga pomoću regularnih izraza. Ali to je sve u narednim lekcijama, ali za sada se zaustavimo na ovome.

JavaScript je blokiran u vašem pretraživaču. Omogućite JavaScript da bi stranica funkcionisala!

Curl

PHP podržava libcurl, biblioteku koju je kreirao Daniel Stenberg i koja vam omogućava da se povežete na različite tipove servera i protokola.
libcurl trenutno podržava http, https, ftp, gopher, telnet, dict, file i ldap protokole.
libcurl takođe podržava HTTPS sertifikate, HTTP POST, HTTP PUT, FTP upload (ovo se takođe može uraditi sa ftp PHP ekstenzijom), HTTP otpremanje zasnovano na obrascima, proksije, kolačiće i autentifikaciju korisnika i lozinke.

Ove funkcije su uvedene u PHP 4.0.2.

curl_init

curl_init - inicijalizira CURL sesiju.

Opis

resurs curl_init()

Funkcija curl_init() inicijalizira novu sesiju i vraća CURL ručku za korištenje u funkcijama i. Ako je opcioni parametar url je dostavljen, onda će opcija CURLOPT_URL primiti vrijednost ovog parametra. Možete ga ručno instalirati pomoću .

curl_setopt

curl_setopt - postavlja opcije za CURL transfer/transfer.

Opis

bool curl_setopt(resource ch, string opcija, mješovita vrijednost)

Funkcija curl_setopt() postavlja opcije za CURL sesiju identificiranu parametrom ch. Parametar opcija je opcija koju želite postaviti, i vrijednost ovo je vrijednost opcije opcija .

Parametar vrijednost mora biti dugačak za sljedeće opcije (određene parametrom opcija):

  • CURLOPT_INFILESIZE: Ako otpremate datoteku na udaljenu lokaciju, ovu opciju treba koristiti da kažete PHP-u koja će biti očekivana veličina infilea.
  • CURLOPT_VERBOSE: Postavite ovu opciju na vrijednost različitu od nule ako želite da CURL prijavi sve radnje.
  • CURLOPT_HEADER: Postavite ovu opciju na vrijednost koja nije nula ako želite da se zaglavlje uključi u izlaz.
  • CURLOPT_NOPROGRESS: Postavite ovu opciju na vrijednost različitu od nule ako ne želite da PHP prikazuje indikator napredovanja prijenosa CURL-a. (PHP automatski postavlja ovu opciju na vrijednost različitu od nule; trebate je promijeniti samo prilikom otklanjanja grešaka.)
  • CURLOPT_NOBODY: Postavite ovu opciju na vrijednost koja nije nula ako ne želite da tijelo bude uključeno u izlaz.
  • CURLOPT_FAILONERROR: Postavite ovu opciju na vrijednost različitu od nule ako želite da PHP tiho izađe ako je vraćeni HTTP kod veći od 300. Podrazumevano, stranica se vraća normalno sa zanemarenim kodom.
  • CURLOPT_UPLOAD: Postavite ovu opciju na vrijednost koja nije nula ako želite da PHP pripremi datoteku za učitavanje.
  • CURLOPT_POST: Postavite ovu opciju na vrijednost koja nije nula ako želite da PHP izvodi običan HTTP POST. Ovaj POST je u normalnom obliku application/x-www-form-urlencoded, koji se najčešće koristi u HTML formama.
  • CURLOPT_FTPLISTONLY: Postavite ovu opciju na vrijednost koja nije nula i PHP će izlistati imena FTP direktorija.
  • CURLOPT_FTPAPPEND: Postavite ovu opciju na vrijednost koja nije nula i PHP će se dodati udaljenoj datoteci umjesto da je prepiše.
  • CURLOPT_NETRC: Postavite ovu opciju na vrijednost različitu od nule i PHP će skenirati vašu ~./netrc datoteku da pronađe vaše korisničko ime i lozinku za udaljenu lokaciju na koju se povezujete.
  • CURLOPT_FOLLOWLOCATION: Postavite ovu opciju na vrijednost različitu od nule da biste pratili bilo koje zaglavlje "Location: " koje server šalje kao dio HTTP zaglavlja (imajte na umu da je ovo rekurzija, PHP će pratiti sva "Location: " -headers" koja se šalju. )
  • CURLOPT_PUT: Postavite ovu opciju na vrijednost koja nije nula za HTTP PUT fajl. Datoteka za PUT se mora postaviti pomoću CURLOPT_INFILE i CURLOPT_INFILESIZE.
  • CURLOPT_MUTE: Postavite ovu opciju na vrijednost različitu od nule i PHP će raditi skriveno u odnosu na CURL funkcije.
  • CURLOPT_TIMEOUT: Proslijedite long kao parametar koji sadrži maksimalno vrijeme u sekundama za koje dopuštate pokretanje CURL funkcija.
  • CURLOPT_CONNECTTIMEOUT: Proslijedi long kao parametar koji sadrži maksimalno vrijeme, u sekundama, koje dozvoljavate da čekate prilikom pokušaja povezivanja. Koristite 0 da čekate zauvijek.
  • CURLOPT_LOW_SPEED_LIMIT: Proslijedite long kao parametar koji sadrži brzinu prijenosa, u bajtovima u sekundi, ispod koje se prijenos mora pokrenuti tokom izvršavanja CURLOPT_LOW_SPEED_TIME, u sekundama, da bi PHP smatrao da je prespor i prekinuo ga.
  • CURLOPT_LOW_SPEED_TIME: Proslijedite long kao parametar koji sadrži vrijeme u sekundama ispod kojeg se prijenos mora pokrenuti dok je pokrenut CURLOPT_LOW_SPEED_LIMIT da bi PHP smatrao da je prespor i prekinuo ga.
  • CURLOPT_RESUME_FROM: Prolazi kao parametar koji sadrži pomak bajta na kojem prijenos treba započeti.
  • CURLOPT_SSLVERSION: Proslijedite long kao parametar koji sadrži SSL verziju za korištenje (2 ili 3). Podrazumevano, PHP to pokušava sam da odredi, mada se u nekim slučajevima od vas traži da to podesite ručno.
  • CURLOPT_SSL_VERIFYHOST: Prođite dugo ako CURL treba provjeriti zajednički naziv istovrsnog certifikata u SSL rukovanju. Vrijednost 1 označava da bismo trebali provjeriti postojanje zajedničkog /zajedničkog imena, vrijednost 2 označava da bismo trebali osigurati da se podudara s navedenim imenom hosta.
  • CURLOPT_TIMECONDITION: Proslijedite long kao parametar koji određuje kako se CURLOPT_TIMEVALUE tretira. Ovaj parametar možete postaviti na TIMECOND_IFMODSINCE ili TIMECOND_ISUNMODSINCE. Ovo radi samo za HTTP.
  • CURLOPT_TIMEVALUE: Proslijedite long kao parametar, što je vrijeme u sekundama od 1. januara 1970. Ovo vrijeme se koristi kako je navedeno u opciji CURLOPT_TIMEVALUE, ili će se koristiti zadani TIMECOND_IFMODSINCE.
  • CURLOPT_RETURNTRANSFER: Proslijedite vrijednost različitu od nule ako želite da CURL direktno vrati primljene informacije umjesto da ih direktno ispisuje.

Parametar vrijednost mora biti string za sljedeće vrijednosti parametara opcija :

Sljedeće opcije očekuju deskriptor datoteke, koji se dobija pomoću funkcije fopen() :

  • CURLOPT_FILE: Datoteka u koju treba staviti izlaz vašeg prijenosa, po defaultu je STDOUT.
  • CURLOPT_INFILE: Datoteka iz koje dolazi vaš unos za prijenos.
  • CURLOPT_WRITEHEADER: Datoteka za snimanje dijela zaglavlja izlaza.
  • CURLOPT_STDERR: Datoteka za snimanje grešaka, umjesto stderr.

Parametar vrijednost long write_callback (resource ch, string data)( ... return strlen($data);) opcija :

  • CURLOPT_WRITEFUNCTION: .
  • CURLOPT_HEADERFUNCTION: .

Parametar vrijednost treba biti funkcija sljedećeg oblika string read_callback (resurs ch, resurs fd, duga dužina)() za sljedeće vrijednosti parametara opcija :

  • CURLOPT_READFUNCTION: .

curl_exec

curl_exec - izvršava CURL sesiju.

Opis

bool curl_exec(resource ch)

Ovu funkciju treba pozvati nakon što ste inicijalizirali CURL sesiju i sve opcije za tu sesiju su već postavljene. Njegova svrha je jednostavno da izvrši unaprijed definiranu CURL sesiju (navedenu u parametru ch).

curl_close

curl_close - zatvara CURL sesiju.

Opis

void curl_close(resource ch)

Ova funkcija zatvara CURL sesiju i oslobađa sve resurse. CURL ručka ch također se briše.

curl_errno

curl_errno - vraća cijeli broj koji sadrži posljednji broj greške.

Opis

Primjer 1: Inicijalizacija nove CURL sesije i preuzimanje web stranice.
Primjer 2: Upotreba PHP-ovog CURL modula za dobivanje example.com
Primjer 3: Provjera pristupačnosti URL-a pomoću PHP-ove CURL
Primer 4: Odvajanje zaglavlja od tela dobijenog korišćenjem PHP-ovog CURL-a
Primer 5: Određivanje URL-a preporuke pomoću PHP-ovog CURL-a
problem: curl_setopt($ch,FOLLOW_LOCATION,1); greška: problem sa open_basedir i safe_mode rešenje: funkcija koju je neko već razvio rešenje n 2: ista funkcija, modifikovana, odlično radi za mene..= $curl_max_loops) ( $curl_loops = 0; vrati FALSE; ) curl_setopt($ch, CURLOPT_HEADER, istina); curl_setopt($ch, CURLOPT_RETURNTRANSFER, istina); $data = curl_exec($ch); list($header, $data) = explode("\n\n", $data, 2); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 301 || $http_code == 302) ( $matches = ; preg_match("/Location:(.*?)\n/", $header, $matches); $url = @parse_url(trim (array_pop($matches))); if (!$url) ( //nije mogao obraditi url za preusmjeravanje na $curl_loops = 0; vrati $data; ) $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)) ; if (!$url["scheme"]) $url["scheme"] = $last_url["scheme"]; if (!$url["host"]) $url["host"] = $last_url[ "host"]; if (!$url["path"]) $url["path"] = $last_url["path"]; $new_url = $url["scheme"] . "://" . $. url["host"] . $url["path"] . ($url["query"]?"?".$url["query"]:""); curl_setopt($ch, CURLOPT_URL, $new_url) ; debug("Preusmjeravanje na", $new_url); return curl_redir_exec($ch); ) else ( $curl_loops=0; vrati $data; ) ) ?>
samo koristite ovu funkciju bez de FOLLOW_LOCATION i trebalo bi da radi. problem je bio u tome što kada dođete do linije u koju vraćate podatke ako je http_code drugačiji od 301 ili 302, $data ima zastarjele informacije ili ih nema. tako da $debbbb radi posao.
Primjer 6: Parsiranje kolačića iz zaglavlja pomoću CURL PHP-a
Ponekad ne možete koristiti CURLOPT_COOKIEJAR i CURLOPT_COOKIEFILE zbog php-settinga servera (Kažu da možete uzeti bilo koji fajl sa servera koristeći ove opcije). Evo rješenja 1)Nemojte koristiti CURLOPT_FOLLOWLOCATION 2)Koristite curl_setopt($ch, CURLOPT_HEADER, 1) 3) Uzmite iz zaglavlja kolačiće 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);
Primjer 7: Parsiranje kolačića iz zaglavlja korištenjem CURL PHP-a
Kao što je Yevgen ranije spomenuo, ponekad ne možemo koristiti CURLOPT_COOKIEJAR i CURLOPT_COOKIEFILE. Ispod je funkcija povratnog poziva zaglavlja koju sam napisao još u januaru i koja vam omogućava da održavate kolačiće između cURL zahtjeva. Kolačići se dodaju u $ch tokom svih zahtjeva čak i tokom preusmjeravanja, tako da možete koristite ga zajedno sa CURLOPT_FOLLOWLOCATION Evo koda: function read_header($ch, $string) (globalna $location; #prati lokaciju/preusmjerava globalno $cookiearr; #pohrani kolačiće ovdje globalno $ch; # ^nadjača param funkcije $ch # ovo je u redu jer moramo # ažurirati globalni $ch sa # novim kolačićima $length = strlen($string); if(!strncmp($string, "Location:", 9)) ( #pratite zadnje preusmjeravanje $location = trim(substr($string, 9, -1)); ) if(!strncmp($string, "Set-Cookie:", 11)) ( #dobiti kolačić $cookiesstr = trim(substr( $string, 11, -1)); $cookie = explode(";", $cookiesstr); $cookie = explode("=", $cookie); $cookiename = trim(array_shift($cookie)); $cookiearr [$cookiename] = trim(implode("=", $cookie)); ) $cookie = ""; if(trim($string) == "") ( #izvrši samo na kraju zaglavlja foreach ($cookiearr kao $key=>$value) ($cookie .= "$key=$value; "; ) curl_setopt ($ ch, CURLOPT_COOKIE, $kolačić); ) return $length; ) curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_header"); Ovaj kod pretpostavlja da ćete ponovo koristiti $ch bez inicijalizacije svaki put (pozovite curl_init samo jednom, na početku). Ako trebate ponovo inicijalizirati $ch u bilo kojem trenutku u vašem kodu, možete pristupiti trenutno pohranjenim kolačićima u $cookiearr i uključiti ih u novi $ch. Napisao sam ovu funkciju prije nego što sam imao dovoljno iskustva s regularnim izrazima tako da ovdje nećete naći nikakve preg_match pozive. Koristio sam ovaj kod već duže vrijeme i bez ikakvih problema pristupam gmailu, yahoou, hotmailu, aol-u itd. gdje sam morao proći kroz prijavu i nekoliko stranica prije nego što dođem do onoga što sam tražio.
Primjer 8: Postavljanje rukovaoca opterećenja zaglavlja koristeći CURL PHP
Koristeći cURL, morao sam da pozovem skriptu treće strane koja je vraćala binarne podatke kao prilog kako bih ponovo prenela preuzete podatke kao prilog. Problem je bio u tome što je skripta treće strane povremeno vraćala HTTP greške i želio sam izbjeći prosljeđivanje priloga nulte dužine u takvim slučajevima. Kombinacija korištenja povratnog poziva CURLOPT_FAILONERROR i CURLOPT_HEADERFUNCTION pomogla je da se uredno obrade HTTP greške skripte treće strane: funkcija curlHeaderCallback($resURL, $strHeader) ( if (preg_match("/^HTTP/i", $strHeader)) (zaglavlje($strHeader) ); header("Content-Disposition: attachment; filename="file-name.zip""); ) return strlen($strHeader); ) $resURL = curl_init("http://site/"); curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1); curl_setopt($resURL, CURLOPT_HEADERFUNCTION, "curlHeaderCallback"); curl_setopt($resURL, CURLOPT_FAILONERROR, 1); curl_exec($resURL); $intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE); curl_close($resURL); if ($intReturnCode != 200) ( ispisati "Greška s kodom: " . $intReturnCode; )
Primer 9. Čuvanje stranice u fajlu i izračunavanje brzine prenosa koristeći CURL PHP
WritePageToFile("http://es.php.net", "es.php.net.txt"); funkcija WritePageToFile($sHTMLpage, $sTxtfile) ( $sh = curl_init($sHTMLpage); $hFile = FOpen($sTxtfile, "w"); curl_setopt($sh, CURLOPT_FILE, $hFile); curl_setopt($sh, CURLOPT_HEADER, CURLOPT_ 0); curl_exec ($sh); $sAverageSpeedDownload = curl_getInfo($sh, CURLINFO_SPEED_DOWNLOAD); $sAverageSpeedUpload = curl_getInfo($sh, CURLINFO_SPEED_UPLOAD); echo "
"; echo "Prosječna brzina preuzimanja == " . $sAverageSpeedDownload ." 
"; echo "Prosječna brzina upload == " . $sAverageSpeedUpload ."
"; eho"
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo "
"; curl_close($sh); FClose ($hFile); echo "( Pogledajte fajl ".$sTxtfile."" na istoj putanji hostinga." " do mesta gde je ova skripta PHP).
"; }
Primjer 9. Prijem stranice putem SSL veze (https)
$ch=curl_init("https://site"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Onemogućite grešku "Problem sa SSL certifikatom, provjerite da li je CA certifikat u redu" curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Onemogući grešku "SSL: naziv subjekta certifikata "hostname.ru" ne odgovara nazivu ciljnog hosta "123.123"" curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $out=curl_exec($ch); //$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //echo "http_code=".$http_code,", err=".curl_error($ch); curl_close($ch);
Primjer 10: Korištenje sesija i kolačića u curl-u
$cookie_filename=sys_get_temp_dir()+"/cookie.tmp"; $curl=curl_init("http://site"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename);//sačuvajte primljene COOKIE u datoteku curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //šaljemo na server kolačiće koje su od njega primljene tokom autorizacije $out=curl_exec($curl);
Primjer 11: Prijenos datoteke i višedimenzionalni niz u Curl-u. CURLOPT_POSTFIELDS + CurlFile

Ako trebate poslati višedimenzionalni niz i datoteku u POST zahtjevu, naići ćete na nerješivi problem. Ako prosledite višedimenzionalni niz u CURLOPT_POSTFIELDS, drugi nivo će biti prosleđen kao niz "Niz". Ako konvertujete koristeći http_build_query, nećete moći prenijeti datoteku.

Ispod je funkcija za kodiranje dvodimenzionalnog niza sa učitavanjem datoteke za Curl, koja će raditi u obje starije verzije PHP-a 5.3, PHP 5.4 i PHP 5.6

/** pretvara višedimenzionalni niz u jednodimenzionalni niz koristeći složene indekse i zamjenjuje @ u prefiksu sa CurlFile za upotrebu u Curl * @param $inputArray * @param string $inputKey * @return niz $requestVars = array ("id" => array( 1, 2,"id"=>1234), "name" => "log", "logfile" => "@/tmp/test.log"); dobijamo: ["id"]=> int(1) ["id"]=> int(2) ["id"]=> int(1234) ["name"]=> string(3) "log" [ "logfile"]=> string(13) "/tmp/test.log" ) */ funkcija convertToStringArray($inputArray, $inputKey="") ( $resultArray=; foreach ($inputArray kao $key => $value ) ( $tmpKey = (bool)$inputKey ? $inputKey."[$key]" : $ključ; if (is_array($value)) ( $resultArray+=convertToStringArray($value, $tmpKey); ) elseif ($value = = "@")( $resultArray[$tmpKey] = (class_exists(" CURLFile ", false)) ? novi CurlFile(ltrim($value, "@")) : $value; ) ostalo ( $resultArray[$tmpKey ] = $value; ) ) return $resultArray; ) // provjerite $requestVars = array("id" => array(1, 2,"id"=>1234), "name" => "log", "logfile " => "@/tmp/test.log"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "stranica"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars)); $res = curl_exec($ch); curl_close($ch); Primjeri primjene korištenja Curl-a