Perfecționează-ți abilitățile cu cURL. curl_setopt - Setați opțiunea pentru sesiunea CURL Ce face curl

Viața unui dezvoltator web este afectată de dificultăți. Este deosebit de frustrant atunci când sursa acestor dificultăți este necunoscută. Este o problemă cu trimiterea unei cereri, sau cu un răspuns, sau cu o bibliotecă terță parte, sau API-ul extern are erori? Există multe instrumente diferite care ne pot face viața mai ușoară. Iată câteva instrumente de linie de comandă pe care personal le găsesc de neprețuit.

răsuci
cURL este un program pentru transferul de date prin diferite protocoale, similar cu wget. Principala diferență este că, implicit, wget salvează într-un fișier, în timp ce cURL iese în linia de comandă. Acest lucru face foarte ușor să vizualizați conținutul site-ului web. De exemplu, iată cum să obțineți rapid IP-ul extern curent:

$ curl ifconfig.me 93.96.141.93
Opțiuni -i(arata titluri) si -Eu(afișați numai antetele) face din cURL un instrument excelent pentru depanarea răspunsurilor HTTP și pentru a analiza exact ce vă trimite serverul:

$ curl -I habrahabr.ru HTTP/1.1 200 OK Server: nginx Data: Thu, 18 Aug 2011 14:15:36 GMT Content-Type: text/html; charset=utf-8 Conexiune: keep-alive Keep-alive: timeout=25
Parametru -L de asemenea, util, face ca cURL să urmărească automat redirecționările. cURL acceptă autentificare HTTP, cookie-uri, tunel prin proxy HTTP, setări manuale pentru antet și multe, multe altele.

Asediu
Siege este un instrument de testare a sarcinii. În plus, are o opțiune la îndemână -g, care este foarte asemănător cu curl -il, dar vă arată și antetele cererii http. Iată un exemplu de pe google.com (unele titluri au fost eliminate pentru concizie):

$ siege -g www.google.com GET / HTTP/1.1 Gazdă: www.google.com User-Agent: JoeDog/1.00 (X11; I; Siege 2.70) Conexiune: închide HTTP/1.1 302 Locație găsită: http:// www.google.co.uk/ Tip de conținut: text/html; charset=UTF-8 Server: gws Lungimea conținutului: 221 Conexiune: închide GET / HTTP/1.1 Gazdă: www.google.co.uk Agent utilizator: JoeDog/1.00 (X11; I; Siege 2.70) Conexiune: închide HTTP/ 1.1 200 OK Tip de conținut: text/html; set de caractere=ISO-8859-1 X-XSS-Protecție: 1; mode=block Conexiune: close
Dar ceea ce este cu adevărat excelent pentru Siege este testarea de încărcare. Ca și benchmark-ul Apache ab, poate trimite multe solicitări simultane către site și poate vedea cum gestionează traficul. Următorul exemplu arată cum testăm Google cu 20 de solicitări timp de 30 de secunde, după care este afișat rezultatul:

$ siege -c20 www.google.co.uk -b -t30s ... Ridicarea asediului serverului... gata. Tranzacții: 1400 de accesări Disponibilitate: 100,00 % Timp scurs: 29,22 secunde Date transferate: 13,32 MB Timp de răspuns: 0,41 secunde Rata tranzacției: 47,91 trans/sec Debit: 0,46 MB/sec Concurență: 19,53 Tranzacții reușite: 40 tranzacții cu succes: 40 tranzacții cu succes 4,08 Cea mai scurtă tranzacție: 0,08
Una dintre cele mai utile caracteristici ale Siege este că poate funcționa nu numai cu o singură adresă, ci și cu o listă de adrese URL dintr-un fișier. Acest lucru este grozav pentru testarea de încărcare, deoarece puteți simula traficul real pe site-ul dvs. în loc să accesați aceeași adresă URL din nou și din nou. De exemplu, iată cum să utilizați Siege pentru a încărca un server folosind adrese din jurnalul dvs. Apache:

$ cut -d " " -f7 /var/log/apache2/access.log > urls.txt $ siege -c -b -f urls.txt
ngrep
Pentru o analiză serioasă a traficului, există Wireshark cu mii de setări, filtre și configurații. Există și o versiune de linie de comandă rechinul. Dar pentru sarcini simple, consider că funcționalitatea Wireshark este redundantă. Deci, atâta timp cât nu am nevoie de o armă puternică, folosesc . Vă permite să faceți același lucru cu pachetele de rețea ca grep face cu fișierele.

Pentru traficul web, aproape întotdeauna veți dori să utilizați -W pentru a păstra formatarea șirurilor, precum și opțiunea -q, care ascunde informații redundante despre pachetele neadecvate. Iată un exemplu de comandă care interceptează toate pachetele cu o comandă GET sau POST:

ngrep -q -W byline "^(GET|POST).*"
Puteți adăuga un filtru suplimentar pentru pachete, de exemplu, după o anumită gazdă, adresă IP sau port. Iată un filtru pentru tot traficul de intrare și de ieșire de pe google.com, portul 80, care conține cuvântul „căutare”.

ngrep -q -W byline „căutare” gazdă www.google.com și portul 80

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

curl_setopt- Setează o opțiune pentru o sesiune CURL

Lista parametrilor

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

Setarea parametrului CURLOPT_XXX.

Valoarea parametrului de opțiune.

bool:

