PHP CURL - funcții și exemple de utilizare. Utilizarea avansată a cURL în opțiunile liniei de comandă PHP Curl

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

curl_setopt — Setează un parametru pentru sesiunea CURL

Lista parametrilor

mânerul cURL obținut de la curl_init().

Parametru de setat CURLOPT_XXX.

Valoarea parametrului de opțiune.

bool:

Parametru Note
CURLOPT_AUTOREFERER ADEVĂRAT pentru setarea automată pe teren Referitor:în cererile redirecționate prin antet Locație:.
CURLOPT_BINARYTRANSFER ADEVĂRAT pentru a returna răspunsul brut atunci când se utilizează o constantă CURLOPT_RETURNTRANSFER. Începând cu PHP 5.1.3, această opțiune nu mai este necesară: rezultatul brut este întotdeauna returnat atunci când se utilizează opțiunea CURLOPT_RETURNTRANSFER.
CURLOPT_COOKIESESSION ADEVĂRAT pentru a instrui sesiunea curentă să înceapă o nouă „sesiune” de cookie-uri. Acest lucru va face ca libcurl să ignore orice cookie-uri „de sesiune” pe care ar fi trebuit să le încarce din sesiunea anterioară. În mod implicit, libcurl salvează și încarcă întotdeauna toate cookie-urile, indiferent dacă sunt „sesiuni” sau nu. Cookie-urile „de sesiune” sunt cookie-uri care nu expiră și trebuie să existe doar pentru „sesiunea” curentă.
CURLOPT_CERTINFO ADEVĂRAT pentru a scoate în flux informații despre certificatul SSL STDERR cu conexiuni sigure. Adăugat în cURL 7.19.1. Disponibil începând cu PHP 5.3.2. Necesită ca această opțiune să fie activată pentru o funcționare corectă CURLOPT_VERBOSE.
CURLOPT_CONNECT_ONLY ADEVĂRAT spune bibliotecii să efectueze autentificarea proxy și configurarea conexiunii necesare, dar nu transmite date. Această opțiune este implementată pentru HTTP, SMTP și POP3. Adăugat în 7.15.2. Disponibil de la PHP 5.5.0.
CURLOPT_CRLF ADEVĂRAT pentru a converti terminațiile de linie Unix în CRLF.
CURLOPT_DNS_USE_GLOBAL_CACHE ADEVĂRAT pentru a utiliza cache-ul DNS global. Această opțiune nu este sigură pentru fire și este activată implicit.
CURLOPT_FAILONERROR ADEVĂRAT pentru un raport detaliat despre eșec dacă codul HTTP primit este mai mare sau egal cu 400. Comportamentul implicit returnează pagina normal, ignorând codul.
CURLOPT_FILETIME ADEVĂRAT pentru a încerca să obțineți data modificării unui document de la distanță. Această valoare poate fi obținută folosind parametrul CURLINFO_FILETIME din funcție curl_getinfo().
CURLOPT_FOLLOWLOCATION ADEVĂRAT să urmeze orice titlu "Locație: " trimis de server în răspunsul său (rețineți că acest lucru se întâmplă recursiv, PHP va urma orice antet trimis "Locație: ", cu excepția cazului în care este setată o constantă CURLOPT_MAXREDIRS).
CURLOPT_FORBID_REUSE ADEVĂRAT pentru a forța închiderea unei conexiuni după finalizarea procesării acesteia, astfel încât să nu poată fi reutilizată.
CURLOPT_FRESH_CONNECT ADEVĂRAT pentru a forța utilizarea unei noi conexiuni în locul uneia stocate în cache.
CURLOPT_FTP_USE_EPRT ADEVĂRAT pentru a utiliza EPRT (și LPRT) pentru încărcări FTP active. Utilizare FALS pentru a dezactiva EPRT și LPRT și utilizați numai PORT.
CURLOPT_FTP_USE_EPSV ADEVĂRAT pentru testarea inițială a comenzii EPSV în timpul transferurilor FTP. Dacă comanda eșuează, va reveni la PASV. Instalați în FALS pentru a dezactiva EPSV.
CURLOPT_FTP_CREATE_MISSING_DIRS ADEVĂRAT pentru a crea directoare lipsă dacă o operațiune FTP întâlnește o cale inexistentă.
CURLOPT_FTPAPPEND ADEVĂRAT pentru a scrie un fișier la distanță până la sfârșit, în loc să îl suprascrieți peste un fișier existent.
CURLOPT_TCP_NODELAY Specifică permanent dacă opțiunea TCP_NODELAY ar trebui să fie setată sau ștearsă (1 = setat, 0 = șters). În mod implicit, opțiunea este ștearsă. Disponibil din PHP 5.2.1 pentru versiunile construite cu libcurl 7.11.2 sau o versiune ulterioară.
CURLOPT_FTPASCII Poreclă CURLOPT_TRANSFERTEXT. Folosește asta în schimb.
CURLOPT_FTPLISTONLY ADEVĂRAT pentru a returna doar o listă de nume din directorul FTP.
CURLOPT_HEADER ADEVĂRAT pentru a include antete în ieșire.
CURLINFO_HEADER_OUT ADEVĂRAT pentru a urmări șirul de interogare de mâner. Disponibil începând cu PHP 5.1.3. Prefix CURLINFO_ folosit în mod specific.
CURLOPT_HTTPGET ADEVĂRAT pentru a reseta metoda de solicitare HTTP la metoda GET. Deoarece GET este implicit, acest parametru este necesar doar dacă metoda de solicitare a fost modificată anterior.
CURLOPT_HTTPPROXYTUNNEL ADEVĂRAT pentru a tunel prin proxy-ul HTTP specificat.
CURLOPT_MUTE ADEVĂRAT pentru a dezactiva complet mesajele cu funcția cURL. Eliminat în cURL 7.15.5 (opțiunea CURLOPT_RETURNTRANSFER poate fi utilizată)
CURLOPT_NETRC ADEVĂRAT pentru a citi fișierul ~/.netrc pentru login și parola pentru site-ul la distanță cu care se stabilește conexiunea.
CURLOPT_NOBODY ADEVĂRAT pentru a exclude corpul răspunsului din ieșire. Metoda de solicitare este setată la HEAD. Schimbând această setare în FALS nu îl schimbă înapoi în GET.
CURLOPT_NOPROGRESS

ADEVĂRAT pentru a dezactiva indicatorul de progres la transferurile cURL.

cometariu:

PHP setează automat acest parametru la ADEVĂRAT, schimbați-l numai în scopuri de depanare.

CURLOPT_NOSIGNAL ADEVĂRAT pentru a ignora orice funcție cURL care trimite semnale către procesul PHP. Această opțiune este activată implicit în SAPI-urile cu mai multe fire pentru a permite parametrilor de expirare să funcționeze corect.
CURLOPT_POST ADEVĂRAT pentru a utiliza HTTP POST obișnuit. Această metodă POST folosește metoda normală , folosit în mod obișnuit în formularele HTML.
CURLOPT_PUT ADEVĂRAT pentru a descărca un fișier folosind metoda HTTP PUT. Fișierul utilizat trebuie setat folosind opțiunile CURLOPT_INFILEȘi CURLOPT_INFILESIZE.
CURLOPT_RETURNTRANSFER ADEVĂRAT pentru a returna rezultatul transferului ca șir din curl_exec()în loc de ieșire directă către browser.
CURLOPT_SAFE_UPLOAD ADEVĂRAT pentru a dezactiva suportul pentru prefix @ pentru fișierele descărcate în CURLOPT_POSTFIELDS, ceea ce înseamnă că valorile trecute cu @ pot fi transmise în siguranță ca câmpuri. În loc de un prefix, puteți folosi opțiunea CURLFile d. Adăugat în PHP 5.5.0 cu valoarea implicită FALS. În PHP 5.6.0 a devenit egal cu implicit ADEVĂRAT.
CURLOPT_SSL_VERIFYPEER FALS pentru a opri cURL să verifice certificatul gazdă. Certificatele alternative de verificat pot fi specificate folosind parametrul CURLOPT_CAINFO sau directorul cu certificate specificate de parametru CURLOPT_CAPATH. Implicit este ADEVĂRAT din versiunea cURL 7.10. Distribuția implicită este instalată începând cu versiunea cURL 7.10.
CURLOPT_TRANSFERTEXT ADEVĂRAT pentru a utiliza modul ASCII pentru transferurile FTP. Când utilizați LDAP, datele sunt returnate în text simplu în loc de HTML. Pe sistemele Windows firul STDOUT nu se setează în modul binar.
CURLOPT_UNRESTRICTED_AUTH ADEVĂRAT pentru a continua trimiterea numelui de autentificare și a parolei în timpul redirecționărilor (când utilizați CURLOPT_FOLLOWLOCATION), chiar dacă numele de gazdă se schimbă.
CURLOPT_UPLOAD ADEVĂRAT pentru a se pregăti pentru încărcarea fișierului pe server.
CURLOPT_VERBOSE ADEVĂRAT pentru a afișa informații suplimentare. Scrie rezultate într-un flux STDERR, sau fișierul specificat de parametru CURLOPT_STDERR.

Pentru următoarele valori ale parametrilor de opțiune, parametrul de valoare trebuie să fie de tip întreg:

Parametru Setați valoarea valorii Note
CURLOPT_BUFFERSIZE Dimensiunea buffer-ului utilizat pentru fiecare citire. Cu toate acestea, nu există nicio garanție că această solicitare va fi finalizată. Adăugat în cURL 7.10.
CURLOPT_CLOSEPOLICY Una dintre constante CURLCLOSEPOLICY_*.

cometariu:

Această opțiune este depreciată deoarece nu a fost niciodată implementată în cURL și nu a funcționat.

Eliminat în PHP 5.6.0.
CURLOPT_CONNECTTIMEOUT Numărul de secunde de așteptat când încercați să vă conectați. Folosiți 0 pentru a aștepta la nesfârșit.
CURLOPT_CONNECTTIMEOUT_MS Numărul de milisecunde de așteptat când încercați să vă conectați. Folosiți 0 pentru a aștepta la nesfârșit. Dacă libcurl este compilat folosind soluția standard de nume a sistemului, atunci conexiunea va folosi totuși o secundă întreagă de așteptare ca timeout, cu un timeout minim permis de 1 secundă. Adăugat în versiunea cURL 7.16.2. Disponibil începând cu PHP 5.2.3.
CURLOPT_DNS_CACHE_TIMEOUT Numărul de secunde în care înregistrările DNS sunt stocate în memorie. În mod implicit, acest parametru este 120 (2 minute).
CURLOPT_FTPSSLAUTH Metoda de autentificare FTP (în modul activ): CURLFTPAUTH_SSL(SSL este verificat mai întâi), CURLFTPAUTH_TLS(TLS a verificat mai întâi) sau CURLFTPAUTH_DEFAULT(cURL decide singur). Adăugat în versiunea cURL 7.12.2.
CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE (în mod implicit, CURL alege ce versiune să folosească), CURL_HTTP_VERSION_1_0 (forță HTTP/1.0) sau CURL_HTTP_VERSION_1_1 (forță HTTP/1.1).
CURLOPT_HTTPAUTH

Puteți utiliza operatorul pe biți | (sau) să combine mai multe metode împreună. În acest caz, cURL va sonda serverul pentru metodele de autorizare acceptate și o va selecta pe cea mai bună.

CURLAUTH_ANY este un alias CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLAUTH_ANYSAFE este un alias CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLOPT_INFILESIZE Dimensiunea așteptată a fișierului, în octeți, la încărcarea unui fișier pe un server la distanță. Vă rugăm să rețineți că utilizarea acestei opțiuni nu va opri trimiterea de date suplimentare peste această valoare, deoarece datele trimise depind de rezultat CURLOPT_READFUNCTION.
CURLOPT_LOW_SPEED_LIMIT Pragul superior pentru rata de transfer de date, în octeți pe secundă. Verificarea are loc în cadrul CURLOPT_LOW_SPEED_TIME secunde, după care PHP consideră transferul prea lent și îl anulează.
CURLOPT_LOW_SPEED_TIME Numărul maxim de secunde în care rata de transfer nu trebuie să depășească CURLOPT_LOW_SPEED_LIMIT, în caz contrar PHP va marca transferul ca fiind prea lent și îl va opri.
CURLOPT_MAXCONNECTS Numărul maxim de conexiuni persistente. Când limita este atinsă, parametrul este utilizat pentru a determina ce conexiune să închidă. CURLOPT_CLOSEPOLICY.
CURLOPT_MAXREDIRS Numărul maxim de redirecționări acceptate. Utilizați această opțiune împreună cu opțiunea CURLOPT_FOLLOWLOCATION.
CURLOPT_PORT Port de conectare alternativ.
CURLOPT_POSTREDIR O mască de biți care conține 1 (301 Mutat permanent), 2 (302 Găsit) și 4 (303 Vezi altele) pentru a specifica dacă metoda HTTP POST trebuie procesată atunci când opțiunea este activată CURLOPT_FOLLOWLOCATION dacă a avut loc tipul specificat de redirecționare. Adăugat în cURL 7.19.1. Disponibil începând cu PHP 5.3.2.
CURLOPT_PROTOCOLE

Masca de biți a valorilor CURLPROTO_*. Această mască limitează protocoalele utilizate de libcurl. Acest lucru vă permite să aveți libcurl să funcționeze cu un număr mare de protocoale și să limitați operarea anumitor transferuri la doar un subset al acestora. În mod implicit, libcurl utilizează toate protocoalele acceptate. Vezi și parametrul CURLOPT_REDIR_PROTOCOLE.

Valori corecte ale protocolului: CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_LDAPS , CURLPROTO_DICT_RTPURL, CURLPROTO_DICT_RTPURL, CURLPROTO_RTPURL

CURLOPT_PROXYAUTH Metode de autorizare HTTP utilizate la conectarea la un server proxy. Utilizați aceleași măști de biți care au fost descrise pentru parametru CURLOPT_HTTPAUTH. În prezent, numai CURLAUTH_BASIC și CURLAUTH_NTLM sunt acceptate pentru autorizarea proxy. Adăugat în versiunea cURL 7.10.7.
CURLOPT_PROXYPORT Numărul portului serverului proxy la care se face conexiunea. Acest număr poate fi setat și folosind parametrul CURLOPT_PROXY.
CURLOPT_PROXYTYPE Fie CURLPROXY_HTTP (implicit), fie CURLPROXY_SOCKS5 . Adăugat în cURL 7.10.
CURLOPT_REDIR_PROTOCOLE Masca de biți a valorilor CURLPROTO_*. Această mască de biți limitează protocoalele utilizate de libcurl la redirecționare (cu parametrul activat CURLOPT_FOLLOWLOCATION). Acest lucru vă permite să limitați setul de protocoale utilizate la redirecționare pentru unele transmisii. În mod implicit, libcurl acceptă toate protocoalele, cu excepția FILE și SCP. În versiunile anterioare 7.19.4, redirecționarea a fost folosită pentru toate protocoalele fără excepție. Vezi și descrierea parametrilor CURLOPT_PROTOCOLE pentru o listă de constante cu valori de protocol. Adăugat în versiunea cURL 7.19.4.
CURLOPT_RESUME_FROM Decalaj de pornire a transmisiei, în octeți.
CURLOPT_SSL_VERIFYHOST Utilizați 1 pentru a verifica existența unui nume comun în certificatul SSL. Utilizați 2 pentru a verifica dacă numele comun există și, de asemenea, se potrivește cu gazda specificată. Într-un mediu de luptă, valoarea acestui parametru ar trebui să fie 2 (setat implicit). Suportul pentru valoarea 1 a fost eliminat în cURL 7.28.1
CURLOPT_SSLVERSION Una dintre constante 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) sau CURL_SSLVERSION_TLSv1_2 (6).
CURLOPT_TIMECONDITION Metoda de interpretare a parametrilor CURLOPT_TIMEVALUE. Utilizați CURL_TIMECOND_IFMODSINCE pentru a returna pagina numai dacă aceasta s-a modificat de la ora specificată în parametru CURLOPT_TIMEVALUE. Dacă pagina nu a fost modificată, titlul va fi returnat „304 Nemodificat”, implicând că parametrul CURLOPT_HEADER instalat în ADEVĂRAT. Utilizați CURL_TIMECOND_IFUNMODSINCE pentru efectul opus. Valoarea prestabilită este CURL_TIMECOND_IFMODSINCE.
CURLOPT_TIMEOUT Numărul maxim de secunde permis pentru executarea funcțiilor cURL.
CURLOPT_TIMEOUT_MS Numărul maxim de milisecunde permis pentru executarea funcțiilor cURL. Dacă libcurl este construit utilizând soluția normală de rezolvare a numelor de sistem, atunci această durată de conexiune va folosi în continuare intervale de timp pentru a doua rotunjire, cu un timeout minim permis de o secundă. Adăugat în versiunea cURL 7.16.2. Disponibil începând cu PHP 5.2.3.
CURLOPT_TIMEVALUE Numărul de secunde de la 1 ianuarie 1970. Acest timp va fi folosit de parametru CURLOPT_TIMECONDITION. În mod implicit, este utilizat parametrul CURL_TIMECOND_IFMODSINCE.
CURLOPT_MAX_RECV_SPEED_LARGE Dacă viteza de descărcare depășește această valoare (specificată în octeți pe secundă) în medie pe parcursul întregului transfer, descărcarea va fi întreruptă pentru a menține viteza medie mai mică sau egală cu acest parametru. În mod implicit, viteza nu este limitată.
CURLOPT_MAX_SEND_SPEED_LARGE Dacă încărcarea pe server depășește această valoare (specificată în octeți pe secundă) în medie pe parcursul întregului transfer, încărcarea va fi întreruptă pentru a menține o viteză medie mai mică sau egală cu acest parametru. În mod implicit, viteza nu este limitată. Adăugat în versiunea cURL 7.15.5. Disponibil începând cu PHP 5.4.0.
CURLOPT_SSH_AUTH_TYPES O mască de biți constând din una sau mai multe constante: CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD. Instalare CURLSSH_AUTH_ANY pentru ca libcurl să aleagă unul dintre ele în mod independent. Adăugat în cURL 7.16.1.
CURLOPT_IPRESOLVE Permite unei aplicații să selecteze tipul de adresă IP cu care este determinat numele de gazdă. Acest lucru este necesar dacă utilizați un nume de gazdă care este derivat din mai multe versiuni ale adresei IP. Valorile posibile ar putea fi CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6, iar implicit CURL_IPRESOLVE_WHATEVER. Adăugat în cURL 7.10.8.

Pentru următoarele valori ale parametrilor de opțiune, parametrul de valoare trebuie să fie de tip şir:

Parametru Setați valoarea valorii Note
CURLOPT_CAINFO Numele unui fișier care conține unul sau mai multe certificate față de care vor fi verificate nodurile. Acest parametru are sens numai atunci când este utilizat împreună cu CURLOPT_SSL_VERIFYPEER. Necesită o cale absolută.
CURLOPT_CAPATH Un director care conține mai multe certificate CA. Utilizați această opțiune împreună cu CURLOPT_SSL_VERIFYPEER.
CURLOPT_COOKIE Conținutul antetului „Cookie:”, folosit în cererea HTTP. Vă rugăm să rețineți că mai multe cookie-uri sunt separate printr-un punct și virgulă urmat de un spațiu (de exemplu, " fruct=mar; culoare=roșu")
CURLOPT_COOKIEFILE Numele fișierului care conține cookie-urile. Acest fișier trebuie să fie în format Netscape sau pur și simplu antete HTTP scrise în fișier. Dacă un șir gol este transmis ca nume de fișier, cookie-urile nu vor fi salvate, dar procesarea lor va fi totuși activată.
CURLOPT_COOKIEJAR Numele fișierului în care vor fi salvate toate modulele cookie interne ale transferului curent după ce mânerul este închis, de exemplu după apelarea curl_close.
CURLOPT_CUSTOMREQUEST

Metoda de solicitare personalizată folosită în schimb "OBȚINE" sau "CAP" la efectuarea unei cereri HTTP. Acest lucru este util pentru interogări "ȘTERGE" sau alte solicitări HTTP mai rare. Sensurile corecte ar fi cuvinte ca "OBȚINE", "POST", "CONECTAȚI"și așa mai departe; acestea. Nu introduceți întreaga linie de solicitare HTTP aici. De exemplu, o indicație „GET /index.html HTTP/1.0\r\n\r\n” va fi greșit.

cometariu:

Nu utilizați această funcție până nu sunteți sigur că serverul acceptă acest tip de solicitare.