Parametru Remarci
CURLOPT_AUTOREFERER ADEVĂRAT pentru a seta automat câmpul referitor:în cererile redirecționate prin antet Locație:.
CURLOPT_BINARYTRANSFER ADEVĂRAT pentru a returna un răspuns 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 spune sesiunii curente 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 cookie-uri „de sesiune” sau nu. Cookie-urile „de sesiune” sunt cookie-uri fără o dată de expirare, care ar trebui să existe doar pentru „sesiunea” curentă.
CURLOPT_CERTINFO ADEVĂRAT pentru a transmite informații despre certificatul SSL în flux 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ă facă autentificarea proxy și configurarea conexiunii necesare, dar nu trimite date. Această opțiune este implementată pentru HTTP, SMTP și POP3. Adăugat în 7.15.2. Disponibil începând cu 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ă setare 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 ca de obicei, 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 pentru a urma orice antet "Locație: " trimis de server în răspunsul său (rețineți că acest lucru se întâmplă recursiv, PHP va urma toate anteturile trimise "Locație: ", cu excepția cazului în care constanta este setată CURLOPT_MAXREDIRS).
CURLOPT_FORBID_REUSE ADEVĂRAT pentru a forța închiderea unei conexiuni după ce a terminat procesarea, astfel încât să nu poată fi reutilizată.
CURLOPT_FRESH_CONNECT ADEVĂRAT pentru a forța utilizarea unei noi conexiuni în locul celei din cache.
CURLOPT_FTP_USE_EPRT ADEVĂRAT pentru a utiliza EPRT (și LPRT) pentru descărcări FTP active. Utilizare FALS pentru a dezactiva EPRT și LPRT și utilizați numai PORT.
CURLOPT_FTP_USE_EPSV ADEVĂRAT pentru proba inițială a comenzii EPSV în transferurile 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ă operațiunea FTP întâlnește o cale inexistentă.
CURLOPT_FTPAPPEND ADEVĂRAT pentru a scrie fișierul șters până la sfârșit, în loc să îl suprascrieți peste fișierul existent.
CURLOPT_TCP_NODELAY Specifică dacă opțiunea TCP_NODELAY trebuie să fie permanent setată sau ștearsă (1 = setat, 0 = șters). În mod implicit, opțiunea este ștearsă. Disponibil începând cu PHP 5.2.1 pentru versiunile construite cu libcurl 7.11.2 sau mai nou.
CURLOPT_FTPASCII Poreclă CURLOPT_TRANSFERTEXT. Folosește-l în schimb.
CURLOPT_FTPLISTONLY ADEVĂRAT pentru a returna doar lista 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 descriptor. Disponibil începând cu PHP 5.1.3. Prefix CURLINFO_ folosit special.
CURLOPT_HTTPGET ADEVĂRAT pentru a reseta metoda de solicitare HTTP la o metodă 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ță la 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 anula bara de progres pentru transferurile cURL.

cometariu:

PHP setează automat această opțiune 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 PHP către proces. Această setare este activată implicit în SAPI-urile cu mai multe fire pentru ca setările de timeout să funcționeze corect.
CURLOPT_POST ADEVĂRAT pentru a utiliza HTTP POST obișnuit. Această metodă POST folosește metoda obișnuită , folosit în mod obișnuit în formularele HTML.
CURLOPT_PUT ADEVĂRAT pentru a încărca un fișier utilizând metoda HTTP PUT. Fișierul utilizat trebuie setat folosind opțiuni 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 încărcate CURLOPT_POSTFIELDS, ceea ce înseamnă că valorile trecute cu @ pot fi trecute în siguranță ca câmpuri. În loc de prefix, puteți utiliza opțiunea CURLFile d. Adăugat în PHP 5.5.0 cu valoarea implicită FALS. În PHP 5.6.0 a devenit implicit egal cu ADEVĂRAT.
CURLOPT_SSL_VERIFYPEER FALS pentru a opri cURL să verifice certificatul gazdă. Certificatele alternative verificate pot fi specificate folosind parametrul CURLOPT_CAINFO sau un director cu certificate specificate de parametru CURLOPT_CAPATH. Valoarea implicită este ADEVĂRAT din versiunea cURL 7.10. Distribuția implicită este instalată începând cu 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 este setat pe 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 parametrului opțiune, parametrul valoare trebuie să fie de tip întreg:

Parametru valoare de setat Remarci
CURLOPT_BUFFERSIZE Dimensiunea tamponului utilizat la 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 în timp ce încercați să vă conectați. Folosiți 0 pentru așteptare infinită.
CURLOPT_CONNECTTIMEOUT_MS Numărul de milisecunde de așteptat în timp ce încercați să vă conectați. Folosiți 0 pentru așteptare infinită. Dacă biblioteca libcurl este compilată utilizând soluția implicită de rezolvare a numelui de sistem, 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 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 păstrate în memorie. În mod implicit, această setare 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 cURL 7.12.2.
CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE (implicit, CURL alege ce versiune să folosească), CURL_HTTP_VERSION_1_0 (implic HTTP/1.0) sau CURL_HTTP_VERSION_1_1 (implic HTTP/1.1).
CURLOPT_HTTPAUTH

Puteți utiliza operatorul pe biți | (sau) pentru o combinație de 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ță. Rețineți că utilizarea acestei opțiuni nu va opri trimiterea de date suplimentare care depășesc această valoare, deoarece datele trimise depind de rezultat. CURLOPT_READFUNCTION.
CURLOPT_LOW_SPEED_LIMIT Pragul superior al ratei 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 conexiunea care trebuie închisă. CURLOPT_CLOSEPOLICY.
CURLOPT_MAXREDIRS Numărul maxim de redirecționări de acceptat. Utilizați această opțiune împreună cu opțiunea CURLOPT_FOLLOWLOCATION.
CURLOPT_PORT Port de conectare alternativ.
CURLOPT_POSTREDIR Mască de biți care conține 1 (301 mutat permanent), 2 (302 găsite) ș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_PROTOCOLS

Masca de biți a valorilor CURLPROTO_*. Această mască restricționează protocoalele utilizate de libcurl. Acest lucru vă permite să aveți libcurl care funcționează cu un număr mare de protocoale și să restricționați anumite transferuri să funcționeze numai pentru un anumit set de protocoale. În mod implicit, libcurl utilizează toate protocoalele acceptate. Vezi și parametrul CURLOPT_REDIR_PROTOCOLE.

Valori de protocol valide: CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_LDAPS , CURLPROILE, CURLPROTO_PROTO_DTP_PROTO_FTP

CURLOPT_PROXYAUTH Metodele de autorizare HTTP utilizate la conectarea la serverul proxy. Utilizați aceleași măști de biți ca cele descrise pentru parametru CURLOPT_HTTPAUTH. În prezent, numai CURLAUTH_BASIC și CURLAUTH_NTLM sunt acceptate pentru autorizarea proxy. Adăugat în cURL 7.10.7.
CURLOPT_PROXYPORT Numărul portului serverului proxy la care se realizează 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 restricționează protocoalele utilizate de libcurl la redirecționare (când CURLOPT_FOLLOWLOCATION). Acest lucru vă permite să limitați setul de protocoale utilizate pentru redirecționări pentru unele transferuri. Î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_PROTOCOLS pentru o listă de constante cu valori de protocol. Adăugat în cURL 7.19.4.
CURLOPT_RESUME_FROM Offset de la începutul transmisiei, în octeți.
CURLOPT_SSL_VERIFYHOST Utilizați 1 pentru a verifica dacă numele comun există î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 a fost 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 a executa funcțiile cURL.
CURLOPT_TIMEOUT_MS Numărul maxim de milisecunde permis pentru a executa funcțiile cURL. Dacă libcurl este compilat utilizând soluția normală de rezolvare a numelor de sistem, atunci acest interval de conexiune va folosi în continuare timeout-uri rotunjite a doua, cu timeout-ul minim permis fiind de o secundă. Adăugat în 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ă opțiunea 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ă descărcarea pe server depășește această valoare (specificată în octeți pe secundă) în medie pe parcursul întregului transfer, atunci descă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 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ă singur unul dintre ele. Adăugat în cURL 7.16.1.
CURLOPT_IPRESOLVE Permite unei aplicații să aleagă tipul de adresă IP cu care este determinat numele de gazdă. Acest lucru este necesar dacă este utilizat un nume de gazdă care este obținut folosind 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 parametrului opțiune, parametrul valoare trebuie să fie de tip şir:

Parametru valoare de setat Remarci
CURLOPT_CAINFO Numele unui fișier care conține unul sau mai multe certificate împotriva cărora nodurile vor verifica. Această opțiune 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-uri:” Utilizat în cererea HTTP. 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. Fișierul dat trebuie să fie în format Netscape sau doar antetele 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 toate modulele cookie interne ale transferului curent vor fi salvate după ce mânerul este închis, de exemplu, după ce curl_close este apelat.
CURLOPT_CUSTOMREQUEST

Metoda de solicitare nativă 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 valide ar fi cuvinte ca "OBȚINE", "POST", "CONECTAȚI" si asa 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ă se trece 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 folosită pentru a determina adresa IP pentru comanda „PORT” a protocolului FTP. 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 doar „-” 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 Parola necesară 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 trimise într-o solicitare HTTP POST. Pentru a transfera un fișier, precedați numele fișierului cu @ ș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 URL, cum ar fi " para1=val1¶2=val2&...", și ca o matrice, ale căror chei sunt numele câmpurilor, iar valorile sunt conținutul lor. Dacă valoarea este o matrice, antetul tipul de conținut va fi setat la multipart/form-data. Începând cu PHP 5.2.0, la încărcarea fișierelor cu un prefix @ , valoarea trebuie să fie o matrice. Din PHP 5.5.0, prefix @ este depreciat și fișierele pot fi trimise folosind CURLFile. Prefix @ poate fi dezactivat pentru a permite transmiterea valorilor începând 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 ca ":" 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 Intervalul de date de încărcat, în format "X Y", și fie X, fie Y pot fi omise. Protocolul HTTP acceptă și transferul de mai multe intervale separate prin virgulă, acestea fiind specificate în format "X-Y, N-M".
CURLOPT_REFERER Conținutul antetului "Referitor:" De utilizat î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 gazdei la distanță, iar libcurl va renunța la 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 dvs. publică. Dacă nu este setat, atunci libcurl este implicit la 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 setat, 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 cu 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 fișierului unui 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 cURL 7.9.3.
CURLOPT_SSLENGINE ID-ul mecanismului 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ă, rețineți că acest script PHP trebuie stocat într-un loc sigur.

CURLOPT_SSLKEYTYPE Tipul cheii private SSL specificate în parametru CURLOPT_SSLKEY. Sunt acceptate următoarele tipuri de chei: "PEM"(Mod implicit), „DER”și "ENG".
CURLOPT_URL Adresă URL încărcabilă. Acest parametru poate fi setat și atunci când sesiunea este inițializată cu curl_init().
CURLOPT_USERAGENT Conținutul antetului "Agent utilizator: ", trimis în cererea HTTP.
CURLOPT_USERPWD Login și parola utilizate la conectare, specificate în format ":" .

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

Parametru valoare de setat Remarci
CURLOPT_HTTP200ALIASES O serie de răspunsuri HTTP 200 care vor fi tratate ca răspunsuri valide, nu eronate. Adăugat în cURL 7.10.3.
CURLOPT_HTTPHEADER O matrice de anteturi HTTP de setat, în formatul matrice ("Content-type: text/plain", "Content-length: 100")
CURLOPT_POSTQUOTE O serie de comenzi FTP care urmează să fie executate pe server după ce se face cererea FTP.
CURLOPT_QUOTE O serie de comenzi FTP care urmează să fie executate pe server înainte de efectuarea cererii FTP.

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

Parametru valoare de setat
CURLOPT_FILE Fișierul în care va fi scris rezultatul transferului. Implicit este utilizarea fluxului de ieșire 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 a erorilor de utilizat în locul fluxului de erori STDERR.
CURLOPT_WRITEHEADER Fișierul în care vor fi scrise anteturile operațiunii 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 valoare de setat
CURLOPT_HEADERFUNCTION Funcția de apel invers ia doi parametri. Primul parametru este mânerul cURL, al doilea parametru este șirul cu anteturile de scris. 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 mânerul 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, o eroare va fi aruncată 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 intermediul opțiunii CURLOPT_INFILE, iar al treilea parametru este cantitatea maximă permisă de date de citit. Funcția de apel invers trebuie să returneze un șir care nu este mai lung decât cantitatea de date solicitată, de obicei prin citirea din resursa de flux transmisă. Ar trebui să returneze un șir gol pentru un semnal de sfârșit de fișier EOF.
CURLOPT_WRITEFUNCTION Funcția de apel invers ia doi parametri. Primul parametru este mânerul cURL, iar al doilea parametru este șirul cu datele de scris. Datele trebuie salvate folosind această funcție. Trebuie să returneze numărul exact de octeți scrisi, altfel descărcarea va eșua 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 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 Parametri adăugați CURLOPT_PROTOCOLSși CURLOPT_REDIR_PROTOCOLE.
5.1.0 Parametri adăugați CURLOPT_AUTOREFERER, CURLOPT_BINARYTRANSFER, CURLOPT_FTPSSLAUTH, CURLOPT_PROXYAUTHși CURLOPT_TIMECONDITION.
5.0.0 Parametri adăugați CURLOPT_FTP_USE_EPRT, CURLOPT_NOSIGNAL, CURLOPT_UNRESTRICTED_AUTH, CURLOPT_BUFFERSIZE, CURLOPT_HTTPAUTH, CURLOPT_PROXYPORT, CURLOPT_PROXYTYPE, CURLOPT_SSLCERTTYPEși CURLOPT_HTTP200ALIASES.

Exemple

Beispiel #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 unui tablou către CURLOPT_POSTFIELDS codificați datele în formular multipart/form-data, în timp ce trecerea unui șir codificat URL va codifica datele ca application/x-www-form-urlencoded.