CURLOPT_EGDSOCKET Ca CURLOPT_RANDOM_FILE, cu excepția faptului că numele fișierului este setat la socket-ul Entropy Gathering Daemon.
CURLOPT_ENCODING Conținutul antetului „Accept-Codificare:”. Acest lucru permite decodificarea cererii. Codificările acceptate sunt "identitate", "dezumfla"Și "gzip". Dacă este trecut un șir gol, "" , este trimis un antet care conține toate tipurile de codificare acceptate. Adăugat în cURL 7.10.
CURLOPT_FTPPORT Valoarea care va fi utilizată pentru a determina adresa IP pentru comanda FTP „PORT”. Comanda „PORT” spune serverului la ce adresă IP ar trebui să se conecteze. Aceasta poate fi o adresă IP, un nume de gazdă, un nume de interfață de rețea (sub Unix) sau pur și simplu „-” pentru a utiliza adresa IP implicită a sistemului.
CURLOPT_INTERFACE Numele interfeței de rețea de utilizat. Poate fi un nume de interfață, o adresă IP sau un nume de gazdă.
CURLOPT_KEYPASSWD Este necesară o parolă pentru a utiliza cheia privată CURLOPT_SSLKEY sau CURLOPT_SSH_PRIVATE_KEYFILE. Adăugat în cURL 7.16.1.
CURLOPT_KRB4LEVEL Nivel de securitate KRB4 (Kerberos 4). Oricare dintre următoarele valori (în ordinea de la cel mai slab la cel mai puternic) este corectă: "clar", "sigur", "confidenţial", "privat".. Dacă șirul specificat diferă de valorile date, valoarea va fi folosită "privat". Setarea acestei opțiuni la NUL va dezactiva complet securitatea KRB4. În acest moment, securitatea KRB4 funcționează doar cu tranzacții FTP.
CURLOPT_POSTFIELDS Toate datele transmise într-o solicitare HTTP POST. Pentru a transfera un fișier, specificați înainte numele fișierului @ , și, de asemenea, utilizați calea completă către fișier. Tipul de fișier poate fi specificat și folosind formatul " ;tip=tip mime" după numele fișierului. Acest parametru poate fi transmis ca șir codificat în url, cum ar fi " para1=val1¶2=val2&...„, și sub forma unei matrice, ale cărei chei vor fi numele câmpurilor, iar valorile vor fi conținutul lor. Dacă valoarea este o matrice, antetul Tipul de conținut va fi setat la multipart/form-data. Începând de la PHP 5.2.0, la transferul fișierelor cu prefix @ , valoarea trebuie să fie o matrice. De la PHP 5.5.0, prefix @ este depreciat și fișierele pot fi trimise folosind CURLFile. Prefix @ poate fi dezactivat pentru a permite valori care încep cu @ prin setarea opțiunii CURLOPT_SAFE_UPLOADîn sens ADEVĂRAT.
CURLOPT_PROXY Proxy HTTP prin care vor fi direcționate cererile.
CURLOPT_PROXYUSERPWD Login și parola scrise în formular ":" , folosit la conectarea printr-un proxy.
CURLOPT_RANDOM_FILE Numele fișierului folosit pentru a inițializa generatorul de numere aleatorii pentru SSL.
CURLOPT_RANGE Gama de date de descărcat, în format "X Y", și fie X, fie Y pot fi omise. Protocolul HTTP suportă și transmiterea mai multor intervale separate prin virgule, acestea fiind specificate în format "X-Y,N-M".
CURLOPT_REFERER Conținutul antetului „Referitor:”, care va fi folosit în cererea HTTP.
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 Un șir care conține 32 de cifre hexazecimale. Șirul trebuie să fie o sumă de control MD5 a cheii publice a computerului la distanță, iar libcurl va reseta conexiunea la gazda la distanță până când suma de control se potrivește cu cheia publică. Această opțiune este doar pentru transferul de date folosind SCP și SFTP. Adăugat în cURL 7.17.1.
CURLOPT_SSH_PUBLIC_KEYFILE Numele fișierului pentru cheia publică. Dacă nu este specificat, libcurl folosește implicit fișierul $HOME/.ssh/id_dsa.pub dacă variabila de mediu HOME este setată și fișierul „id_dsa.pub” în directorul curent dacă variabila de mediu HOME nu este setată. Adăugat în cURL 7.16.1.
CURLOPT_SSH_PRIVATE_KEYFILE Numele fișierului pentru cheia dvs. privată. Dacă nu este specificat, libcurl este implicit la fișierul $HOME/.ssh/id_dsa dacă variabila de mediu HOME este setată și fișierul „id_dsa” în directorul curent dacă variabila de mediu HOME nu este setată. Dacă fișierul este protejat cu parolă, setați parola folosind CURLOPT_KEYPASSWD. Adăugat în cURL 7.16.1.
CURLOPT_SSL_CIPHER_LIST Lista de cifruri utilizate în transferurile SSL. De exemplu, RC4-SHAȘi TLSv1 sunt liste de cifrare valide.
CURLOPT_SSLCERT Numele unui fișier cu un certificat PEM formatat corect.
CURLOPT_SSLCERTPASSWD Este necesară parola pentru a utiliza certificatul CURLOPT_SSLCERT.
CURLOPT_SSLCERTTYPE Format de certificat. Formate acceptate "PEM"(Mod implicit), „DER”Și "ENG". Adăugat în versiunea cURL 7.9.3.
CURLOPT_SSLENGINE ID-ul motorului de criptare pentru cheia privată SSL specificată în parametru CURLOPT_SSLKEY.
CURLOPT_SSLENGINE_DEFAULT Identificatorul mecanismului de criptare utilizat pentru operațiunile de criptare asimetrică.
CURLOPT_SSLKEY Numele fișierului cheii private SSL.
CURLOPT_SSLKEYPASSWD

Parola secretă necesară pentru a utiliza cheia privată SSL specificată de parametru CURLOPT_SSLKEY.

cometariu:

Deoarece acest parametru conține o parolă valoroasă, nu uitați să păstrați acest script PHP într-un loc sigur.

CURLOPT_SSLKEYTYPE Tipul de cheie privată SSL specificată în parametru CURLOPT_SSLKEY. Sunt acceptate următoarele tipuri de chei: "PEM"(Mod implicit), „DER”Și "ENG".
CURLOPT_URL URL descărcabil. Acest parametru poate fi setat și la inițializarea unei sesiuni folosind curl_init().
CURLOPT_USERAGENT Conținutul antetului "Agent utilizator: ", trimis într-o solicitare HTTP.
CURLOPT_USERPWD Login și parola utilizate în timpul conexiunii, specificate în format ":" .

Pentru următoarele valori ale parametrilor de opțiune, parametrul de valoare trebuie să fie o matrice:

Parametru Setați valoarea valorii Note
CURLOPT_HTTP200ALIASES O serie de răspunsuri HTTP 200 care vor fi tratate mai degrabă drept răspunsuri corecte decât eronate. Adăugat în versiunea cURL 7.10.3.
CURLOPT_HTTPHEADER O matrice de anteturi HTTP setate, în formatul matrice ("Content-type: text/plain", "Content-length: 100")
CURLOPT_POSTQUOTE O serie de comenzi FTP executate pe server după finalizarea unei cereri FTP.
CURLOPT_QUOTE O serie de comenzi FTP executate pe server înainte de a face o solicitare FTP.

Pentru următoarele valori ale parametrilor opțiunii, parametrul valoare trebuie să fie un handle de flux (returnat, de exemplu, de funcția fopen()):

Parametru Setați valoarea valorii
CURLOPT_FILE Fișierul în care va fi scris rezultatul transferului. Flux de ieșire implicit STDOUT(fereastra browserului).
CURLOPT_INFILE Fișierul din care trebuie citite datele atunci când sunt încărcate pe server.
CURLOPT_STDERR Fișier alternativ de ieșire de eroare utilizat în locul fluxului de erori STDERR.
CURLOPT_WRITEHEADER Fișierul în care vor fi scrise anteturile operației curente.

Pentru următoarele valori ale parametrilor de opțiune, parametrul de valoare trebuie să fie un nume de funcție sau o închidere validă:

Parametru Setați valoarea valorii
CURLOPT_HEADERFUNCTION Funcția de apel invers ia doi parametri. Primul parametru este mânerul cURL, al doilea parametru este un șir care conține anteturile care urmează să fie scrise. Anteturile trebuie scrise folosind această funcție de apel invers. Ar trebui să returneze numărul de octeți scrisi.
CURLOPT_PASSWDFUNCTION Funcția de apel invers ia trei parametri. Primul parametru este mânerul cURL, al doilea parametru este șirul prompt al parolei, iar al treilea parametru este lungimea maximă a parolei. Ar trebui să returneze un șir care să conțină parola.
CURLOPT_PROGRESSFUNCTION

Funcția de apel invers ia cinci parametri. Primul este descriptorul cURL, al doilea este numărul total de octeți care se preconizează a fi descărcați de pe server, al treilea este numărul de octeți deja descărcați, al patrulea este numărul total de octeți care urmează să fie trimiși către server și al cincilea este numărul de octeți deja trimiși.

cometariu:

Funcția de apel invers este apelată numai dacă opțiunea CURLOPT_NOPROGRESS setat la valoare FALS.

Puteți returna o valoare diferită de zero pentru a anula transferul. În acest caz, va fi afișată o eroare CURLE_ABORTED_BY_CALLBACK.

CURLOPT_READFUNCTION Funcția de apel invers ia trei parametri. Primul parametru este mânerul cURL, al doilea parametru este resursa fluxului transmis către cURL prin opțiunea CURLOPT_INFILE, iar al treilea parametru este cantitatea maximă permisă de date de citit. Funcția de apel invers trebuie să returneze un șir de lungime nu mai mare decât cantitatea de date solicitată, de obicei prin citirea din resursa de streaming transmisă. Ar trebui să returneze un șir gol pentru a semnala sfârșitul fișierului EOF.
CURLOPT_WRITEFUNCTION Funcția de apel invers ia doi parametri. Primul parametru este mânerul cURL, iar al doilea parametru este șirul care conține datele de scris. Datele trebuie salvate folosind această funcție. Trebuie să returneze numărul exact de octeți scriși, altfel descărcarea va fi anulată cu o eroare.

Alte semnificații:

Valori returnate

Se intoarce ADEVĂRAT la finalizarea cu succes sau FALSîn cazul unei erori.

Lista modificărilor