cURL este un instrument special conceput pentru a transfera fișiere și date folosind sintaxa URL. Această tehnologie acceptă multe protocoale, cum ar fi HTTP, FTP, TELNET și multe altele. cURL a fost conceput inițial pentru a fi un instrument de linie de comandă. Din fericire pentru noi, biblioteca cURL este suportată de limbajul de programare PHP. În acest articol, ne vom uita la unele dintre caracteristicile avansate cURL, precum și vom aborda aplicarea practică a cunoștințelor dobândite folosind PHP.

De ce cURL?

De fapt, există destul de multe modalități alternative de a prelua conținutul unei pagini web. În multe cazuri, mai ales din lene, am folosit funcții PHP simple în loc de cURL:

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

Cu toate acestea, aceste funcții practic nu au flexibilitate și conțin un număr mare de deficiențe în ceea ce privește gestionarea erorilor și așa mai departe. În plus, există anumite sarcini pe care pur și simplu nu le puteți rezolva cu aceste funcții standard: interacțiunea cu cookie-uri, autentificare, trimiterea unui formular, încărcarea fișierelor și așa mai departe.

cURL este o bibliotecă puternică care acceptă multe protocoale și opțiuni diferite și oferă informații detaliate despre solicitările URL.

Structură de bază

  • Inițializare
  • Atribuirea parametrilor
  • Executarea și preluarea rezultatului
  • Eliberarea memoriei

// 1. initializare $ch = curl_init(); // 2. specificați opțiuni, inclusiv url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. obține HTML ca rezultat $output = curl_exec($ch); // 4. închide conexiunea curl_close($ch);

Pasul #2 (adică apelarea curl_setopt()) va fi discutat în acest articol mult mai mult decât toți ceilalți pași, deoarece. în această etapă, se întâmplă toate cele mai interesante și utile lucruri pe care trebuie să le știi. Există un număr mare de opțiuni diferite în cURL care trebuie specificate pentru a putea configura o solicitare URL în modul cel mai complet. Nu vom lua în considerare întreaga listă ca un întreg, ci ne vom concentra doar pe ceea ce consider necesar și util pentru această lecție. Orice altceva le puteți explora singur dacă acest subiect vă interesează.

Verificare erori

În plus, puteți utiliza și instrucțiuni condiționale pentru a testa dacă o operațiune a reușit:

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

Aici vă rog să rețineți un punct foarte important pentru dvs.: trebuie să folosim „=== false” pentru comparație, în loc de „== fals”. Pentru cei care nu cunosc, acest lucru ne va ajuta să distingem între un rezultat gol și o valoare booleană falsă, care va indica o eroare.

Primirea informațiilor

Un alt pas suplimentar este să obțineți date despre cererea cURL după ce aceasta a fost executată.

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

Matricea returnată conține 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”
  • dimensiune_descărcare
  • „viteză_descărcare”
  • „speed_upload”
  • „download_content_length”
  • „încărcare_conținut_lungime”
  • „starttransfer_time”
  • "redirect_time"

Detectarea redirecționării în funcție de browser

În acest prim exemplu, vom scrie cod care poate detecta redirecționările URL pe baza diferitelor setări ale browserului. De exemplu, unele site-uri web redirecționează browserele unui telefon mobil sau ale oricărui alt dispozitiv.

Vom folosi opțiunea CURLOPT_HTTPHEADER pentru a determina antetele noastre HTTP de ieșire, inclusiv numele browserului utilizatorului și limbile disponibile. În cele din urmă, vom putea determina ce site-uri ne redirecționează către adrese URL diferite.

// URL de testare $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // testarea browserelor $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" => "ro"), "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(); // specificați url curl_setopt($ch, CURLOPT_URL, $url); // setați antetele browserului 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); // trebuie să obținem antete HTTP curl_setopt($ch, CURLOPT_HEADER, 1); // returnează rezultate în loc de curl_setopt($ch) , CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); // A existat o redirecționare HTTP? if (preg_match("!Location: (.*)!", $output, $match) ) ( echo " $nume_test: redirecționează către $potriviri\n"; ) else ( echo "$nume_test: fără redirecționare\n"; ) ) echo "\n\n"; )

Mai întâi, specificăm o listă de adrese URL ale site-urilor pe care le vom verifica. Mai exact, avem nevoie de adresele acestor site-uri. În continuare, trebuie să definim setările browserului pentru a testa fiecare dintre aceste adrese URL. După aceea, vom folosi o buclă în care vom parcurge toate rezultatele obținute.

Trucul pe care îl folosim în acest exemplu pentru a seta setările cURL ne va permite să obținem nu conținutul paginii, ci doar anteturile HTTP (stocate în $output). Apoi, folosind o regex simplă, putem determina dacă șirul „Locație:” a fost prezent în anteturile primite.

Când rulați acest cod, ar trebui să obțineți ceva de genul acesta:

Efectuarea unei cereri POST către o anumită adresă URL

Când se formează o solicitare GET, datele transmise pot fi transmise la adresa URL printr-un „șir de interogare”. De exemplu, când efectuați o căutare pe Google, termenul de căutare este plasat în bara de adrese a noii adrese URL:

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

Nu trebuie să utilizați cURL pentru a simula această solicitare. Dacă lenea te învinge în sfârșit, folosește funcția „file_get_contents ()” pentru a obține rezultatul.

Dar lucrul este că unele formulare HTML trimit solicitări POST. Datele acestor formulare sunt transportate prin corpul cererii HTTP, și nu ca în cazul precedent. De exemplu, dacă ați completat un formular pe un forum și ați făcut clic pe butonul de căutare, atunci cel mai probabil va fi făcută o solicitare POST:

http://codeigniter.com/forums/do_search/

Putem scrie un script PHP care poate simula acest tip de solicitare URL. Mai întâi, să creăm un fișier simplu pentru a accepta și afișa datele POST. Să-i spunem post_output.php:

Print_r($_POST);

Apoi creăm un script PHP pentru a executa solicitarea cURL:

$url = "http://localhost/post_output.php"; $post_data = array("foo" => "bar", "query" => "Nettuts", "action" => "Trimite"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // indică faptul că avem o cerere POST curl_setopt($ch, CURLOPT_POST, 1); // adaugă variabile curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $ieșire = curl_exec($ch); curl_close($ch); echo $ieșire;

Când rulați acest script, ar trebui să obțineți un rezultat similar:

Astfel, cererea POST a fost trimisă către scriptul post_output.php, care la rândul său a scos în evidență matricea superglobală $_POST, al cărei conținut l-am obținut folosind cURL.

Fișier încărcat

Mai întâi, să creăm un fișier pentru al forma și să-l trimitem în fișierul upload_output.php:

Print_r($_FILES);

Și iată codul de script care realizează funcționalitatea de mai sus:

$url = "http://localhost/upload_output.php"; $post_data = matrice ("foo" => "bar", // fișier pentru a încărca "upload" => "@C:/wamp/www/test.zip"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $ieșire = curl_exec($ch); curl_close($ch); echo $ieșire;

Când doriți să încărcați un fișier, tot ce trebuie să faceți este să îl transmiteți ca variabilă post obișnuită, precedată de simbolul @. Când rulați scriptul scris, veți obține următorul rezultat:

CURL multiple

Unul dintre cele mai mari puncte forte ale cURL este capacitatea de a crea „mai multe” handlere de cURL. Acest lucru vă permite să deschideți o conexiune la mai multe adrese URL în același timp și asincron.

În versiunea clasică a cererii cURL, execuția scriptului este suspendată, iar operațiunea de solicitare URL este de așteptat să se finalizeze, după care scriptul poate continua. Dacă intenționați să interacționați cu o mulțime de adrese URL, acest lucru va consuma destul de mult timp, deoarece în cazul clasic puteți lucra doar cu o singură adresă URL la un moment dat. Cu toate acestea, putem remedia această situație utilizând handlere speciali.

Să aruncăm o privire la exemplul de cod pe care l-am luat de pe php.net:

// creează câteva resurse cURL $ch1 = curl_init(); $ch2 = curl_init(); // specificați URL-ul și alți parametri 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); //creez un handler cURL multiplu $mh = curl_multi_init(); //adăugarea mai multor handlere curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $activ = nul; //execuție do ( $mrc ​​​​= curl_multi_exec($mh, $activ); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($activ && $mrc ​​​​== CURLM_OK) ( dacă (curl_multi_select($mh) != -1) ( do ( $mrc ​​​​= curl_multi_exec($mh, $activ); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); ) ) //închide curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Ideea este că puteți utiliza mai mulți handlere cURL. Folosind o buclă simplă, puteți urmări ce solicitări nu au fost încă finalizate.

În acest exemplu, există două bucle principale. Prima buclă do-while apelează funcția curl_multi_exec(). Această caracteristică nu este blocată. Se execută cât de repede poate și returnează starea cererii. În timp ce valoarea returnată este constanta „CURLM_CALL_MULTI_PERFORM”, aceasta înseamnă că munca nu a fost încă finalizată (de exemplu, anteturile http din adresa URL sunt trimise în prezent); De aceea continuăm să verificăm această valoare de returnare până când obținem un rezultat diferit.

În bucla următoare, verificăm condiția în timp ce $activ = „adevărat”. Este al doilea parametru al funcției curl_multi_exec(). Valoarea acestei variabile va fi „adevărată” atâta timp cât oricare dintre modificările existente este activă. Apoi, numim funcția curl_multi_select(). Execuția sa „blochează” atâta timp cât există cel puțin o conexiune activă, până când se primește un răspuns. Când se întâmplă acest lucru, ne întoarcem la bucla principală pentru a continua să executăm interogări.

Și acum să aplicăm ceea ce am învățat cu un exemplu care va fi cu adevărat util pentru un număr mare de oameni.

Verificarea linkurilor în WordPress

Imaginați-vă un blog cu un număr mare de postări și mesaje, fiecare dintre ele având link-uri către resurse externe de internet. Unele dintre aceste link-uri ar putea fi deja „moarte” din diverse motive. Poate că pagina a fost ștearsă sau site-ul nu funcționează deloc.

Vom crea un script care va analiza toate linkurile și va găsi site-uri web care nu se încarcă și 404 pagini, apoi ne va oferi un raport foarte detaliat.

Voi spune imediat că acesta nu este un exemplu de creare a unui plugin pentru WordPress. Acesta este aproape totul un teren de testare bun pentru noi.

Să începem în sfârșit. Mai întâi trebuie să obținem toate linkurile din baza de date:

// configurare $db_host = "localhost"; $db_user = „rădăcină”; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "www.mydomain.com"); $max_connections = 10; // inițializarea variabilei $url_list = array(); $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 not select db: " . mysql_error()); ) // selectează toate postările publicate cu link-uri $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)) ( // preia link-uri folosind expresii regulate if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $ potriviri) ) ( foreach ($se potrivește ca $url) ( $tmp = parse_url($url); if (in_array($tmp["gazdă"], $excluded_domains)) (continuare; ) $url_list = $url; ) ) ) / / elimina duplicatele $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Fără URL de verificat"); )

În primul rând, generăm date de configurare pentru interacțiunea cu baza de date, apoi scriem o listă de domenii care nu vor participa la verificare ($excluded_domains). De asemenea, definim un număr care caracterizează numărul maxim de conexiuni simultane pe care le vom folosi în scriptul nostru ($max_connections). Apoi ne alăturăm bazei de date, selectăm postările care conțin link-uri și le acumulăm într-o matrice ($url_list).

Următorul cod este puțin complex, așa că înțelegeți-l de la început până la sfârșit:

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

Aici voi încerca să pun totul pe rafturi. Numerele din listă corespund numerelor din comentariu.

  1. 1. Creați un handler multiplu;
  2. 2. Vom scrie funcția add_url_to_multi_handle() puțin mai târziu. De fiecare dată când este apelat, o nouă adresă URL va fi procesată. Inițial, adăugăm 10 ($max_connections) URL-uri;
  3. 3. Pentru a începe, trebuie să rulăm funcția curl_multi_exec(). Atâta timp cât returnează CURLM_CALL_MULTI_PERFORM, mai avem ceva de făcut. Avem nevoie de asta în principal pentru a crea conexiuni;
  4. 4. Urmează bucla principală, care va fi executată atâta timp cât avem cel puțin o conexiune activă;
  5. 5. curl_multi_select() se blochează așteptând finalizarea căutării URL;
  6. 6. Încă o dată, trebuie să obținem cURL pentru a lucra, și anume pentru a prelua datele de răspuns returnate;
  7. 7. Informațiile sunt verificate aici. Ca urmare a cererii, va fi returnat o matrice;
  8. 8. Matricea returnată conține un handler cURL. Acesta este ceea ce vom folosi pentru a prelua informații despre o anumită solicitare cURL;
  9. 9. Dacă linkul era mort, sau scriptul a rămas fără timp, atunci nu ar trebui să căutăm niciun cod http;
  10. 10. Dacă linkul ne-a returnat o pagină 404, atunci codul http va conține valoarea 404;
  11. 11. În caz contrar, avem o legătură de lucru în fața noastră. (Puteți adăuga verificări suplimentare pentru codul de eroare 500, etc...);
  12. 12. În continuare, eliminăm handlerul cURL pentru că nu mai avem nevoie de el;
  13. 13. Acum putem adăuga un alt URL și rula tot ce am vorbit înainte;
  14. 14. La acest pas, scriptul își încheie activitatea. Putem elimina tot ce nu avem nevoie și putem genera un raport;
  15. 15. La final, vom scrie o funcție care va adăuga o adresă URL la handler. Variabila statică $index va fi incrementată de fiecare dată când această funcție este apelată.

Am folosit acest script pe blogul meu (cu câteva link-uri sparte adăugate intenționat pentru a-l testa) și am obținut următorul rezultat:

În cazul meu, scriptul a durat mai puțin de 2 secunde pentru a rula prin 40 de adrese URL. Câștigul de performanță este semnificativ atunci când aveți de-a face cu și mai multe adrese URL. Dacă deschideți zece conexiuni în același timp, scriptul poate rula de zece ori mai repede.

Câteva cuvinte despre alte opțiuni utile cURL

Autentificare HTTP

Dacă adresa URL are autentificare HTTP, atunci puteți utiliza cu ușurință următorul script:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // specificați numele de utilizator și parola curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // dacă redirecționarea este permisă curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // apoi salvăm datele noastre în cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $ieșire = curl_exec($ch); curl_close($ch);

Încărcare FTP

PHP are și o bibliotecă pentru lucrul cu FTP, dar nimic nu vă împiedică să utilizați instrumentele cURL aici:

// deschide fisierul $fisier = fopen("/cale/spre/fisier", "r"); // URL-ul ar trebui să conțină următorul conținut $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); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, file size("/path/to/file")); // specificați modul ASCII curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec ($ch); curl_close($ch);

Utilizarea unui proxy

Puteți solicita adresa URL printr-un proxy:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // specifica adresa curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // dacă trebuie să furnizați un nume de utilizator și o parolă curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $ieșire = curl_exec($ch); curl_close($ch);

Reapeluri

De asemenea, este posibil să specificați o funcție care va fi declanșată chiar înainte de finalizarea cererii cURL. De exemplu, în timp ce conținutul unui răspuns se încarcă, puteți începe să utilizați datele fără a aștepta să se încarce complet.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"funcție_progres"); curl_exec($ch); curl_close($ch); funcția progres_funcție($ch,$str) ( echo $str; return strlen($str); )

O astfel de funcție TREBUIE să returneze lungimea șirului, ceea ce este o cerință.

Concluzie

Astăzi ne-am familiarizat cu modul în care puteți folosi biblioteca cURL în propriile scopuri egoiste. Sper că v-a plăcut acest articol.

Mulțumesc! Să aveţi o zi bună!

De multe ori trebuie să descărcam diverse fișiere de pe Internet, de exemplu, fișiere executabile de program, fișiere script, arhive sursă. Dar nu trebuie să se facă întotdeauna printr-un browser. Î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 disponibilitatea site-urilor web, să verifice anteturile trimise și primite și multe altele.

Pentru a rezolva astfel de probleme și probleme ale unui cerc similar, puteți utiliza utilitarul curl. Vă permite să rezolvați o gamă mult mai largă de sarcini, inclusiv simularea acțiunilor utilizatorului pe site. În acest articol, vom analiza cum să utilizaț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ă 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 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ă. Pe acest utilitar 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ă analizăm utilitarul în sine și principalele sale opțiuni 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- specificați USER_AGENT;
  • -b- salvați cookie într-un fișier;
  • -c- trimite un Cookie către server dintr-un fișier;
  • -C- continua descărcarea fișierului de la punctul de întrerupere sau offset-ul specificat;
  • -m- timpul maxim de așteptare pentru un răspuns 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, de unde 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- trimite antete către server;
  • -Eu- primiți doar antetul HTTP și ignorați întregul conținut al paginii;
  • -j- citește și trimite un cookie dintr-un fișier;
  • -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- specificați protocolul care urmează să fie utilizat;
  • -R- salvați ora ultimei modificări a fișierului 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 curl linux, dar listează toate 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ă luăm în considerare exemple ale comenzii curl.

Cea mai comună sarcină este aceasta. Descărcarea fișierului este foarte ușoară. Pentru a face acest lucru, este suficient să treceți numele fișierului sau paginii 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 într-un 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ă încarce 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

Limita de viteza

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 întrerupe conexiunea dacă viteza nu este suficientă, pentru aceasta utilizați opțiunea -Y:

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

Transfer de fișier

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

Sau verificați trimiterea fișierului prin HTTP, există un serviciu special pentru asta:

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

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

Se trimit 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 vă place această opțiune de trimitere, puteți pretinde că trimiteți un formular. Există o opțiune -F pentru aceasta:

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

Aici trecem câmpul de parolă în formular, cu un tip de text simplu, puteți trece și mai mulți parametri în același mod.

Trimiterea și primirea cookie-urilor

Cookie-urile sau 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 cu 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

Trecerea și analizarea antetelor

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

curl -I https://site-ul web

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

autentificare curl

Dacă serverul necesită autentificarea unuia dintre tipurile comune, cum ar fi HTTP Basic sau FTP, atunci curl se poate ocupa cu ușurință de această sarcină. Pentru a specifica datele de autentificare, pur și simplu specificați-le cu două puncte în opțiunea -u:

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

În mod similar, autentificarea va fi efectuată pe serverele HTTP.

Utilizarea proxy-ului

Dacă trebuie să utilizați un server proxy pentru a descărca fișiere, este, de asemenea, foarte ușor. 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 caracteristici. În ciuda asemănării lor cu, ele sunt foarte diferite. Comanda curl linux este mai mult pentru analizarea ș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.

Un exemplu real practic: trebuie să reporniți routerul (modem-ul) pentru a schimba adresa IP. Pentru a face acest lucru, trebuie să: să vă conectați la router, să accesați pagina de întreținere și să faceți clic pe butonul „Repornire”. Dacă această acțiune trebuie efectuată de mai multe ori, atunci procedura trebuie repetată. De acord, nu doriți să faceți această rutină manual de fiecare dată. cURL vă permite să automatizați toate acestea. Cu doar câteva comenzi cURL, puteți obține autorizarea și finaliza sarcina pe router.

  • cURL este util pentru a obține date de pe site-uri web pe linia de comandă.
Un alt exemplu practic: dorim să implementăm afișarea statisticilor generale pentru mai multe site-uri. Dacă utilizați cURL, atunci aceasta devine o sarcină complet banală: folosind cURL, ne autentificăm pe serviciul de colectare a statisticilor (dacă este necesar), apoi (din nou, folosind comenzile cURL) obținem paginile necesare, analizăm datele de care avem nevoie; procedura se repetă pentru toate site-urile noastre, apoi însumăm și afișăm rezultatul final.

Acestea. Cazurile de utilizare cURL sunt destul de reale, deși, în majoritatea cazurilor, programatorii care îl folosesc pentru programele lor au nevoie de cURL.

CURL acceptă multe protocoale și metode de autorizare, poate transfera fișiere, funcționează corect cu module cookie, acceptă certificate SSL, proxy și multe altele.

cURL în PHP și linie de comandă

Putem folosi cURL în două moduri principale: în scripturi PHP și pe linia de comandă.

Pentru a activa cURL în PHP pe server, trebuie să decomentați linia din fișierul php.ini

Extensie=php_curl.dll

Și apoi reporniți serverul.

Pe Linux, trebuie să instalați pachetul curl.

Pe Debian, Ubuntu sau Linux Mint:

$ sudo apt-get install curl


Pe Fedora, CentOS sau RHEL:

$ sudo yum install curl

Pentru a vedea clar diferența de utilizare în PHP și pe linia de comandă, vom efectua aceleași sarcini de două ori: mai întâi într-un script PHP și apoi pe linia de comandă. Să încercăm să nu ne confuzăm.

Obținerea datelor cu cURL

Obținerea datelor cu cURL în PHP

Exemplu PHP:

Totul este foarte simplu:
$target_url- adresa site-ului care ne interesează. După adresa site-ului, puteți pune două puncte și adăugați adresa portului (dacă portul este diferit de cel standard).

curl_init- inițializează o nouă sesiune și returnează un handle, care în exemplul nostru este atribuit unei variabile $ch.

Apoi executăm cererea cURL cu funcția curl_exec, căruia i se trece un descriptor ca parametru.

Totul este foarte logic, dar atunci când acest script este executat, conținutul site-ului va fi afișat pe pagina noastră. Dar dacă nu vrem să afișăm conținutul, ci vrem să-l scriem într-o variabilă (pentru procesare ulterioară sau analizare).

Să adăugăm puțin la scriptul nostru:

0) ( echo "eroare curl: " . curl_error($ch); ) curl_close($ch); ?>