Versiune Descriere
5.6.0 Opțiune CURL_SAFE_UPLOAD acum are o valoare implicită de ADEVĂRAT.
5.6.0 Opțiune eliminată CURLOPT_CLOSEPOLICYși semnificațiile asociate acesteia.
5.5.0 Resursa cURL este adăugată ca prim argument la funcția de apel invers CURLOPT_PROGRESSFUNCTION.
5.5.0 Opțiune adăugată CURLOPT_SHARE.
5.3.0 Opțiune adăugată CURLOPT_PROGRESSFUNCTION.
5.2.10 Opțiuni adăugate CURLOPT_PROTOCOLEȘi CURLOPT_REDIR_PROTOCOLE.
5.1.0 Opțiuni adăugate CURLOPT_AUTOREFERER, CURLOPT_BINARYTRANSFER, CURLOPT_FTPSSLAUTH, CURLOPT_PROXYAUTHȘi CURLOPT_TIMECONDITION.
5.0.0 Opțiuni adăugate CURLOPT_FTP_USE_EPRT, CURLOPT_NOSIGNAL, CURLOPT_UNRESTRICTED_AUTH, CURLOPT_BUFFERSIZE, CURLOPT_HTTPAUTH, CURLOPT_PROXYPORT, CURLOPT_PROXYTYPE, CURLOPT_SSLCERTTYPEȘi CURLOPT_HTTP200ALIASES.

Exemple

Exemplul #1 Inițializarea unei sesiuni CURL și încărcarea unei pagini web

// creează o nouă resursă cURL
$ch = curl_init();

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

$ch = curl_init();

$date = 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, $date);

Curl_exec($ch);
?>

Rezultatul rulării acestui exemplu:

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

Note

cometariu:

Transmiterea unei matrice către CURLOPT_POSTFIELDS codifică datele ca multipart/form-data, în timp ce trecerea unui șir codificat în URL va codifica datele ca application/x-www-form-urlencoded.

cURL este un instrument care vă permite să interacționați cu diverse servere și acceptă multe protocoale: HTTP, FTP, TELNET etc. cURL este inițial un utilitar de linie de comandă. Dar, din fericire pentru noi, PHP acceptă lucrul cu biblioteca cURL. În acest articol ne vom uita la exemple non-triviale de lucru cu cURL.

De ce cURL?

De fapt, există multe alte modalități de a trimite o solicitare către un alt server pentru, de exemplu, a prelua conținutul unei pagini. Mulți oameni, mai ales din lene, folosesc funcții PHP simple în loc de cURL:

$content = file_get_contents("http://www.example.com"); // sau $linii = fisier("http://www.example.com"); // sau readfile ("http://www.example.com");

Cu toate acestea, ele nu permit o gestionare eficientă a erorilor. Există, de asemenea, o serie de sarcini pe care nu le pot face deloc - de exemplu, lucrul cu cookie-uri, autorizarea, postarea solicitărilor, descărcarea fișierelor.

cUrl este un instrument puternic care acceptă mai multe protocoale și oferă informații complete de solicitare.

Noțiuni de bază pentru curl

Înainte de a trece la exemple complexe, să ne uităm la structura de bază a unei cereri cURL în PHP. Pentru a efectua o solicitare cURL în PHP, trebuie să parcurgeți 4 pași principali:

  1. Inițializare.
  2. Opțiuni de setare.
  3. Executarea cererii.
  4. Resurse de curățare.
// 1. initializare $ch = curl_init(); // 2. setați opțiuni, inclusiv URL curl_setopt($ch, CURLOPT_URL, „http://www.google.com”); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. executarea cererii și primirea răspunsului $output = curl_exec($ch); // 4. resurse de curățare curl_close($ch);

În mare parte, ne vom uita la pasul #2 din acest articol, deoarece acolo se întâmplă magia. Lista opțiunilor cURL este foarte mare, așa că nu vom lua în considerare toate opțiunile astăzi, ci le vom folosi pe cele care sunt utile pentru rezolvarea unor probleme specifice.

Urmărirea erorilor

Dacă este necesar, puteți adăuga următoarele linii pentru a urmări erorile:

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

Vă rugăm să rețineți că folosim „===” în loc de „==” deoarece Este necesar să se facă distincția între un răspuns de server gol și valoarea booleană FALSE, care este returnată în cazul unei erori.

Obținerea de informații despre o solicitare

Un alt pas opțional este obținerea de informații despre cererea cURL după ce aceasta a fost executată.

// ... curl_exec($ch); $info = curl_getinfo($ch); ecou „Luat” . $info["total_time"] . „secunde pentru url”. $info["url"]; // ...

Ca rezultat, veți primi o matrice cu următoarele informații:

  • "url"
  • "tipul de conținut"
  • „http_code”
  • "header_size"
  • "request_size"
  • "filetime"
  • „ssl_verify_result”
  • "redirect_count"
  • "timpul total"
  • „namelookup_time”
  • „connect_time”
  • "pretransfer_time"
  • „size_upload”
  • "size_download"
  • „viteză_descărcare”
  • „încărcare_viteză”
  • „download_content_length”
  • „încărcare_conținut_lungime”
  • „starttransfer_time”
  • "redirect_time"

Urmărirea redirecționării, în funcție de browser

În acest exemplu, vom scrie un script care va detecta redirecționările pe baza diferitelor setări ale browserului. De exemplu, unele site-uri redirecționează vizitatorii de pe dispozitive mobile către vizitatori din alte țări.

Vom folosi opțiunea CURLOPT_HTTPHEADER pentru a ne seta propriile anteturi, inclusiv User-Agent și Language, și pentru a vedea unde ne redirecționează site-urile.

// URL-uri $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // browsere $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" => array ("user_agent" => "Mozilla/5.0 (iPhone; U; CPU ca Mac OS X; ro) AppleWebKit/420+ (KHTML, cum ar fi Gecko) Versiunea/3.0 Mobile/1A537a Safari/419.3", "limba" => "en"), "franceză" => matrice ("user_agent" = > "Mozilla/4.0 (compatibil; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "limba" => "fr,fr-FR;q=0.5"); foreach ($urls ca $url) ( echo "URL: $url\n"; foreach ($browsers ca $test_name => $browser) ( $ch = curl_init(); // setați adresa curl_setopt($ch, CURLOPT_URL) , $url); // indică browserul și limba folosită curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["language" ]) ")); // nu avem nevoie de conținutul paginii curl_setopt($ch, CURLOPT_NOBODY, 1); // avem nevoie doar de anteturi curl_setopt($ch, CURLOPT_HEADER, 1); // returnăm rezultatul în schimb a ieșirii sale curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); $output = curl_exec($ch); curl_close($ch); // definiți redirecționări în antetele HTTP? if (preg_match("!Locație: (.*)!") , $ieșire, $potriviri)) ( echo „$nume_test: redirecționează către $potriviri\n”; ) else ( echo „$nume_test: fără redirecționare\n”; ) ) echo „\n\n”; )

Într-o buclă, verificăm browserele pentru fiecare URL. Mai întâi setăm opțiunile pentru cererea noastră: URL și browser și limba de testat.

Deoarece Am setat o opțiune specială; rezultatul solicitării va conține doar anteturi HTTP. Folosind o expresie regulată simplă, putem verifica dacă răspunsul conține șirul „Locație:”.

Rezultatul execuției scriptului:

URL: http://www.cnn.com standard: redirecționează către http://edition.cnn.com/ iphone: redirecționează către http://edition.cnn.com/ Franceză: redirecționează către http://edition.cnn .com/ URL: http://www.mozilla.com standard: redirecționează către https://www.mozilla.org/firefox/ iphone: redirecționează către https://www.mozilla.org/firefox/ franceză: redirecționează către https://www.mozilla.org/firefox/ URL: http://www.facebook.com standard: redirecționează către https://www.facebook.com/ iphone: redirecționează către http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr Franceză: fără redirecționare

Trimiterea cererilor POST

La efectuarea cererilor GET, datele pot fi transmise în șirul de interogare. De exemplu, atunci când căutați pe Google, interogarea dvs. este tradusă într-o adresă URL:

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

Pentru a obține rezultatul acestei interogări, nici măcar nu aveți nevoie de cURL, puteți fi leneș și puteți utiliza „file_get_contents()”.

Dar unele formulare HTML folosesc metoda POST. În acest caz, datele sunt trimise în corpul mesajului de solicitare, mai degrabă decât în ​​URL-ul în sine.

Să scriem un script care va trimite solicitări POST. Mai întâi, să creăm un fișier PHP simplu care va accepta aceste solicitări și va returna datele trimise acestuia. Să-i spunem post_output.php :