Avem o linie curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);.

curl_setopt- setează opțiuni. O listă completă de opțiuni poate fi găsită pe această pagină:

Ascuns de oaspeți

$response_data = curl_exec($ch);

Acum valoarea scriptului este atribuită variabilei $response_data, care poate fi folosită pentru operațiuni ulterioare. De exemplu, puteți afișa conținutul acestuia.

Cusături

Dacă (curl_errno($ch) > 0) ( echo "eroare curl: " . curl_error($ch); )

sunt folosite pentru depanare în caz de erori.

Obținerea datelor cu cURL pe linia de comandă

Pe linia de comandă, trebuie doar să tastați

unde în loc de mi-al.ru- adresa site-ului dvs.

Dacă trebuie să copiați datele într-o variabilă și să nu afișați rezultatul pe ecran, atunci procedați astfel:

Temp="curl mi-al.ru"

Cu toate acestea, unele date sunt încă afișate:

Pentru ca acestea să nu fie afișate, adăugați cheia -s:

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

Puteți vedea ce a fost înregistrat:

echo $temp | Mai puțin

Autentificare de bază și HTTP

Autentificarea, pur și simplu, este introducerea unui nume de utilizator și a unei parole.

Autentificarea de bază este autentificarea pe server. Pentru aceasta, sunt create două fișiere: .htaccessși .htpasswd

Conținutul fișierului .htaccess este cam așa

AuthName „Numai pentru utilizatorii înregistrați!” AuthType Basic necesită un utilizator valid AuthUserFile /home/freeforum.biz/htdocs/.htpassw


Conținutul fișierului .htpasswd este cam așa:

Mial:CRdiI.ZrZQRRc

Acestea. login și parola hash.

Când încercați să accesați un folder protejat cu parolă, browserul va afișa ceva de genul:

Autentificarea HTTP este cazul când introducem un nume de utilizator și o parolă într-un formular de pe un site web. Această autentificare este folosită atunci când introduceți e-mailuri, forumuri etc.

Autentificare de bază cURL (PHP)

Există un site

Ascuns de oaspeți

Să încercăm scriptul nostru inițial:

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

Deși scriptul consideră că nu există nicio eroare, nu ne place deloc rezultatul de ieșire:

Adăugăm două rânduri:

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

În prima linie setăm tipul de autentificare - de bază. A doua linie conține numele și parola separate prin două puncte (în cazul nostru, numele și parola sunt aceleași - ru-board). A ieșit așa:

0) ( echo "eroare curl: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?> Încercare: 30946 Grozav! Autentificare cURL de bază (pe linia de comandă) Același lucru se poate realiza pe linia de comandă cu o singură linie: curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/

Nu am uitat să precizez tipul de autentificare, doar că în cURL tipul de autentificare de bază este implicit.

Pe linia de comandă totul a ieșit atât de repede încât, din frustrare, am scris acest program. Se conectează la site și descarcă cea mai recentă actualizare:

Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o „Actualizare_FED_201(1).(2).(2).7z” | unic | coada -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp

Mai pot fi adăugate doar câteva comenzi:

  • despachetarea arhivei în directorul specificat;
  • lansarea actualizărilor ConsultantPlus (acestea sunt actualizări pentru el);
  • puteți implementa o verificare - dacă ultima actualizare disponibilă a fost deja descărcată sau a apărut una nouă;
  • adăugați totul la Cron pentru actualizări zilnice.
cURL Autentificare HTTP

cURL Autentificare HTTP în PHP

Trebuie sa stim:

  • adresa unde se trimit datele pentru autentificare
  • trimite metoda GET sau POST
  • Autentificare
  • parola
Uneori aceste date nu sunt suficiente. Să ne dăm seama.

Adresa la care doriți să trimiteți datele poate fi preluată din formularul de autentificare. De exemplu:

Ne uităm la proprietate acțiune. Acestea. pagina finală este login.php. Avem nevoie de adresa completă, așa

Ascuns de oaspeți

Aici găsim și metoda de trimitere: method="post"

Știu, de asemenea, login și parola: admin și qwerasdfzxcv
Acestea. un șir este transmis serverului din formular folosind metoda POST. Teoretic, scriptul nostru anterior, în care am adăugat o nouă linie, ar trebui să funcționeze. Acestea. autentificarea trebuie să aibă loc.

0) ( echo "eroare curl: " . curl_error($ch); ) else ( ) curl_close($ch); ?>