$url = "http://localhost/post_output.php"; $post_data = matrice ("foo" => "bar", "query" => "FooBar", "action" => "Trimite"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // face o cerere POST curl_setopt($ch, CURLOPT_POST, 1); // adaugă date curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $ieșire = curl_exec($ch); curl_close($ch); echo $ieșire;

Acest script va scoate:

Array ( => bar => FooBar => Trimite)

Acest script a trimis o solicitare POST către fișierul post_output.php. care a scos conținutul matricei $_POST și am primit acest răspuns folosind cURL.

Încărcarea fișierelor

La fel ca în exemplul anterior, să creăm un fișier care va accepta cereri, upload_output.php :

Print_r($_FILES);

Și scriptul în sine care descarcă fișierele:

$url = "http://localhost/upload_output.php"; $post_data = matrice ("foo" => "bar", // fișier de încărcat "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); $ieșire = curl_exec($ch); curl_close($ch); echo $ieșire;

Dacă doriți să încărcați un fișier, tot ce trebuie să faceți este să treceți calea către acesta, la fel ca un parametru de solicitare POST normal, prefixat cu „@”. Rezultatul scenariului:

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

Multi cURL

Una dintre caracteristicile avansate ale cURL în PHP este capacitatea de a executa mai multe solicitări simultan și asincron.

În condiții normale, scriptul se oprește și așteaptă finalizarea cererii. Și dacă trebuie să executați o mulțime de interogări, poate dura mult timp, deoarece... vei executa secvenţial. Această limitare poate fi ocolită:

// creează handlere $ch1 = curl_init(); $ch2 = curl_init(); // setați opțiunile 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); //creează mânerul cURL multiplu $mh = curl_multi_init(); // adaugă handlere curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $running = null; // execută cereri do ( curl_multi_exec($mh, $running); ) while ($running > 0); // eliberează resurse curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Ideea este că puteți crea mai multe mânere cURL, să le combinați sub un singur mâner și să le executați asincron.

În primul rând, totul este la fel ca cu o solicitare cURL obișnuită - este creat un descriptor ( curl_init() ), parametrii sunt setați ( curl_setopt() ). În continuare, este creat un multi-descriptor ( curl_multi_init() ) și se adaugă descriptorii obișnuiți creați anterior ( curl_multi_add_handle() ). În loc să apelăm curl_exec() în mod normal, vom apela curl_multi_exec() această funcție ne informează despre numărul de conexiuni active folosind al doilea parametru - $running. Prin urmare, bucla rulează până când $running devine egal cu 0. Și, desigur, după terminarea lucrării, este necesar să eliberați resurse.

În acest exemplu, pur și simplu trimitem rezultatul interogărilor către STDOUT. Să luăm în considerare un caz non-trivial de utilizare a mai multor cURL.

Verificarea linkurilor externe în WordPress

Imaginați-vă un blog cu o mulțime de postări care conțin link-uri către site-uri externe. Este posibil ca unele dintre aceste link-uri să nu funcționeze.

Să scriem un script care va găsi toate linkurile rupte și ni le va arăta.

În primul rând, trebuie să extragem toate linkurile externe din baza de date:

// CONFIG $db_host = "localhost"; $db_user = „rădăcină”; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "site"); $max_connections = 10; $url_list = matrice(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $activ = nul; // se conectează la MySQL dacă (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Nu s-a putut conecta: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Poate nu selectează db: " . mysql_error()); ) // preia toate postările cu link-uri în text $q = "SELECTează post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post " "; $r = mysql_query($q) sau die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // colectează toate linkurile folosind expresia regulată if (preg_match_all("/href=\"(.*?)\"/", $d["post_content"], $match )) ( foreach ($se potrivește ca $url) ( // filtrează domeniile inutile $tmp = parse_url($url); if (isset($tmp["gazdă"]) && in_array($tmp["gazdă"], $ excluded_domains)) ( continua; ) // aduna $url_list = $url; ) ) ) // elimina repetitiile $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Fără URL de verificat"); )

În această parte a scriptului, pur și simplu scoatem toate linkurile externe din baza de date. Să le verificăm:

$mh = curl_multi_init(); // 1. adăugați linkuri pentru ($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 "==Adrese URL moarte==\n"; echo implode("\n", $dead_urls) . „\n\n”; echo „==404 URL-uri==\n”; echo implode ("\n", $nu_found_urls) . „\n\n”; echo "==Adrese URL de lucru==\n"; echo implode("\n", $working_urls); ecou „\n\n”; // 9. adaugă un handle cu funcția URL dată add_url_to_multi_handle($mh, $url_list) ( static $index = 0; // dacă mai există linkuri dacă (isset($url_list[$index])) ( // totul este ca de obicei $ ch = curl_init(); // setați opțiunile curl_setopt($ch, CURLOPT_URL, $url_list[$index]); // returnează mai degrabă decât afișa rezultatul curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // permite redirecționează curl_setopt($ ch, CURLOPT_FOLLOWLOCATION, 1); // obține doar antete pentru a economisi timp curl_setopt($ch, CURLOPT_NOBODY, 1); // adaugă la multi-mâner curl_multi_add_handle($mh, $ch); $index++; ) )

Să ne uităm la cod mai detaliat (numerotarea corespunde comentariilor din cod):

  1. Adăugăm un număr inițial de descriptori pentru a nu supraîncărca sistemul cu fire de execuție. Numărul este controlat de variabila $max_connections.
  2. Variabila $curRunning stochează numărul de fire care rulează, $running stochează valoarea anterioară; dacă acestea devin inegale, atunci unul dintre fire de execuție și-a încheiat lucrul.
  3. Primim informații despre cererea finalizată.
  4. Dacă nu există niciun răspuns de la server, linkul nu funcționează.
  5. Răspunsul serverului este 404.
  6. În rest, linkul funcționează.
  7. Solicitarea este finalizată, eliberăm resurse.
  8. Să adăugăm o nouă adresă URL la descriptorul multiplu.
  9. Funcţie add_url_to_multi_handle() adaugă un nou handle cu adresa URL dată la multi-descriptor.

Să rulăm scriptul:

Adrese URL moarte== xample1234.com/ ==404 URL-uri== www.google.com/dsfasdfafd ==Adrese URL de lucru== 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

Verificarea a durat aproximativ 2 secunde. Prin rularea a 10 fire simultan, performanța crește de 10 ori în comparație cu solicitările cURL obișnuite. Pentru a obține conținutul răspunsului serverului, utilizați funcția curl_multi_getcontent($ch) , unde $ch este un descriptor obținut din curl_multi_info_read() .

Alte caracteristici cURL în PHP

Autentificare HTTP

Dacă solicitarea HTTP necesită autentificare, utilizați următorul cod:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // trimite numele de utilizator și parola curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // dacă sunt permise redirecționări curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // cURL va trimite parola după redirecționări curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $ieșire = curl_exec($ch); curl_close($ch);

Încărcați prin FTP

PHP are propria sa bibliotecă pentru lucrul cu FTP, dar puteți folosi și cURL:

// citește fișierul $fișier = fopen("/cale/la/fișier", "r"); // url conține deja datele necesare $url = "ftp://nume utilizator: [email protected]:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // opțiuni curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, dimensiunea fișierelor("/path/to/file")); curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ ch); curl_close($ch);

Folosind un proxy

Solicitările pot fi făcute printr-un proxy specific:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // adresa proxy curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // dacă este necesară autorizarea curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $ieșire = curl_exec($ch); curl_close($ch);

Funcții de apel invers

Este posibil să utilizați apeluri inverse în timp ce cererea rulează, fără a aștepta finalizarea acesteia. De exemplu, în timp ce răspunsul serverului este descărcat, putem folosi datele deja primite fără a aștepta descărcarea completă.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://example.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"funcție_progres"); curl_exec($ch); curl_close($ch); function progress_function($ch,$str) ( echo $str; return strlen($str); )

Funcția de apel invers trebuie să returneze lungimea șirului pentru ca cererea să funcționeze corect.

De fiecare dată când se primește următoarea parte a răspunsului serverului, va fi apelat înapoi.

Concluzie

În acest articol, ne-am uitat la caracteristicile avansate ale cURL în PHP. Data viitoare când trebuie să faceți solicitări URL, utilizați cURL.

De multe ori trebuie să descărcam diverse fișiere de pe Internet, de exemplu, fișiere de program executabile, fișiere script, arhive sursă. Dar acest lucru nu trebuie făcut întotdeauna prin intermediul browserului. În multe situații este mult mai ușor să efectuați toate acțiunile prin intermediul terminalului. Pentru că astfel poți automatiza procesul. Pe de altă parte, webmasterii din când în când trebuie să testeze accesibilitatea site-ului web, să verifice anteturile trimise și primite și multe altele.

Pentru a rezolva astfel de probleme și probleme dintr-o gamă similară, puteți utiliza utilitarul curl. Vă permite să rezolvați o gamă mult mai largă de probleme, inclusiv simularea acțiunilor utilizatorului pe site. În acest articol ne vom uita la cum să folosiți curl, ce este și de ce este necesar acest program.

De fapt, curl este mai mult decât un utilitar de linie de comandă pentru Linux sau Windows. Acesta este un set de biblioteci care implementează capabilitățile de bază de lucru cu pagini URL și transfer de fișiere. Biblioteca acceptă lucrul cu protocoale: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, precum și POP3, IMAP și SMTP. Este excelent pentru a simula acțiunile utilizatorului pe pagini și alte operațiuni cu adrese URL.

Suportul pentru biblioteca curl a fost adăugat la multe limbaje și platforme de programare diferite. Utilitarul curl este un înveliș independent pentru această bibliotecă. Este acest utilitar pe care ne vom concentra în acest articol.

comanda curl

Înainte de a trece la o descriere a modului în care poate fi utilizată comanda curl linux, să ne uităm la utilitarul în sine și la opțiunile sale principale de care vom avea nevoie. Sintaxa utilitarului este foarte simplă:

link pentru opțiuni curl $

Acum să ne uităm la opțiunile principale:

  • -# - afișați o bară de progres simplă în timpul încărcării;
  • -0 - utilizați protocolul http 1.0;
  • -1 - utilizați protocolul de criptare tlsv1;
  • -2 - utilizați sslv2;
  • -3 - utilizați sslv3;
  • -4 - utilizați ipv4;
  • -6 - utilizați ipv6;
  • -A- indicați USER_AGENT;
  • -b- salvați cookie într-un fișier;
  • -c- trimite Cookie către server dintr-un fișier;
  • -C- continua descărcarea fișierului de la punctul de întrerupere sau offset specificat;
  • -m- timp maxim de asteptare pentru un raspuns de la server;
  • -d- trimite datele folosind metoda POST;
  • -D- salvați anteturile returnate de server într-un fișier;
  • -e- setați câmpul Referer-uri, indicând de ce site provine utilizatorul;
  • -E- utilizați un certificat SSL extern;
  • -f- nu afisati mesaje de eroare;
  • -F- trimite datele sub forma unui formular;
  • -G- dacă această opțiune este activată, atunci toate datele specificate în opțiunea -d vor fi transmise folosind metoda GET;
  • -H- transfera anteturi pe server;
  • -Eu- primiți doar antetul HTTP și ignorați întregul conținut al paginii;
  • -j- citeste si trimite cookie-uri dintr-un fisier;
  • -J- eliminați antetul din cerere;
  • -L- acceptă și procesează redirecționări;
  • -s- numărul maxim de redirecționări folosind Locație;
  • -o- scoaterea conținutului paginii într-un fișier;
  • -O- salvarea conținutului într-un fișier cu numele paginii sau al fișierului de pe server;
  • -p- utilizați un proxy;
  • --proto- indicați protocolul care trebuie utilizat;
  • -R- salvați ultima oră de modificare a unui fișier de la distanță;
  • -s- afișarea unui minim de informații despre erori;
  • -S- afișarea mesajelor de eroare;
  • -T- încărcați fișierul pe server;
  • -v- rezultatul cel mai detaliat;
  • -y- viteza minima de download;
  • -Y- viteza maxima de download;
  • -z- descărcați fișierul numai dacă a fost modificat mai târziu decât ora specificată;
  • -V- afișați versiunea.

Acestea nu sunt în niciun caz toate opțiunile pentru curl linux, dar listează elementele de bază pe care va trebui să le utilizați.

Cum se folosește curl?

Am acoperit tot ce ține de teoria lucrului cu utilitarul curl, acum este timpul să trecem la practică și să privim exemple ale comenzii curl.

Cea mai comună sarcină este aceasta. Descărcarea fișierului este foarte simplă. Pentru a face acest lucru, trebuie doar să transmiteți numele fișierului sau pagina html utilitarului în parametri:

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

Dar aici vă așteaptă o surpriză: întregul conținut al fișierului va fi trimis la ieșire standard. Pentru a-l scrie în orice fișier, utilizați:

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

Și dacă doriți ca fișierul rezultat să fie numit la fel ca fișierul de pe server, utilizați opțiunea -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

Dacă este necesar, puteți descărca mai multe fișiere cu o singură comandă:

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

Un alt lucru care poate fi util pentru un administrator este să descarce un fișier numai dacă acesta a fost modificat:

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

Limită de viteză

Puteți limita viteza de descărcare la limita necesară pentru a nu supraîncărca rețeaua folosind opțiunea -Y:

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

Aici trebuie să specificați numărul de kiloocteți pe secundă care pot fi descărcați. De asemenea, puteți închide conexiunea dacă viteza nu este suficientă, utilizați opțiunea -Y pentru a face acest lucru:

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

Transferarea fișierelor

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

Sau să verificăm dacă fișierul este trimis prin HTTP; există un serviciu special pentru asta:

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

În răspuns, utilitarul vă va spune unde puteți găsi fișierul descărcat.

Se trimite date POST

Puteți trimite nu numai fișiere, ci și orice date folosind metoda POST. Permiteți-mi să vă reamintesc că această metodă este folosită pentru a trimite date de diferite forme. Pentru a trimite o astfel de solicitare, utilizați opțiunea -d. Pentru testare vom folosi același serviciu:

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

Dacă nu sunteți mulțumit de această opțiune de trimitere, puteți pretinde că trimiteți formularul. Există o opțiune pentru aceasta -F:

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

Aici trecem câmpul de parolă cu formularul ca text simplu, la fel poți trece mai mulți parametri.

Trimiterea și primirea cookie-urilor

Cookie-urile sunt folosite de site-uri web pentru a stoca anumite informații din partea utilizatorului. Acest lucru poate fi necesar, de exemplu, pentru autentificare. Puteți trimite și primi cookie-uri folosind curl. Pentru a salva cookie-urile primite într-un fișier, utilizați opțiunea -c:

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

Apoi puteți trimite cookie-ul curl înapoi:

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

Transmiterea și analiza antetului

Nu întotdeauna avem nevoie de conținutul paginii. Uneori doar titlurile pot fi interesante. Pentru a le afișa numai acestea există opțiunea -I:

curl -I https://site

Și opțiunea -H vă permite să trimiteți mai multe sau mai multe către server, de exemplu, puteți trece antetul If-Modified-Since, astfel încât pagina să fie returnată numai dacă a fost modificată:

autentificare curl

Dacă serverul necesită unul dintre tipurile comune de autentificare, cum ar fi HTTP Basic sau FTP, atunci curl poate gestiona această sarcină foarte ușor. Pentru a specifica detaliile de autentificare, pur și simplu le specificați separate prin două puncte în opțiunea -u:

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

Autentificarea pe serverele HTTP va fi efectuată în același mod.

Folosind un proxy

Dacă trebuie să utilizați un server proxy pentru a descărca fișiere, atunci și acest lucru este foarte simplu. Este suficient să specificați adresa serverului proxy în opțiunea -x:

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

concluzii

În acest articol, am analizat cum să folosiți curl, de ce este necesar acest utilitar și principalele sale capacități. În ciuda asemănării lor cu, ele sunt foarte diferite. Comanda curl linux este concepută mai mult pentru analiza și simularea diferitelor acțiuni pe server, în timp ce wget este mai potrivit pentru descărcarea fișierelor și accesarea cu crawlere a site-urilor.

Acest articol va vorbi despre un instrument atât de puternic precum cURL, precum și despre biblioteca pentru PHP care oferă acces la acest instrument - libcurl. Pentru ce sunt toate acestea? Pentru a comunica cu serverul utilizând protocoale de transfer de date, de exemplu, http sau ftp. Restul protocoalelor nu sunt deosebit de interesante pentru noi; dacă cineva dorește să aprofundeze acest subiect, va trebui să dezgroape resurse în limba engleză, iar acest articol va conține elementele de bază și exemple de utilizare.

Ce sunt exact cURL și libcurl? Puncte generale

Deci, biblioteca libcurl ne oferă capacitatea de a transmite date către server și de a primi răspunsuri de la acesta. Ce ne oferă asta? Abilitatea de a emula comportamentul utilizatorului sau ! Puteți primi conținutul paginilor pentru o analiză ulterioară, puteți primi anteturi de răspuns ale serviciului și puteți să vă conectați programatic pe site-uri, să creați scripturi pentru postarea de mesaje (de exemplu, pe Twitter sau pe forumuri) sau informații. Totul este limitat doar de imaginația ta!

Instalarea cURL pe Denwer (Denver). Cum să începeți să utilizați libcurl?

Primul lucru pe care trebuie să-l facem este să instalăm biblioteca. Pe computerul meu local folosesc versiunea Denwer, ca marea majoritate a webmasterilor începători, cărora le este destinat articolul. Utilizatorii experimentați care instalează în mod independent combinația php+apache+mysql vor putea instala cURL, nu este pentru mine să le explic cum se face acest lucru;) Iar noi, începătorii, folosim soluții gata făcute pentru a le ușura. Prin urmare, instalați libcurl după cum urmează:

  • Descărcați pachetul de extensii gata „PHP5: module suplimentare”.
  • În consecință, îl instalăm. Nimic complicat, de acord :)
  • Deschideți fișierul în Notepad (recomand întotdeauna Notepad++): X:/webservers/usr/local/php5/php.ini //unde X este unitatea dvs. unde este instalat serverul web

    și eliminați punctul și virgulă de la începutul termenilor:

    ;extension=php_curl.dll

  • Repornim serverul Denver.

Gata. Pentru a verifica funcționalitatea bibliotecii, puteți apela funcția phpinfo() și găsiți linia acolo: suportul cURL activat. Felicitări pentru prima ta victorie.

Descrierea cURL și primii pași

Pentru a începe lucrul cu instrumentul, acesta trebuie să fie inițializat. Acest lucru se face după cum urmează:

$ch = curl_init();

Am folosit funcția de inițializare a sesiunii cURL. În acest caz, puteți seta adresa URL imediat, astfel:

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

Și poți face asta mai târziu, în opțiuni. Ordinea în care sunt instalate opțiunile nu contează. Aceasta se realizează printr-o altă funcție:

Curl_setopt (ch resursă, opțiune șir, valoare mixtă)

Am creat deja primul parametru al acestei funcții, adică resursa ch, chiar mai sus, dar există o mulțime de parametri de opțiune și valoare. Cred că nu ar trebui să le copiați-lipiți pe toate aici, ci doar să dați un link către o descriere detaliată a funcției, sper că nimeni nu va fi jignit: curl_setopt.

Voi da un exemplu de setare a opțiunilor folosind o adresă URL ca exemplu:

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

Încă câteva exemple de opțiuni de setare: să obținem antetul de răspuns al serverului, fără a obține pagina în sine:

Curl_setopt($ch, CURLOPT_HEADER, 1); // citește antetul curl_setopt($ch, CURLOPT_NOBODY, 1); // citește DOAR antetul fără corp

Deci, am initializat sesiunea, am setat parametrii de care avem nevoie, acum executam cererea rezultata, inchidem sesiunea si afisam rezultatul:

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

Ca rezultat, obținem primul nostru exemplu complet funcțional de utilizare a bibliotecii libcurl:

$ch = curl_init(); $url = "https://site-ul"; curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 1); // citește antetul curl_setopt($ch, CURLOPT_NOBODY, 1); // citeste DOAR antetul fara corpul $rezultat = curl_exec($ch); curl_close($ch); echo $rezultat;

Cum funcționează, sper, este clar, pentru că ne-am uitat la fiecare pas separat :) Drept urmare, primim de la server un antet de răspuns HTTP, pe care cu siguranță îl vom analiza mai jos pentru a înțelege mai bine toate etapele de interacțiune dintre browserul si serverul:

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

Fabulos! Am primit antetul de răspuns de la server și am testat biblioteca în acțiune. Cum ne este util acest lucru? Pentru că acum vă puteți imagina aproximativ secvența de acțiuni atunci când lucrați cu cURL:

  • Inițializați sesiunea (curl_init)
  • Setați opțiunile de care avem nevoie (curl_setopt)
  • Executați solicitarea primită (curl_exec)
  • Încheierea sesiunii (curl_close)

Structura antetului cererii HTTP

De exemplu, am apelat la pagina ya.ru și m-am uitat la cererea generată de browser și răspunsul primit de la server. Aici sunt ei:
Cerere
GET / HTTP/1.1 - Încercăm să obținem pagina la /, adică pagina principală situată în rădăcina folderului. Folosim versiunea de protocol 1.1.
Agent de utilizator: Opera/9.80 (Windows NT 6.1; WOW64) Versiunea Presto/2.12.388/12.14— Ne prezentăm pe server, suntem browserul Opera.
Gazdă: ya.ru — Numele de domeniu al resursei solicitate.
Accept: 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 formatelor de resurse acceptabile.
Accept-Limba: ru-RU,ru;q=0.9,en;q=0.8— Lista limbilor acceptate.
Acceptare-Codificare: gzip, deflate— Metode de codificare acceptate.
Cookie: yandexuid=ХХХХХ - Cookie-uri, dacă este necesar.
Conexiune: Keep-Alive - Vă rugăm să nu întrerupeți conexiunea și să rămâneți în legătură.
Răspuns
HTTP/1.1 200 Ok - Primim un răspuns cu codul 200, ceea ce înseamnă că totul este OK.
Server: nginx - Serverul s-a prezentat - acesta este nginx.
Data: duminica, 10 martie 2013 14:10:50 GMT— Data și ora curente pe server.
Tip de conținut: text/html; set de caractere=UTF-8— Tipul de conținut și codificare.
Conexiune: închide - Serverul nu dorește să mențină o conexiune permanentă cu noi, așa că o închide imediat. O nouă conexiune va fi stabilită pentru următoarea solicitare.
Cache-Control: fără cache, fără magazin, vârsta maximă=0, trebuie revalidat- Gestionarea stocării în cache. În acest caz este dezactivat.
Expiră: Duminică, 10 Mar 2013 14:10:50 GMT— Data estimată a expirării sesiunii. În cazul nostru, coincide cu ora de deschidere, deoarece serverul l-a închis imediat, imediat după procesare.
Ultima modificare: duminică, 10 martie 2013 14:10:50 GMT— Ora ultimei modificări.
Codificarea conținutului: gzip — Metodă de codificare a informațiilor.
O listă completă a tuturor parametrilor care pot fi găsiți în antetul solicitării HTTP poate fi găsită pe Wikipedia.
Acum aveți o idee aproximativă despre modul în care browserul și serverul dvs. web comunică între ele. Acest lucru este foarte util de știut și înțeles, deoarece vom încerca să emulăm acțiunile browserului folosind biblioteca libcurl. Daţi-i drumul.