Linie nouă în scenariu

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

Aici curl_setopt- funcția deja familiară pentru setarea opțiunilor pentru cURL, CURLOPT_POSTFIELDS este numele opțiunii pe care o setăm. CURLOPT_POSTFIELDS conține toate datele care sunt trimise prin metoda POST. Ei bine, linia în sine LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv- acestea sunt aceleași date pe care le transmitem.

Dacă examinați cu atenție formularul, puteți vedea că acesta conține și câmpuri ascunse. Și datele pot fi prelucrate sau completate cu JavaScript "s. Puteți studia toate acestea, dar eu prefer modalitatea mai simplă.

Folosesc Wireshark. Acest program este conceput pentru a adulmeca (intercepta) traficul. Și în ea este foarte convenabil să vedeți ce anume este transmis pe site.

Urmăriți acest mic videoclip:


Acestea. cu adresa unde sunt transferate datele, am ghicit. Dar șirul transmis s-a dovedit a fi mult mai complicat.

Am introdus parametrul corect și, de asemenea, am modificat ușor scriptul, astfel încât nu numai să se autentifice, ci și să primească ceva de la router:

0) ( echo "Eroare curl: " . curl_error($ch); ) else ( $target_url2 = "http://188.35.8.64:8080/bsc_wlan.php"; $ch2 = curl_init($target_url2); curl_setopt($ ch2, CURLOPT_RETURNTRANSFER, 1); $response_data2 = curl_exec($ch2); preg_match("|f.ssid.value = "(.*)";|", $response_data2, $results2); $results2 = str_replace("f .ssid.value = "", "", $results2); $results2 = str_replace("";", "", $results2); echo „Numele rețelei WiFi: $rezultate2
"; preg_match("|f_wpa.wpapsk1.value(.*)";|", $response_data2, $results3); $rezultate3 = str_replace("f_wpa.wpapsk1.value", "", $rezultate3); $rezultate3 = str_inlocuire("="", "", $rezultate3); $rezultate3 = str_inlocuire("";", "", $rezultate3); echo „Parola rețelei Wi-Fi: $rezultate3"; ) curl_close($ch); ?>

Apropo, dacă proprietarul actualizează parola (dar nu actualizează firmware-ul), atunci noua parolă poate fi întotdeauna vizualizată la

Ascuns de oaspeți

(Aceasta este o vulnerabilitate binecunoscută în routerele D-Link DIR-300, D-Link DIR-320 și D-Link DAP-1353).

cURL Autentificare HTTP pe linia de comandă

Cunoaștem deja adresa completă, precum și șirul care urmează să fie transmis. Prin urmare, totul este simplu:

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

Cred că totul este clar, pentru că am luat deja în considerare acești termeni. Dacă cineva este neclar - întrebați în comentarii.

Un exemplu de utilizare a cURL pentru a obține și analiza date ar fi următorul set de comenzi:

Curl -s --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.35.8.64:8080/login.php &&n; " && echo „Numele rețelei Wi-Fi” && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f.ssid.value = "(.)*";" | sed "s/f.ssid.value = "//" | sed "s/";//" && echo "Parola rețelei Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f_wpa.wpapsk1.(.)*";" | sed "s/f_wpa.wpapsk1.value//" | sed "s/";//" | sed "s/="//"

Mai corect ar fi să scrieți datele de antet astfel: Cazuri de autorizare „complicate”. Acestea. pune cuvântul „complex” între ghilimele. Par complicate doar la prima vedere, când nu este clar: unde are loc trimiterea, care sunt numele câmpurilor, ce anume se trimite etc.

Dar, de fapt, toate se reduc la metodele POST sau GET. Pentru a înțelege ce anume se trimite, puteți salva pagina cu formularul pe disc și agăța funcția de afișare a datelor generate pentru trimitere pe butonul de trimitere. Sau chiar mai simplu - ca mine, Wireshark "ohm.

Dacă datele sunt corecte și autentificarea nu are loc, atunci trebuie să săpați în următoarele direcții:

  • setați șirul de referință corect
  • setați șirul de agent de utilizator „corect”.
Toate acestea se pot face cu metode de bază cURL, dar nu mă voi opri asupra lor. Lecția s-a dovedit a fi deja mare, dar am vrut să arăt și câteva trucuri cu cURL.

Sfaturi și trucuri cURL

cURL și obținerea cookie-urilor în afară de CURLOPT_COOKIEJAR

Cred că este deja clar că cURL gestionează corect cookie-urile - le salvează, le folosește atunci când serverul le solicită etc. Dar uneori cookie-urile trebuie salvate. Există o opțiune CURLOPT_COOKIEJAR pentru aceasta, dar nu este întotdeauna posibil să o utilizați. Despre asta este primul nostru truc.

Uneori, din cauza naturii setărilor PHP de pe server, opțiuni precum CURLOPT_COOKIEJAR (vă permite să salvați cookie-urile primite într-un fișier) și CURLOPT_COOKIEFILE (vă permite să utilizați cookie-uri dintr-un fișier) nu ne sunt disponibile. pentru că ei spun că folosind aceste opțiuni vom putea extrage orice fișier de pe serverul lor. Iată soluția la această problemă:

1) Nu utilizați CURLOPT_FOLLOWLOCATION
2) Folosiți curl_setopt($ch, CURLOPT_HEADER, 1)
3) Colectăm 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);

Al doilea sfat. Din atacatori ne putem transforma în victime. Pentru a nu deveni victima unui atac de tip om-in-the-middle, facem asta.

Vă rugăm să nu mai setați setarea CURLOPT_SSL_VERIFYPEER la fals sau 0. Dacă instalarea dvs. PHP nu are un set actualizat de certificate rădăcină CA, descărcați unul de pe site-ul web curl și salvați-l pe server:

Ascuns de oaspeți

Apoi setați calea în fișierul dvs. php.ini, de exemplu pe Windows:

curl.cainfo=c:phpcacert.pem

Dezactivarea CURLOPT_SSL_VERIFYPEER permite un atac de tip om-in-the-middle (MITM), pe care nu-l dorim!

Ei bine, un ultim sfat pentru azi. Știați că sunt posibile un număr mare de solicitări de curl asincrone?

Pentru aceasta puteți folosi curl_multi_init. Detalii și exemplu de cod în documentația oficială

Ascuns de oaspeți

Ascuns de oaspeți


Despre cURL pe linia de comandă

Ascuns de oaspeți


Pentru citirea în limba rusă a fost pregătită și a doua parte a lecției cURL: „”.