Exemplu de lucru cu biblioteca

Cred că, după ce unele puncte generale sunt deja clare și totul pare să fie clar, atunci este timpul să treceți la exersare și să vă perfecționați abilitățile folosind exemplul. Personal, mâinile mele sunt mereu mâncărime să încerc totul în practică :)

Deoarece cURL este atât de bun pentru analizatori, să luăm în considerare funcția de obținere a codului paginii după adresa sa. În acest caz, rezultatul va fi o matrice cu titlul, conținutul paginii și chiar coduri de eroare dacă ceva nu merge bine.

Funcția get_web_page($url) ( $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // returnează pagina web curl_setopt($ch, CURLOPT_HEADER, 0); // nu returnează antetele curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // urmează redirecționările curl_setopt($ch, CURLOPT_ENCODING, ""); // procesează toate codificările curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // expirare conexiune curl_setopt($ch, CURLOPT_TIMEOUT, 120); // timp de răspuns curl_MAXSIROPT($ch, CURLOPT_TIMEOUT, 120); , 10); // opriți după a 10-a redirecționare $conținut = 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["conținut"] = $conținut; returnează $header; )

Parametrii de intrare:
url — adresa paginii sau a site-ului.
Valorile parametrilor de ieșire (matrice cu trei elemente):
header['errno'] - dacă ceva a mers prost, aici va apărea un cod de eroare.
header[‘errmsg’] – textul de eroare va apărea aici.
header['conținut'] - pagina actuală\fișier\imagine etc.

Folosim funcția, de exemplu, astfel:

$rezultat = get_web_page("https://ya.ru"); if (($result["errno"] != 0)||($result["http_code"] != 200)) ( echo $result["errmsg"]; ) else ( $pagina = $result["conținut "]; eco $pagina; )

Totul ar trebui să meargă fără erori și veți primi codul paginii în variabila $page. Dacă încercăm să obținem pagina inexistentă yaaaaaaaaaaaa.ru, vom primi eroarea:

Nu s-a putut rezolva gazda: yaaaaaaaaaaaa.ru; Gazda de negasit

Totul este procesat corect și frumos :)
Apoi puteți face orice doriți cu codul paginii, de exemplu, să îl analizați cu expresii regulate. Dar asta e tot în lecțiile următoare, dar deocamdată să ne oprim la asta.

JavaScript este blocat în browserul dvs. Vă rugăm să activați JavaScript pentru ca site-ul să funcționeze!

Răsuci

PHP acceptă libcurl, o bibliotecă creată de Daniel Stenberg care vă permite să vă conectați la diferite tipuri de servere și protocoale.
libcurl acceptă în prezent protocoalele http, https, ftp, gopher, telnet, dict, fișier și ldap.
libcurl acceptă, de asemenea, certificate HTTPS, HTTP POST, HTTP PUT, încărcare FTP (acest lucru se poate face și cu extensia ftp PHP), încărcare bazată pe formular HTTP, proxy, cookie-uri și autentificare utilizator+parolă.

Aceste funcții au fost introduse în PHP 4.0.2.

curl_init

curl_init - inițializează o sesiune CURL.

Descriere

resursă curl_init()

Funcţie curl_init() inițializează o nouă sesiune și returnează un handle CURL pentru a fi utilizat în funcțiile și. Dacă parametrul opțional url este furnizat, atunci opțiunea CURLOPT_URL va primi valoarea acestui parametru. Îl puteți instala manual folosind .

curl_setopt

curl_setopt - setează opțiuni pentru transferul/transferul CURL.

Descriere

bool curl_setopt(resursă ch, opțiune șir, valoare mixtă)

Funcţie curl_setopt() setează opțiuni pentru sesiunea CURL identificată de parametru cap. Parametru opțiune este opțiunea pe care doriți să o setați și valoare aceasta este valoarea opțiunii opțiune .

Parametru valoare trebuie să fie lung pentru următoarele opțiuni (specificate de parametru opțiune):

  • CURLOPT_INFILESIZE: Dacă încărcați un fișier pe un site la distanță, această opțiune ar trebui folosită pentru a spune PHP care va fi dimensiunea așteptată a fișierului.
  • CURLOPT_VERBOSE: Setați această opțiune la o valoare diferită de zero dacă doriți ca CURL să raporteze toate acțiunile.
  • CURLOPT_HEADER: Setați această opțiune la o valoare diferită de zero dacă doriți ca antetul să fie inclus în rezultat.
  • CURLOPT_NOPROGRESS: Setați această opțiune la o valoare diferită de zero dacă nu doriți ca PHP să afișeze un indicator de progres al transferului CURL. (PHP setează automat această opțiune la o valoare diferită de zero; trebuie doar să o modificați la depanare.)
  • CURLOPT_NOBODY: Setați această opțiune la o valoare diferită de zero dacă nu doriți ca corpul să fie inclus în rezultat.
  • CURLOPT_FAILONERROR: Setați această opțiune la o valoare diferită de zero dacă doriți ca PHP să iasă în tăcere dacă codul HTTP returnat este mai mare de 300. În mod implicit, pagina este returnată normal cu codul ignorat.
  • CURLOPT_UPLOAD: Setați această opțiune la o valoare diferită de zero dacă doriți ca PHP să pregătească fișierul pentru încărcare.
  • CURLOPT_POST: Setați această opțiune la o valoare diferită de zero dacă doriți ca PHP să efectueze HTTP POST obișnuit. Acest POST este în forma normală application/x-www-form-urlencoded, cel mai frecvent utilizat de formularele HTML.
  • CURLOPT_FTPLISTONLY: Setați această opțiune la o valoare diferită de zero și PHP va lista nume de directoare FTP.
  • CURLOPT_FTPAPPEND: Setați această opțiune la o valoare diferită de zero și PHP se va adăuga la fișierul de la distanță în loc să îl suprascrie.
  • CURLOPT_NETRC: Setați această opțiune la o valoare diferită de zero și PHP va scana fișierul dvs. ~./netrc pentru a găsi numele de utilizator și parola pentru site-ul la distanță la care vă conectați.
  • CURLOPT_FOLLOWLOCATION: Setați această opțiune la o valoare diferită de zero pentru a urma orice antet „Locație:” pe care serverul îl trimite ca parte a unui antet HTTP (rețineți că aceasta este recursivitate, PHP va urma toate anteturile „Locație: „" care sunt trimise. )
  • CURLOPT_PUT: Setați această opțiune la o valoare diferită de zero pentru HTTP PUT-ul fișierului. Fișierul pentru PUT trebuie setat folosind CURLOPT_INFILE și CURLOPT_INFILESIZE.
  • CURLOPT_MUTE: Setați această opțiune la o valoare diferită de zero și PHP va funcționa ascuns cu privire la funcțiile CURL.
  • CURLOPT_TIMEOUT: transmiteți un lung ca parametru care conține timpul maxim în secunde în care permiteți rularea funcțiilor CURL.
  • CURLOPT_CONNECTTIMEOUT: Treceți un lung ca parametru care conține timpul maxim, în secunde, pe care îl permiteți să aștepte atunci când încercați să vă conectați. Folosiți 0 pentru a aștepta pentru totdeauna.
  • CURLOPT_LOW_SPEED_LIMIT: Treceți un lung ca parametru care conține viteza de transfer, în octeți pe secundă, sub care transferul trebuie să ruleze în timpul execuției CURLOPT_LOW_SPEED_TIME, în secunde, pentru ca PHP să o considere prea lent și să-l abandoneze.
  • CURLOPT_LOW_SPEED_TIME: Treceți un lung ca parametru care conține timpul în secunde sub care transferul trebuie să ruleze în timp ce rulează CURLOPT_LOW_SPEED_LIMIT pentru ca PHP să îl considere prea lent și să îl anuleze.
  • CURLOPT_RESUME_FROM: Trece lung ca un parametru care conține offset-ul de octeți la care ar trebui să înceapă transferul.
  • CURLOPT_SSLVERSION: transmiteți un lung ca parametru care conține versiunea SSL de utilizat (2 sau 3). În mod implicit, PHP încearcă să determine acest lucru singur, deși în unele cazuri vi se cere să setați acest lucru manual.
  • CURLOPT_SSL_VERIFYHOST: Treceți mult dacă CURL ar trebui să verifice numele comun al certificatului peer într-o strângere de mână SSL. O valoare de 1 indică faptul că ar trebui să verificăm existența unui nume comun/comun, o valoare de 2 indică faptul că ar trebui să ne asigurăm că se potrivește cu numele de gazdă furnizat.
  • CURLOPT_TIMECONDITION: transmiteți un lung ca parametru care determină modul în care este tratat CURLOPT_TIMEVALUE. Puteți seta acest parametru la TIMECOND_IFMODSINCE sau TIMECOND_ISUNMODSINCE. Acest lucru funcționează numai pentru HTTP.
  • CURLOPT_TIMEVALUE: treceți un lung ca parametru, care este timpul în secunde de la 1 ianuarie 1970. Acest timp este utilizat așa cum este specificat de opțiunea CURLOPT_TIMEVALUE sau va fi folosit TIMECOND_IFMODSINCE implicit.
  • CURLOPT_RETURNTRANSFER: transmiteți o valoare diferită de zero dacă doriți ca CURL să returneze direct informațiile primite în loc să le imprime direct.

Parametru valoare trebuie să fie un șir pentru următoarele valori ale parametrilor opțiune :

Următoarele opțiuni așteaptă un descriptor de fișier, care este obținut folosind funcția fopen() :

  • CURLOPT_FILE: Fișierul în care ar trebui să fie plasat rezultatul transferului dvs., implicit este STDOUT.
  • CURLOPT_INFILE: Fișierul din care provine intrarea dvs. de transfer.
  • CURLOPT_WRITEHEADER: Fișier pentru înregistrarea părții antet a ieșirii.
  • CURLOPT_STDERR: Fișier pentru înregistrarea erorilor, în loc de stderr.

Parametru valoare lung write_callback (resursa ch, șir de date)( ... returnează strlen($date);) opțiune :

  • CURLOPT_WRITEFUNCTION: .
  • CURLOPT_HEADERFUNCTION: .

Parametru valoare ar trebui să fie o funcție de următoarea formă șir de caractere read_callback (resursa ch, resursa fd, lungime lungă)() pentru următoarele valori ale parametrilor opțiune :

  • CURLOPT_READFUNCTION: .

curl_exec

curl_exec - execută o sesiune CURL.

Descriere

bool curl_exec(resursa ch)

Această funcție ar trebui apelată după ce ați inițializat o sesiune CURL și toate opțiunile pentru acea sesiune au fost deja setate. Scopul său este pur și simplu de a executa o sesiune CURL predefinită (specificată în parametrul cap).

curl_close

curl_close - închide sesiunea CURL.

Descriere

vid curl_close(resursa ch)

Această funcție închide sesiunea CURL și eliberează toate resursele. Mânerul CURL cap este de asemenea șters.

curl_errno

curl_errno - returnează un număr întreg care conține ultimul număr de eroare.

Descriere

Exemplul 1: Inițializarea unei noi sesiuni CURL și preluarea unei pagini web.
Exemplul 2: Folosind modulul CURL al PHP pentru a obține example.com
Exemplul 3: Verificarea accesibilității URL folosind CURL-ul PHP
Exemplul 4: Separarea antetului de corpul obținut folosind CURL-ul PHP
Exemplul 5: Determinarea unei adrese URL de referință folosind CURL-ul PHP
problema: curl_setopt($ch,FOLLOW_LOCATION,1); eroarea: probleme cu open_basedir și safe_mode soluția: o funcție deja dezvoltată de cineva soluția n 2: aceeași funcție, modificată, funcționează grozav pentru mine..= $curl_max_loops) ( $curl_loops = 0; returnează FALSE; ) curl_setopt($ch, CURLOPT_HEADER, adevărat); curl_setopt($ch, CURLOPT_RETURNTRANSFER, adevărat); $date = curl_exec($ch); list($header, $data) = explode("\n\n", $date, 2); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); dacă ($http_code == 301 || $http_code == 302) ( $potriviri = ; preg_match("/Locație:(.*?)\n/", $header, $potriviri); $url = @parse_url(trim (array_pop($potriviri))); dacă (!$url) ( //nu a putut procesa adresa URL pentru a redirecționa către $curl_loops = 0; returnează $date; ) $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)) ; dacă (!$url[„schemă”]) $url[„schemă”] = $last_url[„schemă”]; dacă (!$url[„gazdă”]) $url[„gazdă”] = $ultima_url[ "gazdă"]; dacă (!$url["cale"]) $url["cale"] = $last_url["cale"]; $new_url = $url["schemă"] . "://" . $ url[„gazdă”] . $url[„cale”] . ($url[„interogare”]?”?”.$url[„interogare”]:””); curl_setopt($ch, CURLOPT_URL, $new_url) ; debug("Redirecționare către", $new_url); return curl_redir_exec($ch); ) else ($curl_loops=0; return $date; ) ) ?>
Folosiți doar această funcție fără FOLLOW_LOCATION și ar trebui să funcționeze. problema a fost că atunci când ajungeți la linia în care returnați datele dacă http_code a fost diferit de 301 oe 302, $data are informații învechite sau nici una. deci $debbbb face treaba.
Exemplul 6: Analizarea unui cookie din antet folosind CURL PHP
Uneori nu puteți folosi CURLOPT_COOKIEJAR și CURLOPT_COOKIEFILE din cauza setărilor php ale serverului (se spune că puteți prelua orice fișier de pe server folosind aceste opțiuni). Iată soluția 1) Nu utilizați CURLOPT_FOLLOWLOCATION 2) Folosiți curl_setopt($ch, CURLOPT_HEADER, 1) 3)Luați cookie-uri din antet astfel: preg_match_all("|Set-Cookie: (.*);|U", $conținut, $rezultate); $cookies = implode(";", $rezultate); 4)Setați-le folosind curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Exemplul 7: Analizarea unui cookie din antet folosind CURL PHP
După cum a menționat Yevgen mai devreme, uneori, nu putem folosi CURLOPT_COOKIEJAR și CURLOPT_COOKIEFILE. Mai jos este o funcție de apel invers pentru antet pe care am scris-o în ianuarie, care vă permite să păstrați cookie-uri între solicitările cURL. Cookie-urile sunt adăugate la $ch în timpul tuturor solicitărilor, chiar și în timpul redirecționării, astfel încât să puteți folosește-l împreună cu CURLOPT_FOLLOWLOCATION.Iată codul: function read_header($ch, $string) ( global $locație; #ține evidența locației/redirecționează global $cookiearr; #stocare cookie-uri aici global $ch; # ^ suprascrie parametrul funcției $ch # este în regulă, deoarece trebuie să # actualizăm $ch global cu # cookie-uri noi $length = strlen($șir); if(!strncmp($șir, "Locație:", 9)) ( #ține evidența ultima redirecționare $locație = trim(substr($șir, 9, -1)); ) if(!strncmp($șir, "Set-Cookie:", 11)) ( #obțineți cookie-ul $cookiestr = trim(substr( $șir, 11, -1)); $cookie = explode(";", $cookiestr); $cookie = explode("=", $cookie); $cookiename = trim(array_shift($cookie)); $cookiearr [$cookiename] = trim(implode("=", $cookie)); ) $cookie = ""; if(trim($string) == "") ( #execută numai la sfârșitul antetului foreach ($cookiearr ca $key=>$value) ( ​​​​$cookie .= "$key=$value; "; ) curl_setopt ($ ch, CURLOPT_COOKIE, $cookie); ) returnează $lungime; ) curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_header"); Acest cod presupune că veți reutiliza $ch fără a-l inițializa de fiecare dată (apelați curl_init o singură dată, la început). Dacă trebuie să inițializați $ch din nou în orice moment al codului dvs., puteți accesa cookie-urile stocate în prezent în $cookiearr și le puteți include în noul $ch. Am scris această funcție înainte de a avea suficientă experiență cu expresiile regulate, astfel încât să nu găsiți niciun apel preg_match aici. Am folosit acest cod de ceva timp și fără probleme la accesarea gmail, yahoo, hotmail, aol etc. unde a trebuit treceți prin autentificare și câteva pagini înainte de a ajunge la ceea ce căutam.
Exemplul 8: Configurarea unui handler de încărcare antet folosind CURL PHP
Folosind cURL, trebuia să apelez un script terță parte care returna date binare ca atașament pentru a transmite din nou datele preluate ca atașament. Problema a fost că scriptul terță parte a returnat ocazional erori HTTP și am vrut să evit să transmit atașamente de lungime zero în astfel de cazuri. Combinația de utilizare a apelului CURLOPT_FAILONERROR și CURLOPT_HEADERFUNCTION a ajutat la procesarea corectă a erorilor HTTP de script-ul terță parte: function curlHeaderCallback($resURL, $strHeader) ( if (preg_match("/^HTTP/i", $strHeader))) ( header($strHeader) ); header("Conținut-Dispoziție: atașament; nume fișier="nume-fișier.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) ( printează „Eroare cu codul: " . $intReturnCode; )
Exemplul 9. Salvarea unei pagini într-un fișier și calcularea ratei de transfer folosind CURL PHP
WritePageToFile("http://es.php.net", "es.php.net.txt"); funcția WritePageToFile($sHTMLpage, $sTxtfile) ( $sh = curl_init($sHTMLpage); $hFile = FOpen($sTxtfile, „w”); curl_setopt($sh, CURLOPT_FILE, $hFile); curl_setopt($sh, CURLOPT_HEADER, 0); curl_exec ($sh); $sAverageSpeedDownload = curl_getInfo($sh, CURLINFO_SPEED_DOWNLOAD); $sAverageSpeedUpload = curl_getInfo($sh, CURLINFO_SPEED_UPLOAD); echo "
"; echo "Viteza medie de descărcare == " . $sAverageSpeedDownload . " 
"; echo "Încărcare cu viteză medie == " . $sAverageSpeedUpload ."
"; ecou"
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo"
"; curl_close($sh); FCclose ($hFile); echo "( Vedeți fișierul "".$sTxtfile."" în aceeași cale a găzduirii." " până unde acest script PHP).
"; }
Exemplul 9. Primirea unei pagini printr-o conexiune SSL (https)
$ch=curl_init("https://site-ul"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Dezactivează eroarea „Problemă cu certificatul SSL, verifică dacă certificatul CA este OK” curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Dezactivează eroarea „SSL: numele subiectului certificatului „hostname.ru” nu se potrivește cu numele gazdei țintă „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);
Exemplul 10: Utilizarea sesiunilor și cookie-urilor în curl
$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);//salvați cookie-urile primite într-un fișier curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //trimite către server COOKIE-urile primite de la acesta în timpul autorizării $out=curl_exec($curl);
Exemplul 11: Încărcarea fișierului și matricea multidimensională în Curl. CURLOPT_POSTFIELDS + CurlFile

Dacă trebuie să trimiteți o matrice multidimensională și un fișier într-o solicitare POST, veți întâlni o problemă insolubilă. Dacă transmiteți o matrice multidimensională către CURLOPT_POSTFIELDS, al doilea nivel va fi transmis ca șirul „Matrice”. Dacă convertiți folosind http_build_query, nu veți putea transfera fișierul.

Mai jos este o funcție pentru codificarea unei matrice bidimensionale cu încărcare de fișiere pentru Curl, care va funcționa în ambele versiuni mai vechi de PHP 5.3, PHP 5.4 și PHP 5.6

/** convertește o matrice multidimensională într-o matrice unidimensională folosind indecși complecși și înlocuiește @ din prefix cu CurlFile pentru utilizare în Curl * @param $inputArray * @param șir $inputKey * @return array $requestVars = array ("id" => array( 1, 2,"id" => 1234), "name" => "jurnal", "logfile" => "@/tmp/test.log"); obținem: ["id"] => int(1) ["id"] => int(2) ["id"] => int(1234) ["nume"] => string(3) "log" [ "logfile"]=> string(13) "/tmp/test.log" ) */ function convertToStringArray($inputArray, $inputKey="") ( $resultArray=; foreach ($inputArray ca $key => $valoare ) ( $tmpKey = (bool)$inputKey ? $inputKey."[$key]" : $cheie; if (este_matrice($valoare)) ( $resultArray+=convertToStringArray($valoare, $tmpKey); ) elseif ($valoare) = = "@")( $resultArray[$tmpKey] = (class_exists(" CURLFile ", false)) ? CurlFile nou(ltrim($valoare, "@")) : $valoare; ) else ( $resultArray[$tmpKey ] = $valoare; ) ) returnează $resultArray; ) // verifica $requestVars = array("id" => array(1, 2,"id"=>1234), "name" => "log", "logfile" " => "@/tmp/test.log"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, „site”); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars)); $res = curl_exec($ch); curl_close($ch); Exemple de aplicare de utilizare a Curl