PHP CURL - funkcie a príklady použitia. Pokročilé použitie cURL v možnostiach príkazového riadku PHP Curl

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

curl_setopt — Nastavuje parameter pre reláciu CURL

Zoznam parametrov

cURL rukoväť získaná z curl_init().

Parameter, ktorý sa má nastaviť CURLOPT_XXX.

Hodnota parametra možnosti.

bool:

Parameter Poznámky
CURLOPT_AUTOREFERER PRAVDA pre automatické nastavenie v teréne Sprostredkovateľ: v požiadavkách presmerovaných hlavičkou miesto:.
CURLOPT_BINARYTRANSFER PRAVDA vrátiť surovú odozvu pri použití konštanty CURLOPT_RETURNTRANSFER. Od PHP 5.1.3 už táto možnosť nie je potrebná: pri použití možnosti sa vždy vráti nespracovaný výstup CURLOPT_RETURNTRANSFER.
CURLOPT_COOKIESESSION PRAVDA na pokyn aktuálnej relácie na spustenie novej „relácie“ súborov cookie. To spôsobí, že libcurl bude ignorovať všetky cookies "relácie", ktoré by mal načítať z predchádzajúcej relácie. V predvolenom nastavení libcurl vždy ukladá a načítava všetky súbory cookie bez ohľadu na to, či ide o „reláciu“ alebo nie. Súbory cookie „relácie“ sú súbory cookie, ktorých platnosť nevyprší a musia existovať iba pre aktuálnu „reláciu“.
CURLOPT_CERTINFO PRAVDA na výstup informácií o certifikáte SSL na streamovanie STDERR s bezpečnými spojeniami. Pridané v cURL 7.19.1. Dostupné od PHP 5.3.2. Pre správnu činnosť je potrebné, aby bola táto možnosť povolená CURLOPT_VERBOSE.
CURLOPT_CONNECT_ONLY PRAVDA povie knižnici, aby vykonala potrebnú autentifikáciu proxy a nastavenie pripojenia, ale neprenáša údaje. Táto možnosť je implementovaná pre HTTP, SMTP a POP3. Pridané 7.15.2. Dostupné od PHP 5.5.0.
CURLOPT_CRLF PRAVDA na konverziu zakončení riadkov Unix na CRLF.
CURLOPT_DNS_USE_GLOBAL_CACHE PRAVDA používať globálnu vyrovnávaciu pamäť DNS. Táto možnosť nie je bezpečná pre vlákna a je predvolene povolená.
CURLOPT_FAILONERROR PRAVDA pre podrobnú správu o zlyhaní, ak je prijatý kód HTTP väčší alebo rovný 400. Predvolené správanie vráti stránku ako normálne, pričom kód ignoruje.
CURLOPT_FILETIME PRAVDA pokúsiť sa získať dátum úpravy vzdialeného dokumentu. Túto hodnotu možno získať pomocou parametra CURLINFO_FILETIME z funkcie curl_getinfo().
CURLOPT_FOLLOWLOCATION PRAVDA sledovať ľubovoľný nadpis "Poloha: " odoslaný serverom vo svojej odpovedi (všimnite si, že sa to deje rekurzívne, PHP bude nasledovať všetky odoslané hlavičky "Poloha: ", okrem prípadu, keď je nastavená konštanta CURLOPT_MAXREDIRS).
CURLOPT_FORBID_REUSE PRAVDA vynútiť zatvorenie spojenia po dokončení jeho spracovania, aby ho nebolo možné znova použiť.
CURLOPT_FRESH_CONNECT PRAVDA vynútiť použitie nového pripojenia namiesto pripojenia vo vyrovnávacej pamäti.
CURLOPT_FTP_USE_EPRT PRAVDA používať EPRT (a LPRT) na aktívne nahrávanie cez FTP. Použite FALSE aby ste zakázali EPRT a LPRT a používali iba PORT.
CURLOPT_FTP_USE_EPSV PRAVDA na počiatočné testovanie príkazu EPSV počas prenosov FTP. Ak príkaz zlyhá, prejde späť na PASV. Inštalovať v FALSE zakázať EPSV.
CURLOPT_FTP_CREATE_MISSING_DIRS PRAVDA na vytvorenie chýbajúcich adresárov, ak operácia FTP narazí na neexistujúcu cestu.
CURLOPT_FTPAPPEND PRAVDA na zapísanie vzdialeného súboru na koniec, namiesto jeho prepísania cez existujúci súbor.
CURLOPT_TCP_NODELAY Natrvalo určuje, či sa má voľba TCP_NODELAY nastaviť alebo vymazať (1 = nastavené, 0 = vymazané). V predvolenom nastavení je táto možnosť vymazaná. Dostupné od PHP 5.2.1 pre verzie vytvorené s libcurl 7.11.2 alebo novšími.
CURLOPT_FTPASCII prezývka CURLOPT_TRANSFERTEXT. Namiesto toho použite toto.
CURLOPT_FTPLISTONLY PRAVDA vrátiť iba zoznam mien z adresára FTP.
CURLOPT_HEADER PRAVDA na zahrnutie hlavičiek do výstupu.
CURLINFO_HEADER_OUT PRAVDA na sledovanie reťazca dotazu na obsluhu. Dostupné od PHP 5.1.3. Predpona CURLINFO_ používa špecificky.
CURLOPT_HTTPGET PRAVDA na resetovanie metódy HTTP požiadavky na metódu GET. Keďže GET je predvolená hodnota, tento parameter je potrebný len vtedy, ak bola predtým zmenená metóda požiadavky.
CURLOPT_HTTPPROXYTUNNEL PRAVDA tunelovať cez zadaný HTTP proxy.
CURLOPT_MUTE PRAVDAúplne zakázať správy funkcie cURL. Odstránené v cURL 7.15.5 (možno použiť možnosť CURLOPT_RETURNTRANSFER)
CURLOPT_NETRC PRAVDA na prečítanie súboru ~/.netrc pre prihlasovacie meno a heslo pre vzdialenú lokalitu, s ktorou sa vytvára spojenie.
CURLOPT_NOBODY PRAVDA na vylúčenie tela odpovede z výstupu. Metóda požiadavky je nastavená na HEAD. Zmena tohto nastavenia na FALSE nezmení ho späť na GET.
CURLOPT_NOPROGRESS

PRAVDA vypnúť indikátor priebehu pri prenosoch cURL.

Komentujte:

PHP automaticky nastaví tento parameter na PRAVDA, zmeňte ho len na účely ladenia.

CURLOPT_NOSIGNAL PRAVDA ignorovať akúkoľvek funkciu cURL, ktorá posiela signály do procesu PHP. Táto možnosť je štandardne povolená vo viacvláknových SAPI, aby parametre časového limitu fungovali správne.
CURLOPT_POST PRAVDA použiť bežný HTTP POST. Táto metóda POST používa normálne , bežne používané vo formulároch HTML.
CURLOPT_PUT PRAVDA na stiahnutie súboru pomocou metódy HTTP PUT. Použitý súbor je potrebné nastaviť pomocou možností CURLOPT_INFILE A CURLOPT_INFILESIZE.
CURLOPT_RETURNTRANSFER PRAVDA vrátiť výsledok prenosu ako reťazec z curl_exec() namiesto priameho výstupu do prehliadača.
CURLOPT_SAFE_UPLOAD PRAVDA zakázať podporu prefixov @ pre stiahnuté súbory v CURLOPT_POSTFIELDS, čo znamená, že hodnoty odovzdané s @ môžu byť bezpečne prenášané ako polia. Namiesto predpony môžete použiť možnosť CURLFile d. Pridané v PHP 5.5.0 s predvolenou hodnotou FALSE. V PHP 5.6.0 sa to štandardne rovnalo PRAVDA.
CURLOPT_SSL_VERIFYPEER FALSE aby cURL prestal kontrolovať hostiteľský certifikát. Pomocou parametra je možné zadať alternatívne certifikáty, ktoré sa majú overiť CURLOPT_CAINFO alebo adresár s certifikátmi určenými parametrom CURLOPT_CAPATH. Predvolená hodnota je PRAVDA od cURL verzie 7.10. Predvolená distribúcia sa inštaluje od cURL verzie 7.10.
CURLOPT_TRANSFERTEXT PRAVDA na použitie režimu ASCII na prenosy FTP. Pri použití LDAP sa údaje namiesto HTML vrátia ako obyčajný text. V systémoch Windows vlákno STDOUT nie je nastavený na binárny režim.
CURLOPT_UNRESTRICTED_AUTH PRAVDA pokračovať v odosielaní prihlasovacieho mena a hesla počas presmerovaní (pri použití CURLOPT_FOLLOWLOCATION), aj keď sa zmení názov hostiteľa.
CURLOPT_UPLOAD PRAVDA na prípravu na nahranie súboru na server.
CURLOPT_VERBOSE PRAVDA na zobrazenie dodatočných informácií. Zapisuje výstup do streamu STDERR, alebo súbor určený parametrom CURLOPT_STDERR.

Pre nasledujúce hodnoty parametra voľby musí byť parameter value typu celé číslo:

Parameter Nastavte hodnotu hodnoty Poznámky
CURLOPT_BUFFERSIZE Veľkosť vyrovnávacej pamäte použitej na každé čítanie. Neexistuje však žiadna záruka, že táto žiadosť bude dokončená. Pridané v cURL 7.10.
CURLOPT_CLOSEPOLICY Jedna zo stálic CURLCLOSEPOLICY_*.

Komentujte:

Táto možnosť je zastaraná, pretože nebola nikdy implementovaná v cURL a nefungovala.

Odstránené v PHP 5.6.0.
CURLOPT_CONNECTTIMEOUT Počet sekúnd čakania pri pokuse o pripojenie. Ak chcete čakať neurčito, použite 0.
CURLOPT_CONNECTTIMEOUT_MS Počet milisekúnd, ktoré sa majú čakať pri pokuse o pripojenie. Ak chcete čakať neurčito, použite 0. Ak je libcurl skompilovaný pomocou systémového štandardného prekladača názvov, potom pripojenie bude stále používať celú sekundu čakania ako časový limit s minimálnym povoleným časovým limitom 1 sekunda. Pridané vo verzii cURL 7.16.2. Dostupné od PHP 5.2.3.
CURLOPT_DNS_CACHE_TIMEOUT Počet sekúnd, počas ktorých sú záznamy DNS uložené v pamäti. Štandardne je tento parameter 120 (2 minúty).
CURLOPT_FTPSSLAUTH Metóda overenia FTP (v aktívnom režime): CURLFTPAUTH_SSL(najprv sa kontroluje SSL), CURLFTPAUTH_TLS(najskôr skontrolované TLS) príp CURLFTPAUTH_DEFAULT(cURL sa rozhodne sám za seba). Pridané vo verzii cURL 7.12.2.
CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE (v predvolenom nastavení CURL vyberá, ktorá verzia sa má použiť), CURL_HTTP_VERSION_1_0 (vynútiť HTTP/1.0) alebo CURL_HTTP_VERSION_1_1 (vynútiť HTTP/1.1).
CURLOPT_HTTPAUTH

Môžete použiť bitový operátor | (alebo) kombinovať niekoľko metód. V tomto prípade cURL požiada server o podporované metódy autorizácie a vyberie tú najlepšiu.

CURLAUTH_ANY je alias CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLAUTH_ANYSAFE je alias CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLOPT_INFILESIZE Očakávaná veľkosť súboru v bajtoch pri nahrávaní súboru na vzdialený server. Upozorňujeme, že použitie tejto možnosti nezastaví odosielanie ďalších údajov nad túto hodnotu, pretože odosielané údaje závisia od výsledku CURLOPT_READFUNCTION.
CURLOPT_LOW_SPEED_LIMIT Horná hranica rýchlosti prenosu údajov v bajtoch za sekundu. Overenie prebieha v rámci CURLOPT_LOW_SPEED_TIME sekúnd, po ktorých PHP považuje prenos za príliš pomalý a preruší ho.
CURLOPT_LOW_SPEED_TIME Maximálny počet sekúnd, počas ktorých prenosová rýchlosť nesmie prekročiť CURLOPT_LOW_SPEED_LIMIT, inak PHP označí prenos ako príliš pomalý a zastaví ho.
CURLOPT_MAXCONNECTS Maximálny počet trvalých pripojení. Po dosiahnutí limitu sa parameter používa na určenie, ktoré pripojenie sa má uzavrieť. CURLOPT_CLOSEPOLICY.
CURLOPT_MAXREDIRS Maximálny počet prijatých presmerovaní. Použite túto možnosť spolu s možnosťou CURLOPT_FOLLOWLOCATION.
CURLOPT_PORT Alternatívny port pripojenia.
CURLOPT_POSTREDIR Bitová maska ​​obsahujúca 1 (301 Natrvalo presunuté), 2 (302 Nájdených) a 4 (303 Pozri Ostatné) na určenie, či sa má spracovať metóda HTTP POST, keď je táto možnosť povolená. CURLOPT_FOLLOWLOCATION ak došlo k zadanému typu presmerovania. Pridané v cURL 7.19.1. Dostupné od PHP 5.3.2.
CURLOPT_PROTOCOLS

Bitová maska ​​hodnôt CURLPROTO_*. Táto maska ​​obmedzuje protokoly používané libcurl. To vám umožňuje pracovať s libcurl s veľkým počtom protokolov a obmedziť činnosť určitých prenosov len na ich podmnožinu. V predvolenom nastavení používa libcurl všetky podporované protokoly. Pozri tiež parameter CURLOPT_REDIR_PROTOCOLS.

Správne hodnoty protokolu: CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_LDAPS, CURLPROTO_TOALLTFPURL, CURLPROTO_TOALLTFPURL, CURLPROTO_TOALLTODICT

CURLOPT_PROXYAUTH Metódy autorizácie HTTP používané pri pripájaní k proxy serveru. Použite rovnaké bitové masky, aké boli opísané pre parameter CURLOPT_HTTPAUTH. V súčasnosti sú pre autorizáciu proxy podporované iba CURLAUTH_BASIC a CURLAUTH_NTLM. Pridané vo verzii cURL 7.10.7.
CURLOPT_PROXYPORT Číslo portu proxy servera, ku ktorému sa pripája. Toto číslo je možné nastaviť aj pomocou parametra CURLOPT_PROXY.
CURLOPT_PROXYTYPE Buď CURLPROXY_HTTP (predvolené) alebo CURLPROXY_SOCKS5 . Pridané v cURL 7.10.
CURLOPT_REDIR_PROTOCOLS Bitová maska ​​hodnôt CURLPROTO_*. Táto bitová maska ​​obmedzuje protokoly používané libcurl pri presmerovaní (s povoleným parametrom CURLOPT_FOLLOWLOCATION). To vám umožňuje obmedziť množinu protokolov používaných pri presmerovaní pre niektoré prenosy. Štandardne libcurl podporuje všetky protokoly okrem FILE a SCP. Vo verziách pred 7.19.4 sa presmerovanie používalo pre všetky protokoly bez výnimky. Pozri tiež popis parametrov CURLOPT_PROTOCOLS pre zoznam konštánt s hodnotami protokolu. Pridané vo verzii cURL 7.19.4.
CURLOPT_RESUME_FROM Posun začiatku prenosu v bajtoch.
CURLOPT_SSL_VERIFYHOST Pomocou 1 skontrolujte existenciu spoločného názvu v certifikáte SSL. Pomocou 2 skontrolujte, či bežný názov existuje a či sa zhoduje so zadaným hostiteľom. V bojovom prostredí by hodnota tohto parametra mala byť 2 (štandardne nastavené). Podpora pre hodnotu 1 bola odstránená v cURL 7.28.1
CURLOPT_SSLVERSION Jedna zo stálic 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) alebo CURL_SSLVERSION_TLSv1_2 (6).
CURLOPT_TIMECONDITION Metóda interpretácie parametrov CURLOPT_TIMEVALUE. Použite CURL_TIMECOND_IFMODSINCE na vrátenie stránky, iba ak sa zmenila od času uvedeného v parametri CURLOPT_TIMEVALUE. Ak stránka nebola upravená, názov sa vráti "304 neupravené", čo znamená, že parameter CURLOPT_HEADER nainštalovaný v PRAVDA. Pre opačný efekt použite CURL_TIMECOND_IFUNMODSINCE. Predvolená hodnota je CURL_TIMECOND_IFMODSINCE.
CURLOPT_TIMEOUT Maximálny počet sekúnd povolený na vykonanie funkcií cURL.
CURLOPT_TIMEOUT_MS Maximálny počet milisekúnd povolený na vykonanie funkcií cURL. Ak je libcurl zostavený pomocou normálneho prekladača názvov systému, potom tento rozsah pripojenia bude stále používať časové limity na zaokrúhľovanie s minimálnym povoleným časovým limitom jedna sekunda. Pridané vo verzii cURL 7.16.2. Dostupné od PHP 5.2.3.
CURLOPT_TIMEVALUE Počet sekúnd od 1. januára 1970. Tento čas bude použitý parametrom CURLOPT_TIMECONDITION. Štandardne sa používa parameter CURL_TIMECOND_IFMODSINCE.
CURLOPT_MAX_RECV_SPEED_LARGE Ak rýchlosť sťahovania prekročí túto hodnotu (uvedenú v bajtoch za sekundu) v priemere počas celého prenosu, sťahovanie sa pozastaví, aby sa udržala priemerná rýchlosť nižšia alebo rovná tomuto parametru. Štandardne nie je rýchlosť obmedzená.
CURLOPT_MAX_SEND_SPEED_LARGE Ak nahrávanie na server prekročí túto hodnotu (určenú v bajtoch za sekundu) v priemere počas celého prenosu, nahrávanie sa pozastaví, aby sa udržala priemerná rýchlosť nižšia alebo rovná tomuto parametru. Štandardne nie je rýchlosť obmedzená. Pridané v cURL 7.15.5. Dostupné od PHP 5.4.0.
CURLOPT_SSH_AUTH_TYPES Bitová maska ​​pozostávajúca z jednej alebo viacerých konštánt: CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD. Inštalácia CURLSSH_AUTH_ANY aby si libcurl vybral jeden z nich nezávisle. Pridané v cURL 7.16.1.
CURLOPT_IPRESOLVE Umožňuje aplikácii vybrať typ adresy IP, pomocou ktorej sa určí názov hostiteľa. Je to potrebné, ak používate názov hostiteľa, ktorý je odvodený z viac ako jednej verzie adresy IP. Možné hodnoty môžu byť CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6 a predvolene CURL_IPRESOLVE_WHATEVER. Pridané v cURL 7.10.8.

Pre nasledujúce hodnoty parametra voľby musí byť parameter value typu reťazec:

Parameter Nastavte hodnotu hodnoty Poznámky
CURLOPT_CAINFO Názov súboru obsahujúceho jeden alebo viacero certifikátov, voči ktorým sa budú kontrolovať uzly. Tento parameter má zmysel len vtedy, keď sa používa v spojení s CURLOPT_SSL_VERIFYPEER. Vyžaduje absolútnu cestu.
CURLOPT_CAPATH Adresár obsahujúci niekoľko certifikátov CA. Použite túto možnosť v spojení s CURLOPT_SSL_VERIFYPEER.
CURLOPT_COOKIE Obsah hlavičky "Cookie:", ktorý sa používa v požiadavke HTTP. Upozorňujeme, že viaceré súbory cookie sú oddelené bodkočiarkou, za ktorou nasleduje medzera (napríklad „ ovocie=jablko; farba=červená")
CURLOPT_COOKIEFILE Názov súboru obsahujúceho cookies. Tento súbor musí byť vo formáte Netscape alebo jednoducho hlavičky HTTP zapísané do súboru. Ak ako názov súboru zadáte prázdny reťazec, cookies sa neuložia, ale ich spracovanie bude stále povolené.
CURLOPT_COOKIEJAR Názov súboru, do ktorého sa uložia všetky interné cookies aktuálneho prenosu po zatvorení handle, napríklad po volaní curl_close.
CURLOPT_CUSTOMREQUEST

Namiesto toho sa použila vlastná metóda žiadosti "ZÍSKAŤ" alebo "HLAVA" pri vytváraní požiadavky HTTP. To je užitočné pre otázky "DELETE" alebo iné, zriedkavejšie HTTP požiadavky. Správny význam by mali slová ako "ZÍSKAŤ", "POST", "PRIPOJIŤ" a tak ďalej; tie. Nezadávajte sem celý riadok požiadavky HTTP. Napríklad indikácia "ZÍSKAŤ /index.html HTTP/1.0\r\n\r\n" bude zle.

Komentujte:

Túto funkciu nepoužívajte, kým si nie ste istí, že server podporuje tento typ požiadavky.

CURLOPT_EGDSOCKET Páči sa mi to CURLOPT_RANDOM_FILE, okrem toho, že názov súboru je nastavený na soket Entropy Gathering Daemon.
CURLOPT_ENCODING Obsah hlavičky "Accept-Encoding: ". To umožňuje dekódovanie požiadavky. Podporované kódovania sú "identita", "vyfúknuť" A "gzip". Ak prejde prázdny reťazec, "" sa odošle hlavička obsahujúca všetky podporované typy kódovania. Pridané v cURL 7.10.
CURLOPT_FTPPORT Hodnota, ktorá sa použije na určenie adresy IP pre príkaz FTP "PORT". Príkaz "PORT" informuje server, na ktorú IP adresu sa má pripojiť. Môže to byť IP adresa, názov hostiteľa, názov sieťového rozhrania (pod Unixom) alebo jednoducho „-“ na použitie predvolenej systémovej IP adresy.
CURLOPT_INTERFACE Názov sieťového rozhrania, ktoré sa má použiť. Môže to byť názov rozhrania, adresa IP alebo názov hostiteľa.
CURLOPT_KEYPASSWD Na používanie súkromného kľúča je potrebné heslo CURLOPT_SSLKEY alebo CURLOPT_SSH_PRIVATE_KEYFILE. Pridané v cURL 7.16.1.
CURLOPT_KRB4LEVEL Úroveň zabezpečenia KRB4 (Kerberos 4). Každá z nasledujúcich hodnôt (v poradí od najslabšej po najsilnejšiu) je správna: "jasný", "bezpečný", "dôverné", "súkromné".. Ak sa zadaný reťazec líši od zadaných hodnôt, použije sa hodnota "súkromné". Nastavenie tejto možnosti na NULOVÝúplne vypne zabezpečenie KRB4. Zabezpečenie KRB4 momentálne funguje iba s transakciami FTP.
CURLOPT_POSTFIELDS Všetky údaje prenášané v požiadavke HTTP POST. Ak chcete preniesť súbor, zadajte pred názvom súboru @ a tiež použite úplnú cestu k súboru. Typ súboru je možné určiť aj pomocou formátu " ;type=mimetype" za názvom súboru. Tento parameter možno odovzdať ako reťazec zakódovaný v adrese URL, napríklad " para1=val1¶2=val2&...", a vo forme poľa, ktorého kľúčmi budú názvy polí a hodnoty budú ich obsahom. Ak je hodnota pole, hlavička Druh obsahu bude nastavená na multipart/form-data. Počnúc PHP 5.2.0 pri prenose súborov s predponou @ , hodnota musí byť pole. Od PHP 5.5.0 predpona @ je zastarané a súbory je možné odosielať pomocou CURLFile. Predpona @ možno zakázať, aby sa povolili hodnoty začínajúce na @ nastavením možnosti CURLOPT_SAFE_UPLOAD vo význame PRAVDA.
CURLOPT_PROXY HTTP proxy, cez ktorý budú smerované požiadavky.
CURLOPT_PROXYUSERPWD Prihlasovacie meno a heslo napísané vo formulári ":" , ktorý sa používa pri pripájaní cez proxy.
CURLOPT_RANDOM_FILE Názov súboru použitý na inicializáciu generátora náhodných čísel pre SSL.
CURLOPT_RANGE Rozsah údajov na stiahnutie vo formáte "X-Y" a buď X alebo Y môžu byť vynechané. Protokol HTTP podporuje aj prenos viacerých rozsahov oddelených čiarkami, sú uvedené vo formáte "X-Y,N-M".
CURLOPT_REFERER Obsah hlavičky "Sprostredkovateľ:", ktorý bude použitý v HTTP požiadavke.
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 Reťazec obsahujúci 32 hexadecimálnych číslic. Reťazec musí byť MD5 kontrolný súčet verejného kľúča vzdialeného počítača a libcurl resetuje pripojenie k vzdialenému hostiteľovi, kým sa kontrolný súčet nezhoduje s verejným kľúčom. Táto možnosť je určená len na prenos údajov pomocou SCP a SFTP. Pridané v cURL 7.17.1.
CURLOPT_SSH_PUBLIC_KEYFILE Názov súboru pre váš verejný kľúč. Ak nie je zadaný, libcurl predvolene použije súbor $HOME/.ssh/id_dsa.pub, ak je nastavená premenná prostredia HOME, a súbor "id_dsa.pub" v aktuálnom adresári, ak nie je nastavená premenná prostredia HOME. Pridané v cURL 7.16.1.
CURLOPT_SSH_PRIVATE_KEYFILE Názov súboru pre váš súkromný kľúč. Ak nie je zadaný, libcurl predvolene použije súbor $HOME/.ssh/id_dsa, ak je nastavená premenná prostredia HOME, a súbor "id_dsa" v aktuálnom adresári, ak premenná prostredia HOME nie je nastavená. Ak je súbor chránený heslom, nastavte heslo pomocou CURLOPT_KEYPASSWD. Pridané v cURL 7.16.1.
CURLOPT_SSL_CIPHER_LIST Zoznam šifier používaných pri prenosoch SSL. Napríklad, RC4-SHA A TLSv1 sú platné zoznamy šifier.
CURLOPT_SSLCERT Názov súboru so správne naformátovaným certifikátom PEM.
CURLOPT_SSLCERTPASSWD Na používanie certifikátu sa vyžaduje heslo CURLOPT_SSLCERT.
CURLOPT_SSLCERTTYPE Formát certifikátu. Podporované formáty "PEM"(predvolené), "DER" A "ANG". Pridané vo verzii cURL 7.9.3.
CURLOPT_SSLENGINE ID šifrovacieho nástroja pre súkromný kľúč SSL špecifikovaný v parametri CURLOPT_SSLKEY.
CURLOPT_SSLENGINE_DEFAULT Identifikátor šifrovacieho mechanizmu používaného pre operácie asymetrického šifrovania.
CURLOPT_SSLKEY Názov súboru súkromného kľúča SSL.
CURLOPT_SSLKEYPASSWD

Tajné heslo požadované na použitie súkromného kľúča SSL špecifikovaného parametrom CURLOPT_SSLKEY.

Komentujte:

Keďže tento parameter obsahuje cenné heslo, nezabudnite si tento PHP skript uložiť na bezpečnom mieste.

CURLOPT_SSLKEYTYPE Typ súkromného kľúča SSL špecifikovaný v parametri CURLOPT_SSLKEY. Podporované sú nasledujúce typy kľúčov: "PEM"(predvolené), "DER" A "ANG".
CURLOPT_URL URL na stiahnutie. Tento parameter je možné nastaviť aj pri inicializácii relácie pomocou curl_init().
CURLOPT_USERAGENT Obsah hlavičky "User-Agent: ", odoslaný v požiadavke HTTP.
CURLOPT_USERPWD Prihlasovacie meno a heslo používané počas pripojenia, uvedené vo formáte ":" .

Pre nasledujúce hodnoty parametra voľby musí byť parameter value pole:

Parameter Nastavte hodnotu hodnoty Poznámky
CURLOPT_HTTP200ALIASES Súbor odpovedí HTTP 200, s ktorými sa bude zaobchádzať ako so správnymi odpoveďami a nie s chybnými. Pridané vo verzii cURL 7.10.3.
CURLOPT_HTTPHEADER Pole nastavených HTTP hlavičiek vo formáte pole ("Content-type: text/plain", "Content-length: 100")
CURLOPT_POSTQUOTE Pole príkazov FTP spustených na serveri po dokončení požiadavky FTP.
CURLOPT_QUOTE Pole FTP príkazov spustených na serveri pred vykonaním FTP požiadavky.

Pre nasledujúce hodnoty parametra voľby musí byť parametrom value handle toku (vrátený napríklad funkciou fopen()):

Parameter Nastavte hodnotu hodnoty
CURLOPT_FILE Súbor, do ktorého sa zapíše výsledok prenosu. Predvolený výstupný tok STDOUT(okno prehliadača).
CURLOPT_INFILE Súbor, z ktorého sa majú načítať údaje pri nahrávaní na server.
CURLOPT_STDERR Alternatívny chybový výstupný súbor použitý namiesto chybového prúdu STDERR.
CURLOPT_WRITEHEADER Súbor, do ktorého budú zapísané hlavičky aktuálnej operácie.

Pre nasledujúce hodnoty parametra voľby musí byť parameter value platný názov funkcie alebo uzáver:

Parameter Nastavte hodnotu hodnoty
CURLOPT_HEADERFUNCTION Funkcia spätného volania má dva parametre. Prvý parameter je handle cURL, druhý parameter je reťazec obsahujúci hlavičky, ktoré sa majú zapísať. Hlavičky musia byť napísané pomocou tejto funkcie spätného volania. Mal by vrátiť počet zapísaných bajtov.
CURLOPT_PASSWDFUNCTION Funkcia spätného volania má tri parametre. Prvý parameter je rukoväť cURL, druhý parameter je reťazec výzvy na zadanie hesla a tretí parameter je maximálna dĺžka hesla. Mal by vrátiť reťazec obsahujúci heslo.
CURLOPT_PROGRESSFUNCTION

Funkcia spätného volania má päť parametrov. Prvým je deskriptor cURL, druhým je celkový počet očakávaných bajtov stiahnutých zo servera, tretím je počet už stiahnutých bajtov, štvrtým je celkový počet očakávaných bajtov odoslaných na server a piaty je počet už odoslaných bajtov.

Komentujte:

Funkcia spätného volania sa volá iba v prípade možnosti CURLOPT_NOPROGRESS nastaviť na hodnotu FALSE.

Ak chcete prevod zrušiť, môžete vrátiť nenulovú hodnotu. V tomto prípade sa zobrazí chyba CURLE_ABORTED_BY_CALLBACK.

CURLOPT_READFUNCTION Funkcia spätného volania má tri parametre. Prvý parameter je handle cURL, druhý parameter je zdroj streamu odovzdaný do cURL cez voľbu CURLOPT_INFILE a tretí parameter je maximálne povolené množstvo dát, ktoré sa majú prečítať. Funkcia spätného volania musí vrátiť reťazec s dĺžkou nepresahujúcou požadované množstvo údajov, zvyčajne čítaním z odovzdaného zdroja streamovania. Mal by vrátiť prázdny reťazec, ktorý signalizuje koniec súboru EOF.
CURLOPT_WRITEFUNCTION Funkcia spätného volania má dva parametre. Prvý parameter je handle cURL a druhý parameter je reťazec obsahujúci údaje, ktoré sa majú zapísať. Údaje je potrebné uložiť pomocou tejto funkcie. Musí vrátiť presný počet zapísaných bajtov, inak sa sťahovanie preruší s chybou.

Iné významy:

Návratové hodnoty

Návraty PRAVDA po úspešnom absolvovaní resp FALSE v prípade chyby.

Zoznam zmien

Verzia Popis
5.6.0 Možnosť CURL_SAFE_UPLOAD teraz má predvolenú hodnotu PRAVDA.
5.6.0 Odstránená možnosť CURLOPT_CLOSEPOLICY a s ním spojené významy.
5.5.0 Zdroj cURL sa pridá ako prvý argument do funkcie spätného volania CURLOPT_PROGRESSFUNCTION.
5.5.0 Pridaná možnosť CURLOPT_SHARE.
5.3.0 Pridaná možnosť CURLOPT_PROGRESSFUNCTION.
5.2.10 Pridané možnosti CURLOPT_PROTOCOLS A CURLOPT_REDIR_PROTOCOLS.
5.1.0 Pridané možnosti CURLOPT_AUTOREFERER, CURLOPT_BINARYTRANSFER, CURLOPT_FTPSSLAUTH, CURLOPT_PROXYAUTH A CURLOPT_TIMECONDITION.
5.0.0 Pridané možnosti CURLOPT_FTP_USE_EPRT, CURLOPT_NOSIGNAL, CURLOPT_UNRESTRICTED_AUTH, CURLOPT_BUFFERSIZE, CURLOPT_HTTPAUTH, CURLOPT_PROXYPORT, CURLOPT_PROXYTYPE, CURLOPT_SSLCERTTYPE A CURLOPT_HTTP200ALIASES.

Príklady

Príklad č. 1 Inicializácia relácie CURL a načítanie webovej stránky

// vytvorte nový zdroj cURL
$ch = curl_init();

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

$ch = curl_init();

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

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

Curl_exec($ch);
?>

Výsledok spustenia tohto príkladu:

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

Poznámky

Komentujte:

Odovzdanie poľa do CURLOPT_POSTFIELDS zakóduje údaje ako multipart/form-data, zatiaľ čo odovzdaním reťazca zakódovaného do adresy URL sa údaje zakódujú ako application/x-www-form-urlencoded.

cURL je nástroj, ktorý vám umožňuje interakciu s rôznymi servermi a podporuje mnoho protokolov: HTTP, FTP, TELNET atď. cURL je pôvodne nástroj príkazového riadka. Ale našťastie pre nás PHP podporuje prácu s knižnicou cURL. V tomto článku sa pozrieme na netriviálne príklady práce s cURL.

Prečo cURL?

V skutočnosti existuje mnoho iných spôsobov, ako odoslať požiadavku na iný server, napríklad na získanie obsahu stránky. Mnoho ľudí, väčšinou z lenivosti, používa namiesto cURL jednoduché funkcie PHP:

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

Neumožňujú však efektívne odstraňovanie chýb. Existuje aj množstvo úloh, ktoré vôbec nedokážu – napríklad práca s cookies, autorizácia, odosielanie požiadaviek, sťahovanie súborov.

cUrl je výkonný nástroj, ktorý podporuje viacero protokolov a poskytuje kompletné informácie o požiadavkách.

Základy cUrl

Skôr než prejdeme ku komplexným príkladom, pozrime sa na základnú štruktúru požiadavky cURL v PHP. Ak chcete vykonať požiadavku cURL v PHP, musíte urobiť 4 hlavné kroky:

  1. Inicializácia.
  2. Možnosti nastavenia.
  3. Vykonanie žiadosti.
  4. Čistiace prostriedky.
// 1. inicializácia $ch = curl_init(); // 2. nastavenie možností vrátane URL curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. vykonanie požiadavky a prijatie odpovede $output = curl_exec($ch); // 4. čistenie zdrojov curl_close($ch);

V tomto článku sa budeme väčšinou zaoberať krokom č. 2, pretože tam sa odohráva kúzlo. Zoznam možností cURL je veľmi rozsiahly, takže dnes nebudeme zvažovať všetky možnosti, ale použijeme tie, ktoré sú užitočné pri riešení konkrétnych problémov.

Sledovanie chýb

V prípade potreby môžete na sledovanie chýb pridať nasledujúce riadky:

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

Upozorňujeme, že namiesto „==“ používame „===“, pretože Je potrebné rozlišovať medzi prázdnou odpoveďou servera a boolovskou hodnotou FALSE, ktorá je vrátená v prípade chyby.

Získanie informácií o žiadosti

Ďalším voliteľným krokom je získanie informácií o požiadavke cURL po jej vykonaní.

// ... curl_exec($ch); $info = curl_getinfo($ch); echo "Vzala". $info["total_time"] . "sekundy pre url". $info["url"]; //...

V dôsledku toho dostanete pole s nasledujúcimi informáciami:

  • "url"
  • "Druh obsahu"
  • "http_code"
  • "veľkosť_hlavičky"
  • "veľkosť_žiadosti"
  • "filetime"
  • "ssl_verify_result"
  • "redirect_count"
  • "celkový čas"
  • "namelookup_time"
  • "connect_time"
  • "pretransfer_time"
  • "size_upload"
  • "size_download"
  • "speed_download"
  • "speed_upload"
  • "dĺžka_obsahu na stiahnutie"
  • "dĺžka_nahrávaného_obsahu"
  • "starttransfer_time"
  • "čas_presmerovania"

Sledovanie presmerovania v závislosti od prehliadača

V tomto príklade napíšeme skript, ktorý bude detekovať presmerovania na základe rôznych nastavení prehliadača. Niektoré stránky napríklad presmerujú návštevníkov z mobilných zariadení na návštevníkov z iných krajín.

Použijeme možnosť CURLOPT_HTTPHEADER na nastavenie vlastných hlavičiek vrátane User-Agent a Language a uvidíme, kam nás stránky presmerujú.

// URL $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // prehliadače $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" => pole ("user_agent" => "Mozilla/5.0 (iPhone; U; CPU ako Mac OS X; en) AppleWebKit/420+ (KHTML, ako Gecko) Verzia/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "francúzština" => pole ("user_agent" = > "Mozilla/4.0 (kompatibilné; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "jazyk" => "fr,fr-FR;q=0.5")); foreach ($urls ako $url) ( echo "URL: $url\n"; foreach ($browsers ako $test_name => $browser) ( $ch = curl_init(); // nastavenie adresy curl_setopt($ch, CURLOPT_URL , $url); // uveďte prehliadač a použitý jazyk curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["jazyk" ]) ")); // nepotrebujeme obsah stránky curl_setopt($ch, CURLOPT_NOBODY, 1); // potrebujeme iba hlavičky curl_setopt($ch, CURLOPT_HEADER, 1); // namiesto toho vráti výsledok jeho výstupu curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); $output = curl_exec($ch); curl_close($ch); // definovať presmerovania v hlavičkách HTTP? if (preg_match("!Umiestnenie: (.*)!" , $output, $matches)) ( echo "$test_name: presmeruje na $matches\n"; ) else ( echo "$test_name: žiadne presmerovanie\n"; ) ) echo "\n\n"; )

V slučke kontrolujeme prehliadače pre každú adresu URL. Najprv nastavíme možnosti pre našu požiadavku: URL a prehliadač a jazyk, ktorý sa má testovať.

Pretože Nastavili sme špeciálnu možnosť, výsledok požiadavky bude obsahovať iba HTTP hlavičky. Pomocou jednoduchého regulárneho výrazu môžeme skontrolovať, či odpoveď obsahuje reťazec „Location:“.

Výsledok spustenia skriptu:

URL: http://www.cnn.com štandard: presmeruje na http://edition.cnn.com/ iphone: presmeruje na http://edition.cnn.com/ Francúzština: presmeruje na http://edition.cnn .com/ URL: http://www.mozilla.com štandard: presmeruje na https://www.mozilla.org/firefox/ iphone: presmeruje na https://www.mozilla.org/firefox/ french: presmeruje na https://www.mozilla.org/firefox/ URL: http://www.facebook.com štandard: presmeruje na https://www.facebook.com/ iphone: presmeruje na http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr Francúzština: žiadne presmerovanie

Odosielanie žiadostí POST

Pri vykonávaní požiadaviek GET môžu byť údaje odovzdané v reťazci dotazu. Napríklad, keď vyhľadávate na Google, váš dopyt sa preloží do adresy URL:

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

Ak chcete získať výsledok tohto dotazu, nepotrebujete ani cURL, môžete byť leniví a použiť "file_get_contents()".

Niektoré formuláre HTML však používajú metódu POST. V tomto prípade sa údaje odosielajú v tele správy s požiadavkou a nie v samotnej adrese URL.

Napíšme skript, ktorý bude odosielať požiadavky POST. Najprv si vytvorme jednoduchý PHP súbor, ktorý bude akceptovať tieto požiadavky a vráti mu zaslané dáta. Nazvime to post_output.php :

$url = "http://localhost/post_output.php"; $post_data = pole ("foo" => "bar", "query" => "FooBar", "action" => "Odoslať"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // urobte požiadavku POST curl_setopt($ch, CURLOPT_POST, 1); // pridanie údajov curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $výstup;

Tento skript vypíše:

Pole ( => bar => FooBar => Odoslať)

Tento skript odoslal požiadavku POST do súboru post_output.php. ktorý vypísal obsah poľa $_POST a túto odpoveď sme dostali pomocou cURL.

Nahrávanie súborov

Rovnako ako v predchádzajúcom príklade, vytvorte súbor, ktorý bude prijímať požiadavky, upload_output.php :

Print_r($_FILES);

A samotný skript, ktorý sťahuje súbory:

$url = "http://localhost/upload_output.php"; $post_data = pole ("foo" => "bar", // súbor na nahranie "nahrať" => "@/tmp/desert.jpg"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $výstup;

Ak chcete nahrať súbor, všetko, čo musíte urobiť, je zadať cestu k nemu, rovnako ako normálny parameter požiadavky POST, s predponou „@“. Výsledok skriptu:

Pole ( => Pole ( => púšť.jpg => application/octet-stream => /tmp/phpAhEvXy => 0 => 845941))

Viacnásobné cURL

Jednou z pokročilých funkcií cURL v PHP je schopnosť vykonávať viacero požiadaviek súčasne a asynchrónne.

Za normálnych podmienok sa skript zastaví a čaká na dokončenie požiadavky. A ak potrebujete vykonať veľa dotazov, môže to trvať veľa času, pretože... budete vykonávať postupne. Toto obmedzenie je možné obísť:

// vytvorenie handlerov $ch1 = curl_init(); $ch2 = curl_init(); // nastavenie možností 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); //vytvor viacnásobný cURL handle $mh = curl_multi_init(); // pridanie handlerov curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $beh = null; // vykoná požiadavky do ( curl_multi_exec($mh, $running); ) while ($running > 0); // uvoľnenie zdrojov curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Myšlienkou je, že môžete vytvoriť viacero rukovätí cURL, skombinovať ich do jedného viacúčelového rukoväte a spustiť ich asynchrónne.

Po prvé, všetko je rovnaké ako pri bežnej požiadavke cURL - vytvorí sa deskriptor ( curl_init() ), parametre sú nastavené ( curl_setopt() ). Ďalej sa vytvorí multideskriptor ( curl_multi_init() ) a pridajú sa predtým vytvorené bežné deskriptory ( curl_multi_add_handle() ). Namiesto normálneho volania curl_exec() zavoláme curl_multi_exec() táto funkcia nás informuje o počte aktívnych spojení pomocou druhého parametra - $running. Cyklus teda beží, kým sa $running nestane rovným 0. A samozrejme po dokončení práce je potrebné uvoľniť zdroje.

V tomto príklade jednoducho vypíšeme výsledok dotazov do STDOUT. Pozrime sa na netriviálny prípad použitia viacerých cURL.

Kontrola externých odkazov vo WordPress

Predstavte si blog s množstvom príspevkov obsahujúcich odkazy na externé stránky. Niektoré z týchto odkazov nemusia fungovať.

Napíšme skript, ktorý nájde všetky nefunkčné odkazy a ukáže nám ich.

Najprv musíme stiahnuť všetky externé odkazy z databázy:

// CONFIG $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "site"); $max_connections = 10; $zoznam_url = pole(); $working_urls = array(); $dead_urls = pole(); $not_found_urls = array(); $aktívny = null; // pripojenie k MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Nedá sa pripojiť: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Mohol by sa pripojiť nevybrať db: " . mysql_error()); ) // prevziať všetky príspevky s odkazmi v texte $q = "VYBERTE post_content FROM wp_posts KDE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post " "; $r = mysql_query($q) or die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // zhromaždenie všetkých odkazov pomocou regulárneho výrazu if (preg_match_all("/href=\"(.*?)\"/", $d["post_content"], $matches )) ( foreach ($zodpovedá ako $url) ( // odfiltrujte nepotrebné domény $tmp = parse_url($url); if (isset($tmp["host"]) && in_array($tmp["host"], $ vylúčené_domény)) ( pokračovať; ) // dať dokopy $url_list = $url; ) ) ) // odstrániť opakovania $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Žiadna adresa URL na kontrolu"); )

V tejto časti skriptu jednoducho vytiahneme všetky externé odkazy z databázy. Poďme ich skontrolovať:

$mh = curl_multi_init(); // 1. pridajte odkazy pre ($i = 0; $i< $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // основной цикл do { curl_multi_exec($mh, $curRunning); // 2. один из потоков завершил работу if ($curRunning != $running) { $mhinfo = curl_multi_info_read($mh); if (is_array($mhinfo) && ($ch = $mhinfo["handle"])) { // 3. один из запросов выполнен, можно получить информацию о нем $info = curl_getinfo($ch); // 4. нерабочая ссылка if (!$info["http_code"]) { $dead_urls = $info["url"]; // 5. 404? } else if ($info["http_code"] == 404) { $not_found_urls = $info["url"]; // 6. верная ссылка } else { $working_urls = $info["url"]; } // 7. удаляем отработавший дескриптор curl_multi_remove_handle($mh, $mhinfo["handle"]); curl_close($mhinfo["handle"]); // 8. добавим новый урл add_url_to_multi_handle($mh, $url_list); $running = $curRunning; } } } while ($curRunning >0); curl_multi_close($mh); echo "==Mŕtve adresy URL==\n"; echo implode("\n", $dead_urls) . "\n\n"; echo "==404 adries URL==\n"; echo implode("\n", $not_found_urls) . "\n\n"; echo "==Pracovné adresy URL==\n"; echo implode("\n", $working_urls); echo "\n\n"; // 9. pridá handle s danou URL funkciou add_url_to_multi_handle($mh, $url_list) ( static $index = 0; // ak ešte existujú odkazy if (isset($url_list[$index])) ( // všetko je ako obvykle $ ch = curl_init(); // nastavenie možností curl_setopt($ch, CURLOPT_URL, $url_list[$index]); // návrat namiesto zobrazenia výsledku curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // povoliť presmeruje curl_setopt($ ch, CURLOPT_FOLLOWLOCATION, 1); // získajte iba hlavičky, aby ste ušetrili čas curl_setopt($ch, CURLOPT_NOBODY, 1); // pridajte k viacúčelovému rukoväti curl_multi_add_handle($mh, $ch); $index++; ) )

Pozrime sa na kód podrobnejšie (číslovanie zodpovedá komentárom v kóde):

  1. Pridávame počiatočný počet deskriptorov, aby sme nepreťažili systém vláknami. Číslo je riadené premennou $max_connections.
  2. Premenná $curRunning ukladá počet spustených vlákien, $running ukladá predchádzajúcu hodnotu; ak sa nerovnajú, potom jedno z vlákien dokončilo prácu.
  3. Dostávame informáciu o vyplnenej žiadosti.
  4. Ak zo servera nepríde žiadna odpoveď, odkaz nefunguje.
  5. Odpoveď servera je 404.
  6. Inak odkaz funguje.
  7. Žiadosť je dokončená, uvoľňujeme zdroje.
  8. Pridajme novú adresu URL do multi deskriptora.
  9. Funkcia add_url_to_multi_handle() pridá nový popisovač s danou URL do multideskriptoru.

Spustíme skript:

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

Kontrola trvala asi 2 sekundy. Súčasným spustením 10 vlákien sa výkon zvýši 10-krát v porovnaní s bežnými požiadavkami cURL. Ak chcete získať obsah odpovede servera, použite funkciu curl_multi_getcontent($ch) , kde $ch je deskriptor získaný z curl_multi_info_read() .

Ďalšie funkcie cURL v PHP

HTTP autentifikácia

Ak požiadavka HTTP vyžaduje autentifikáciu, použite nasledujúci kód:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // odoslanie užívateľského mena a hesla curl_setopt($ch, CURLOPT_USERPWD, "myusername:mojeheslo"); // ak sú povolené presmerovania curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // cURL pošle heslo po presmerovaní curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);

Nahrajte cez FTP

PHP má svoju vlastnú knižnicu na prácu s FTP, ale môžete použiť aj cURL:

// prečítať súbor $súbor = fopen("/cesta/k/súboru", "r"); // url už obsahuje potrebné údaje $url = "ftp://username: [chránený e-mailom]:21/cesta/k/novemu/suboru"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // možnosti curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, veľkosť súboru("/cesta/k/súboru")); curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ ch); curl_close($ch);

Pomocou proxy

Žiadosti možno podať prostredníctvom konkrétneho zástupcu:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // adresa proxy curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // ak sa vyžaduje autorizácia curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); curl_close($ch);

Funkcie spätného volania

Spätné volania je možné použiť počas spustenia požiadavky bez čakania na jej dokončenie. Napríklad počas sťahovania odpovede servera môžeme použiť už prijaté dáta bez čakania na úplné stiahnutie.

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

Funkcia spätného volania musí vrátiť dĺžku reťazca, aby požiadavka fungovala správne.

Pri každom prijatí ďalšej časti odpovede servera sa zavolá spätné volanie.

Záver

V tomto článku sme sa pozreli na pokročilé funkcie cURL v PHP. Nabudúce, keď budete musieť zadať požiadavky na adresy URL, použite cURL.

Často musíme sťahovať rôzne súbory z internetu, napríklad spustiteľné programové súbory, súbory skriptov, zdrojové archívy. Nie vždy to však treba robiť cez prehliadač. V mnohých situáciách je oveľa jednoduchšie vykonávať všetky akcie prostredníctvom terminálu. Pretože týmto spôsobom môžete automatizovať proces. Na druhej strane musia webmasteri z času na čas otestovať dostupnosť webových stránok, skontrolovať odoslané a prijaté hlavičky a mnoho ďalšieho.

Na vyriešenie takýchto problémov a problémov podobného rozsahu môžete použiť pomôcku curl. Umožňuje vám riešiť oveľa širšiu škálu problémov, vrátane simulácie akcií používateľov na stránke. V tomto článku sa pozrieme na to, ako používať curl, čo to je a prečo je tento program potrebný.

Curl je v skutočnosti viac než len pomôcka príkazového riadku pre Linux alebo Windows. Ide o súbor knižníc, ktoré implementujú základné možnosti práce s URL stránkami a prenosu súborov. Knižnica podporuje prácu s protokolmi: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, ako aj POP3, IMAP a SMTP. Je to skvelé na simuláciu akcií používateľov na stránkach a iných operácií s adresami URL.

Podpora knižnice curl bola pridaná do mnohých rôznych programovacích jazykov a platforiem. Pomôcka curl je nezávislý obal pre túto knižnicu. Práve na túto pomôcku sa zameriame v tomto článku.

príkaz curl

Predtým, ako prejdeme k popisu toho, ako možno použiť príkaz curl linux, pozrime sa na samotný nástroj a jeho hlavné možnosti, ktoré budeme potrebovať. Syntax nástroja je veľmi jednoduchá:

$ odkaz možnosti curl

Teraz sa pozrime na hlavné možnosti:

  • -# - zobraziť jednoduchý indikátor priebehu počas načítania;
  • -0 - použite protokol http 1.0;
  • -1 - používať šifrovací protokol tlsv1;
  • -2 - použite sslv2;
  • -3 - použite sslv3;
  • -4 - používať ipv4;
  • -6 - používať ipv6;
  • -A- zadajte svojho USER_AGENT;
  • -b- uložiť súbor cookie do súboru;
  • -c- odoslať súbor cookie na server zo súboru;
  • -C- pokračovať v sťahovaní súboru od bodu zlomu alebo zadaného posunu;
  • -m- maximálny čas čakania na odpoveď zo servera;
  • -d- odosielanie údajov metódou POST;
  • -D- uložiť hlavičky vrátené serverom do súboru;
  • -e- nastavte pole Referer-uri označujúce, z ktorej stránky používateľ prišiel;
  • -E- použiť externý SSL certifikát;
  • -f- nezobrazovať chybové hlásenia;
  • -F- zasielať údaje vo forme formulára;
  • -G- ak je táto možnosť povolená, potom všetky údaje špecifikované vo voľbe -d budú prenášané pomocou metódy GET;
  • -H- prenos hlavičiek na server;
  • -Ja- prijímať iba hlavičku HTTP a ignorovať celý obsah stránky;
  • -j- čítať a odosielať súbory cookie zo súboru;
  • -J- odstrániť hlavičku z požiadavky;
  • -L- prijímať a spracovávať presmerovania;
  • -s- maximálny počet presmerovaní pomocou polohy;
  • -o- výstup obsahu stránky do súboru;
  • -O- uložiť obsah do súboru s názvom stránky alebo súboru na serveri;
  • -p- použiť proxy;
  • --proto- uveďte protokol, ktorý sa má použiť;
  • -R- uložiť čas poslednej úpravy vzdialeného súboru;
  • -s- zobrazovať minimum informácií o chybách;
  • -S- zobrazenie chybových hlásení;
  • -T- nahrať súbor na server;
  • -v- najpodrobnejší výstup;
  • -y- minimálna rýchlosť sťahovania;
  • -Y- maximálna rýchlosť sťahovania;
  • -z- stiahnuť súbor iba vtedy, ak bol zmenený neskôr ako v určenom čase;
  • -V- zobraziť verziu.

V žiadnom prípade to nie sú všetky možnosti pre curl linux, ale sú tu uvedené základy, ktoré budete musieť použiť.

Ako používať curl?

Prebrali sme všetko, čo súvisí s teóriou práce s utilitou curl, teraz je čas prejsť na prax a pozrieť sa na príklady príkazu curl.

Najčastejšou úlohou je toto. Stiahnutie súboru je veľmi jednoduché. Ak to chcete urobiť, jednoducho odovzdajte názov súboru alebo html stránku obslužnému programu v parametroch:

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

Ale tu na vás čaká jedno prekvapenie: celý obsah súboru sa odošle na štandardný výstup. Ak ho chcete zapísať do ľubovoľného súboru, použite:

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

A ak chcete, aby sa výsledný súbor volal rovnako ako súbor na serveri, použite možnosť -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

V prípade potreby môžete jedným príkazom stiahnuť niekoľko súborov:

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

Ďalšia vec, ktorá môže byť pre správcu užitočná, je stiahnuť súbor iba vtedy, ak bol upravený:

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

Limit rýchlosti

Rýchlosť sťahovania môžete obmedziť na požadovaný limit, aby ste nepreťažili sieť pomocou voľby -Y:

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

Tu musíte zadať počet kilobajtov za sekundu, ktoré je možné stiahnuť. Môžete tiež ukončiť pripojenie, ak rýchlosť nie je dostatočná, použite na to možnosť -Y:

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

Prenos súborov

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

Alebo skontrolujeme, či je súbor odoslaný cez HTTP; existuje na to špeciálna služba:

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

V odpovedi vám obslužný program povie, kde nájdete stiahnutý súbor.

Odosielanie údajov POST

Metódou POST môžete odosielať nielen súbory, ale aj ľubovoľné údaje. Pripomínam, že tento spôsob sa používa na odosielanie údajov rôznych foriem. Na odoslanie takejto požiadavky použite voľbu -d. Na testovanie použijeme rovnakú službu:

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

Ak nie ste spokojní s touto možnosťou odoslania, môžete predstierať odoslanie formulára. Existuje možnosť -F:

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

Tu odovzdáme pole hesla s formulárom ako obyčajný text, rovnakým spôsobom môžete zadať niekoľko parametrov.

Odosielanie a prijímanie cookies

Cookies používajú webové stránky na ukladanie určitých informácií na strane užívateľa. Môže to byť potrebné napríklad pri autentifikácii. Cookies môžete odosielať a prijímať pomocou curl. Ak chcete uložiť prijaté súbory cookie do súboru, použite možnosť -c:

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

Potom môžete poslať súbor cookie curl späť:

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

Prenos a analýza hlavičky

Nie vždy nevyhnutne potrebujeme obsah stránky. Niekedy môžu byť zaujímavé len titulky. Ak chcete zobraziť iba ich, existuje možnosť -I:

curl -I https://site

A voľba -H vám umožňuje poslať niekoľko alebo viac na server, napríklad môžete odovzdať hlavičku If-Modified-Since, takže stránka sa vráti iba vtedy, ak bola upravená:

overenie kučery

Ak server vyžaduje jeden z bežných typov autentifikácie, ako napríklad HTTP Basic alebo FTP, curl túto úlohu zvládne veľmi ľahko. Ak chcete zadať podrobnosti autentifikácie, jednoducho ich zadajte oddelené dvojbodkou vo voľbe -u:

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

Autentifikácia na HTTP serveroch bude vykonaná rovnakým spôsobom.

Pomocou proxy

Ak potrebujete na sťahovanie súborov použiť proxy server, je to tiež veľmi jednoduché. Stačí zadať adresu proxy servera vo voľbe -x:

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

závery

V tomto článku sme sa pozreli na to, ako používať curl, prečo je tento nástroj potrebný a jeho hlavné možnosti. Napriek svojej podobnosti sú veľmi odlišné. Príkaz curl linux je určený skôr na analýzu a simuláciu rôznych akcií na serveri, zatiaľ čo wget je vhodnejší na sťahovanie súborov a prehľadávanie stránok.

Tento článok bude hovoriť o takom mocnom nástroji ako je cURL, ako aj o knižnici pre PHP, ktorá poskytuje prístup k tomuto nástroju - libcurl. Načo to všetko je? Na komunikáciu so serverom pomocou protokolov prenosu údajov, napríklad http alebo ftp. Ostatné protokoly nás nijako zvlášť nezaujímajú, ak sa niekto chce tejto téme venovať hlbšie, bude musieť vyhrabať zdroje v anglickom jazyku a tento článok bude obsahovať základy a príklady použitia.

Čo presne sú cURL a libcurl? Všeobecné body

Knižnica libcurl nám teda poskytuje možnosť prenášať údaje na server a prijímať z neho odpovede. Čo nám to dáva? Schopnosť napodobniť správanie používateľa alebo ! Môžete prijímať obsah stránok na následnú analýzu, môžete prijímať hlavičky odpovedí služby a programovo sa prihlasovať na stránky, vytvárať skripty na uverejňovanie správ (napríklad na Twitteri alebo na fórach) alebo informácií. Všetko je obmedzené len vašou predstavivosťou!

Inštalácia cURL na Denwer (Denver). Ako začať používať libcurl?

Prvá vec, ktorú musíme urobiť, je nainštalovať knižnicu. Na svojom lokálnom počítači používam zostavu Denwer, ako veľká väčšina začínajúcich webmasterov, ktorým je článok určený. Skúsení používatelia, ktorí si nezávisle nainštalujú kombináciu php+apache+mysql, si budú môcť nainštalovať cURL, nie je na mne, aby som im vysvetľoval, ako sa to robí;) A my, začiatočníci, používame hotové riešenia, aby sme to uľahčili. Preto nainštalujte libcurl takto:

  • Stiahnite si hotový rozširujúci balík „PHP5: dodatočné moduly“.
  • Podľa toho ho nainštalujeme. Nič zložité, súhlasím :)
  • Otvorte súbor v programe Poznámkový blok (vždy odporúčam Notepad++): X:/webservers/usr/local/php5/php.ini //kde X je váš disk, na ktorom je nainštalovaný webový server

    a odstráňte bodkočiarku na začiatku výrazov:

    ;extension=php_curl.dll

  • Reštartujeme server Denver.

Pripravený. Ak chcete skontrolovať funkčnosť knižnice, môžete zavolať funkciu phpinfo() a nájsť tam riadok: podpora cURL povolená. Gratulujem k prvému víťazstvu.

Popis cURL a prvé kroky

Ak chcete začať pracovať s nástrojom, je potrebné ho inicializovať. Toto sa robí nasledovne:

$ch = curl_init();

Použili sme funkciu inicializácie relácie cURL. V tomto prípade môžete adresu URL nastaviť hneď takto:

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

A môžete to urobiť neskôr v možnostiach. Nezáleží na poradí, v akom sú doplnky nainštalované. Robí to iná funkcia:

Curl_setopt (zdroj ch, možnosť reťazca, zmiešaná hodnota)

Prvý parameter tejto funkcie, teda resource ch, sme už vytvorili hneď vyššie, ale existuje veľa parametrov možností a hodnôt. Myslím, že by ste ich sem nemali všetky kopírovať a vkladať, ale stačí dať odkaz na podrobný popis funkcie, dúfam, že sa nikto neurazí: curl_setopt.

Uvediem príklad možností nastavenia pomocou adresy URL:

$url = "https://stránka"; curl_setopt($ch, CURLOPT_URL,$url);

Niekoľko ďalších príkladov možností nastavenia: získajme hlavičku odpovede servera bez toho, aby sme dostali samotnú stránku:

Curl_setopt($ch, CURLOPT_HEADER, 1); // prečítanie hlavičky curl_setopt($ch, CURLOPT_NOBODY, 1); // čítať LEN hlavičku bez tela

Takže sme inicializovali reláciu, nastavili parametre, ktoré potrebujeme, teraz vykonáme výslednú požiadavku, zatvoríme reláciu a zobrazíme výsledok:

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

Výsledkom je náš prvý plne funkčný príklad použitia knižnice libcurl:

$ch = curl_init(); $url = "https://stránka"; curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 1); // prečítanie hlavičky curl_setopt($ch, CURLOPT_NOBODY, 1); // prečíta LEN hlavičku bez tela $result = curl_exec($ch); curl_close($ch); echo $vysledok;

Dúfam, že je jasné, ako to funguje, pretože sme sa pozreli na každý krok samostatne :) Výsledkom je, že zo servera dostaneme hlavičku HTTP odpovede, ktorú určite analyzujeme nižšie, aby sme lepšie pochopili všetky fázy interakcie medzi prehliadač a server:

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

Úžasné! Zo servera sme dostali hlavičku odpovede a testovali sme knižnicu v akcii. Ako je to pre nás užitočné? Pretože teraz si môžete približne predstaviť postupnosť akcií pri práci s cURL:

  • Inicializovať reláciu (curl_init)
  • Nastavte možnosti, ktoré potrebujeme (curl_setopt)
  • Vykonať prijatú požiadavku (curl_exec)
  • Ukončiť reláciu (curl_close)

Štruktúra hlavičky HTTP požiadavky

Napríklad som sa obrátil na stránku ya.ru a pozrel som sa na vygenerovanú požiadavku prehliadača a odpoveď prijatú zo servera. Tu sú:
Žiadosť
GET / HTTP/1.1 - Snažíme sa získať stránku na /, teda hlavnú stránku umiestnenú v koreňovom adresári priečinka. Používame protokol verzie 1.1.
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 verzia/12.14— Predstavujeme sa serveru, sme prehliadač Opera.
Hostiteľ: ya.ru — Názov domény požadovaného zdroja.
Prijať: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1— Zoznam prijateľných formátov zdrojov.
Akceptačný jazyk: ru-RU,ru;q=0,9,en;q=0,8— Zoznam podporovaných jazykov.
Accept-Encoding: gzip, deflate— Podporované metódy kódovania.
Cookie: yandexuid=ХХХХХ - Cookies, ak je to potrebné.
Spojenie: Keep-Alive - Prosím, neprerušujte spojenie a zostaňte v kontakte.
Odpoveď
HTTP/1.1 200 Ok - Dostávame odpoveď s kódom 200, čo znamená, že je všetko v poriadku.
Server: nginx - Server sa predstavil - toto je nginx.
Dátum: nedeľa, 10. marec 2013 14:10:50 GMT— Aktuálny dátum a čas na serveri.
Content-Type: text/html; znaková sada=UTF-8— Typ obsahu a kódovanie.
Pripojenie: zavrieť - Server s nami nechce udržiavať trvalé spojenie, preto ho okamžite zatvorí. Pre ďalšiu požiadavku sa vytvorí nové pripojenie.
Cache-Control: no-cache,no-store,max-age=0, must-revalidate— Správa vyrovnávacej pamäte. V tomto prípade je deaktivovaná.
Vyprší: nedeľa, 10. marec 2013 14:10:50 GMT— Dátum predpokladaného konca relácie. V našom prípade sa zhoduje s časom otvorenia, pretože server ho okamžite zatvoril, ihneď po spracovaní.
Posledná úprava: nedeľa, 10. marec 2013 14:10:50 GMT— Čas poslednej úpravy.
Kódovanie obsahu: gzip — Spôsob kódovania informácií.
Kompletný zoznam všetkých parametrov, ktoré možno nájsť v hlavičke HTTP požiadavky, nájdete na Wikipédii.
Teraz máte približnú predstavu o tom, ako váš prehliadač a webový server navzájom komunikujú. Toto je veľmi užitočné poznať a pochopiť, pretože sa pokúsime napodobniť akcie prehliadača pomocou knižnice libcurl. Pokračuj.

Príklad práce s knižnicou

Verím, že keď už sú niektoré všeobecné body jasné a všetko sa zdá byť jasné, potom je čas prejsť na precvičovanie a zdokonaľovanie svojich zručností pomocou príkladu. Mňa osobne vždy svrbia ruky všetko vyskúšať v praxi :)

Keďže cURL je pre analyzátory také dobré, zvážme funkciu získania kódu stránky podľa jej adresy. V tomto prípade bude výstupom pole s názvom, obsahom stránky a dokonca aj kódmi chýb, ak sa niečo pokazí.

Funkcia get_web_page($url) ( $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 verzia/12.14"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // vráti webovú stránku curl_setopt($ch, CURLOPT_HEADER, 0); // nevráti hlavičky curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // nasleduje presmerovanie curl_setopt($ch, CURLOPT_ENCODING, ""); // spracuje všetky kódovania curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // používateľský agent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // časový limit pripojenia curl_setopt($ch, CURLOPT_TIMEOUT, 120); // časový limit odozvy curl_setopt_RIRSOPt (CURLOPT_TIMEOUT, 120) , 10); // zastavenie po 10. presmerovaní $content = curl_exec($ch); $err = curl_errno($ch); $errmsg = curl_error($ch); $header = curl_getinfo($ch); curl_close( $ ch); $header["errno"] = $err; $header["errmsg"] = $errmsg; $header["content"] = $content; return $header; )

Vstupné parametre:
url — adresa stránky alebo lokality.
Hodnoty výstupných parametrov (pole s tromi prvkami):
header['errno'] - ak sa niečo pokazilo, bude tu kód chyby.
header[‘errmsg’] – tu sa zobrazí chybový text.
hlavička['obsah'] - aktuálna strana\súbor\obrázok atď.

Funkciu používame napríklad takto:

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

Všetko by malo prebehnúť bez chýb a kód stránky dostanete v premennej $page. Ak sa pokúsime získať neexistujúcu stránku yaaaaaaaaaaaa.ru, dostaneme chybu:

Nepodarilo sa vyriešiť hostiteľ: yaaaaaaaaaaaa.ru; Hostiteľ sa nenašiel

Všetko je spracované správne a krásne :)
Potom môžete s kódom stránky robiť, čo chcete, napríklad ho analyzovať pomocou regulárnych výrazov. Ale to je všetko v ďalších lekciách, no nateraz sa zastavme pri tomto.

JavaScript je vo vašom prehliadači zablokovaný. Povoľte JavaScript, aby stránka fungovala!

Curl

PHP podporuje libcurl, knižnicu vytvorenú Danielom Stenbergom, ktorá umožňuje pripojiť sa k rôznym typom serverov a používať rôzne protokoly.
libcurl v súčasnosti podporuje protokoly http, https, ftp, gopher, telnet, dict, file a ldap.
libcurl tiež podporuje HTTPS certifikáty, HTTP POST, HTTP PUT, FTP upload (toto sa dá urobiť aj s ftp PHP rozšírením), HTTP upload založený na formulári, proxy, cookies a autentifikáciu užívateľ+heslo.

Tieto funkcie boli zavedené v PHP 4.0.2.

curl_init

curl_init - inicializuje reláciu CURL.

Popis

zdroj curl_init()

Funkcia curl_init() inicializuje novú reláciu a vráti handle CURL na použitie vo funkciách a. Ak je voliteľný parameter url je poskytnutá, potom možnosť CURLOPT_URL získa hodnotu tohto parametra. Môžete ho nainštalovať manuálne pomocou .

curl_setopt

curl_setopt - nastavuje možnosti pre prenos/prenos CURL.

Popis

bool curl_setopt(zdroj ch, možnosť reťazca, zmiešaná hodnota)

Funkcia curl_setopt() nastavuje možnosti pre reláciu CURL identifikovanú parametrom ch. Parameter možnosť je možnosť, ktorú chcete nastaviť, a hodnotu toto je hodnota opcie možnosť .

Parameter hodnotu musí byť dlhý pre nasledujúce možnosti (špecifikované parametrom možnosť):

  • CURLOPT_INFILESIZE: Ak nahrávate súbor na vzdialenú lokalitu, táto možnosť by sa mala použiť na to, aby ste PHP oznámili, aká bude očakávaná veľkosť vstupného súboru.
  • CURLOPT_VERBOSE: Nastavte túto možnosť na nenulovú hodnotu, ak chcete, aby CURL oznamoval všetky akcie.
  • CURLOPT_HEADER: Nastavte túto možnosť na nenulovú hodnotu, ak chcete, aby bola hlavička zahrnutá do výstupu.
  • CURLOPT_NOPROGRESS: Nastavte túto voľbu na nenulovú hodnotu, ak nechcete, aby PHP zobrazovalo indikátor priebehu prenosu CURL. (PHP automaticky nastaví túto možnosť na nenulovú hodnotu, stačí ju zmeniť len pri ladení.)
  • CURLOPT_NOBODY: Nastavte túto možnosť na nenulovú hodnotu, ak nechcete, aby bolo telo zahrnuté do výstupu.
  • CURLOPT_FAILONERROR: Nastavte túto voľbu na nenulovú hodnotu, ak chcete, aby sa PHP ticho ukončilo, ak je vrátený HTTP kód väčší ako 300. Štandardne sa stránka vráti normálne s ignorovaným kódom.
  • CURLOPT_UPLOAD: Nastavte túto možnosť na nenulovú hodnotu, ak chcete, aby PHP pripravilo súbor na upload.
  • CURLOPT_POST: Nastavte túto voľbu na nenulovú hodnotu, ak chcete, aby PHP vykonávalo pravidelný HTTP POST. Tento POST je v normálnej forme application/x-www-form-urlencoded, najčastejšie sa používa vo formulároch HTML.
  • CURLOPT_FTPLISTONLY: Nastavte túto možnosť na nenulovú hodnotu a PHP vypíše názvy adresárov FTP.
  • CURLOPT_FTPAPPEND: Nastavte túto voľbu na nenulovú hodnotu a PHP sa k vzdialenému súboru pripojí namiesto jeho prepísania.
  • CURLOPT_NETRC: Nastavte túto možnosť na nenulovú hodnotu a PHP prehľadá váš súbor ~./netrc, aby zistilo vaše používateľské meno a heslo pre vzdialenú lokalitu, ku ktorej sa pripájate.
  • CURLOPT_FOLLOWLOCATION: Nastavte túto možnosť na nenulovú hodnotu, aby ste sledovali akúkoľvek hlavičku „Location: “, ktorú server odošle ako súčasť hlavičky HTTP (všimnite si, že ide o rekurziu, PHP bude nasledovať všetky odoslané hlavičky „Location: “ -headers. )
  • CURLOPT_PUT: Nastavte túto možnosť na nenulovú hodnotu na HTTP PUT súbor. Súbor pre PUT musí byť nastavený pomocou CURLOPT_INFILE a CURLOPT_INFILESIZE.
  • CURLOPT_MUTE: Nastavte túto možnosť na nenulovú hodnotu a PHP bude pracovať skryté s ohľadom na funkcie CURL.
  • CURLOPT_TIMEOUT: Zadajte dĺžku ako parameter, ktorý obsahuje maximálny čas v sekundách, počas ktorého povolíte spustenie funkcií CURL.
  • CURLOPT_CONNECTTIMEOUT: Zadajte dlhý čas ako parameter, ktorý obsahuje maximálny čas v sekundách, počas ktorého môžete čakať pri pokuse o pripojenie. Použite 0 na čakanie navždy.
  • CURLOPT_LOW_SPEED_LIMIT: Zadajte dlhú ako parameter, ktorý obsahuje rýchlosť prenosu v bajtoch za sekundu, pod ktorou musí prenos počas vykonávania CURLOPT_LOW_SPEED_TIME v sekundách prebehnúť, aby ho PHP považovalo za príliš pomalé a prerušilo ho.
  • CURLOPT_LOW_SPEED_TIME: Odovzdajte dlhú ako parameter, ktorý obsahuje čas v sekundách, pod ktorým musí prenos prebiehať pri spustení CURLOPT_LOW_SPEED_LIMIT, aby ho PHP považovalo za príliš pomalé a prerušilo ho.
  • CURLOPT_RESUME_FROM: Pass long ako parameter, ktorý obsahuje bajtový posun, pri ktorom by sa mal prenos začať.
  • CURLOPT_SSLVERSION: Zadajte dĺžku ako parameter, ktorý obsahuje verziu SSL, ktorá sa má použiť (2 alebo 3). V predvolenom nastavení sa to PHP pokúša určiť samo, aj keď v niektorých prípadoch to musíte nastaviť manuálne.
  • CURLOPT_SSL_VERIFYHOST: Ak má CURL skontrolovať bežný názov partnerského certifikátu pri nadviazaní spojenia SSL, prejdite dlho. Hodnota 1 znamená, že by sme mali skontrolovať existenciu bežného /bežného názvu, hodnota 2 znamená, že by sme sa mali uistiť, že sa zhoduje so zadaným názvom hostiteľa.
  • CURLOPT_TIMECONDITION: Zadajte dĺžku ako parameter, ktorý určuje, ako sa bude zaobchádzať s CURLOPT_TIMEVALUE. Tento parameter môžete nastaviť na TIMECOND_IFMODSINCE alebo TIMECOND_ISUNMODSINCE. Toto funguje len pre HTTP.
  • CURLOPT_TIMEVALUE: Zadajte dlhú ako parameter, čo je čas v sekundách od 1. januára 1970. Tento čas sa používa tak, ako je špecifikované voľbou CURLOPT_TIMEVALUE, alebo sa použije predvolený TIMECOND_IFMODSINCE.
  • CURLOPT_RETURNTRANSFER: Zadajte nenulovú hodnotu, ak chcete, aby CURL priamo vrátilo prijaté informácie namiesto priameho vytlačenia.

Parameter hodnotu musí byť reťazec pre nasledujúce hodnoty parametrov možnosť :

Nasledujúce možnosti očakávajú deskriptor súboru, ktorý sa získa pomocou funkcie fopen() :

  • CURLOPT_FILE: Súbor, do ktorého sa má umiestniť výstup vášho prenosu, štandardne je to STDOUT.
  • CURLOPT_INFILE: Súbor, z ktorého pochádza váš prenosový vstup.
  • CURLOPT_WRITEHEADER: Súbor pre záznam hlavičkovej časti výstupu.
  • CURLOPT_STDERR: Súbor na zaznamenávanie chýb namiesto stderr.

Parameter hodnotu long write_callback (resource ch, string data)( ... return strlen($data);) možnosť :

  • CURLOPT_WRITEFUNCTION: .
  • CURLOPT_HEADERFUNCTION: .

Parameter hodnotu by mala byť funkciou nasledujúceho tvaru reťazec read_callback (zdroj ch, zdroj fd, dlhá dĺžka)() pre nasledujúce hodnoty parametrov možnosť :

  • CURLOPT_READFUNCTION: .

curl_exec

curl_exec - vykoná reláciu CURL.

Popis

bool curl_exec(zdroj ch)

Táto funkcia by sa mala volať po inicializácii relácie CURL a po nastavení všetkých možností pre túto reláciu. Jeho účelom je jednoducho vykonať preddefinovanú reláciu CURL (špecifikovanú v parametri ch).

curl_close

curl_close - zatvorí reláciu CURL.

Popis

neplatné curl_close(zdroj ch)

Táto funkcia zatvorí reláciu CURL a uvoľní všetky zdroje. Rukoväť CURL ch sa tiež vypúšťa.

curl_errno

curl_errno - vráti celé číslo obsahujúce posledné číslo chyby.

Popis

Príklad 1: Inicializácia novej relácie CURL a načítanie webovej stránky.
Príklad 2: Použitie PHP modulu CURL na získanie example.com
Príklad 3: Kontrola dostupnosti URL pomocou PHP CURL
Príklad 4: Oddelenie hlavičky od tela získaného pomocou PHP CURL
Príklad 5: Určenie referenčnej adresy URL pomocou PHP CURL
problém: curl_setopt($ch,FOLLOW_LOCATION,1); chyba: problém s open_basedir a safe_mode riešenie: funkcia, ktorú už niekto vyvinul riešenie n 2: rovnaká funkcia, upravená, mi funguje skvele.= $curl_max_loops) ( $curl_loops = 0; návrat FALSE; ) curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); zoznam($hlavička, $údaje) = explode("\n\n", $údaje, 2); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 301 || $http_code == 302) ( $matches = ; preg_match("/Location:(.*?)\n/", $header, $matches); $url = @parse_url(trim (array_pop($matches))); if (!$url) ( //nepodarilo sa spracovať url na presmerovanie na $curl_loops = 0; vrátiť $data; ) $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)) ; if (!$url["schéma"]) $url["schéma"] = $posledná_url["schéma"]; if (!$url["hostiteľ"]) $url["hostiteľ"] = $posledná_url[ "hostiteľ"]; if (!$url["cesta"]) $url["cesta"] = $posledná_url["cesta"]; $new_url = $url["schéma"] . "://" . $ url["hostiteľ"] . $url["cesta"] . ($url["dotaz"]?"?".$url["dotaz"]:""); curl_setopt($ch, CURLOPT_URL, $new_url) ; debug("Presmerovanie na", $new_url); return curl_redir_exec($ch); ) else ( $curl_loops=0; return $data; ) ) ?>
stačí použiť túto funkciu bez de FOLLOW_LOCATION a mala by fungovať. problém bol v tom, že keď sa dostanete na riadok, kde vraciate údaje, ak bol http_code iný ako 301 oe 302, $data má zastarané informácie alebo žiadne. takže $debbbb robí túto prácu.
Príklad 6: Analýza súboru cookie z hlavičky pomocou CURL PHP
Niekedy nemôžete použiť CURLOPT_COOKIEJAR a CURLOPT_COOKIEFILE kvôli php-settings servera (hovorí sa, že pomocou týchto možností môžete zo servera stiahnuť akékoľvek súbory). Tu je riešenie 1)Nepoužívajte CURLOPT_FOLLOWLOCATION 2)Použite curl_setopt($ch, CURLOPT_HEADER, 1) 3)Zoberte súbory cookie z hlavičky takto: preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $vysledky); 4)Nastavte ich pomocou curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Príklad 7: Analýza súboru cookie z hlavičky pomocou CURL PHP
Ako už spomenul Jevgen, niekedy nemôžeme použiť CURLOPT_COOKIEJAR a CURLOPT_COOKIEFILE. Nižšie je funkcia spätného volania hlavičky, ktorú som napísal v januári a ktorá vám umožňuje udržiavať súbory cookie medzi požiadavkami cURL. Súbory cookie sa pridávajú do $ch počas všetkých požiadaviek, dokonca aj počas presmerovania, takže môžete použite ho spolu s CURLOPT_FOLLOWLOCATION. Tu je kód: function read_header($ch, $string) (globálna $umiestnenie; #sledovať polohu/presmeruje globálne $cookiearr; #uložiť súbory cookie tu globálne $ch; # ^prepíše parameter funkcie $ch # toto je v poriadku, pretože musíme # aktualizovať globálne $ch pomocou # nových súborov cookie $length = strlen($string); if(!strncmp($string, "Location:", 9)) ( #keep track of posledné presmerovanie $location = trim(substr($string, 9, -1)); ) if(!strncmp($string, "Set-Cookie:", 11)) ( #získať súbor cookie $cookiestr = trim(substr( $string, 11, -1)); $cookie = explode(";", $cookiestr); $cookie = explode("=", $cookie); $cookiename = trim(array_shift($cookie)); $cookiearr [$cookiename] = trim(implode("=", $cookie)); ) $cookie = ""; if(trim($string) == "") ( #execute len na konci hlavičky foreach ($cookiearr ako $key=>$value) (​$cookie .= "$key=$value; "; ) curl_setopt ($ ch, CURLOPT_COOKIE, $cookie); ) return $length; ) curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_header"); Tento kód predpokladá, že znova použijete $ch bez toho, aby ste ho zakaždým inicializovali (zavolajte curl_init iba raz, na začiatku). Ak potrebujete v ktoromkoľvek bode kódu znova inicializovať $ch, môžete pristupovať k aktuálne uloženým súborom cookie v $cookiearr a zahrnúť ich do nového $ch. Túto funkciu som napísal skôr, ako som mal dostatok skúseností s regulárnymi výrazmi, takže tu nenájdete žiadne volania preg_match. Tento kód som používal už dosť dlho a bez problémov som sa dostal na gmail, yahoo, hotmail, aol atď. prejsť prihlásením a niekoľkými stránkami, kým som sa dostal k tomu, čo som hľadal.
Príklad 8: Nastavenie obslužného programu načítania hlavičky pomocou CURL PHP
Pomocou cURL som potreboval zavolať skript tretej strany, ktorý vracal binárne údaje ako prílohu, aby som znova odovzdal získané údaje ako prílohu. Problém bol v tom, že skript tretej strany príležitostne vracal chyby HTTP a chcel som sa v takýchto prípadoch vyhnúť odovzdávaniu prílohy s nulovou dĺžkou. Kombinácia použitia spätného volania CURLOPT_FAILONERROR a CURLOPT_HEADERFUNCTION pomohla úhľadne spracovať chyby HTTP skriptu tretej strany: funkcia curlHeaderCallback($resURL, $strHeader) ( if (preg_match("/^HTTP/i", $strHeader)) ( header($strHeader) ); header("Content-Disposition: attachment; filename="názov-súboru.zip""); ) return strlen($strHeader); ) $resURL = curl_init("http://site/"); curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1); curl_setopt($resURL, CURLOPT_HEADERFUNCTION, "curlHeaderCallback"); curl_setopt($resURL, CURLOPT_FAILONERROR, 1); curl_exec($resURL); $intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE); curl_close($resURL); if ($intReturnCode != 200) ( print "Chyba s kódom: " . $intReturnCode; )
Príklad 9. Uloženie stránky do súboru a výpočet prenosovej rýchlosti pomocou CURL PHP
WritePageToFile("http://es.php.net", "es.php.net.txt"); function WritePageToFile($sHTMLpage, $sTxtfile) ( $sh = curl_init($sHTMLpage); $hFile = FOpen($sTxtfile, "w"); curl_setopt($sh, CURLOPT_FILE, $hFile); curl_setopt($sh, CURLOPT_HEADER, 0); curl_exec ($sh); $sAverageSpeedDownload = curl_getInfo($sh, CURLINFO_SPEED_DOWNLOAD); $sAverageSpeedUpload = curl_getInfo($sh, CURLINFO_SPEED_UPLOAD); echo "
"; echo "Priemerná rýchlosť sťahovania == " . $sAverageSpeedDownload ." 
"; echo "Priemerná rýchlosť nahrávania == " . $sAverageSpeedUpload ."
"; echo"
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo "
"; curl_close($sh); FClose ($hFile); echo "( Pozrite si súbor ".$sTxtfile."" v rovnakej ceste ako hostiteľ." " na miesto, kde sa nachádza tento skript PHP).
"; }
Príklad 9. Príjem stránky cez pripojenie SSL (https)
$ch=curl_init("https://site"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Vypnite chybu "Problém s certifikátom SSL, overte, či je certifikát CA v poriadku" curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Zakázať chybu "SSL: názov predmetu certifikátu "hostname.ru" sa nezhoduje s názvom cieľového hostiteľa "123.123"" curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $out=curl_exec($ch); //$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //echo "http_code=".$http_code,", err=".curl_error($ch); curl_close($ch);
Príklad 10: Používanie relácií a súborov cookie v zvlnení
$cookie_filename=sys_get_temp_dir()+"/cookie.tmp"; $curl=curl_init("http://stránka"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename);//uložiť prijaté COOKIE do súboru curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //odošlete na server súbory COOKIE prijaté od neho počas autorizácie $out=curl_exec($curl);
Príklad 11: Nahranie súboru a viacrozmerné pole v Curl. CURLOPT_POSTFIELDS + CurlFile

Ak potrebujete poslať viacrozmerné pole a súbor v požiadavke POST, narazíte na neriešiteľný problém. Ak odošlete viacrozmerné pole do CURLOPT_POSTFIELDS, druhá úroveň bude odovzdaná ako reťazec "Array". Ak konvertujete pomocou http_build_query, nebudete môcť preniesť súbor.

Nižšie je uvedená funkcia na kódovanie dvojrozmerného poľa s načítaním súborov pre Curl, ktorá bude fungovať v oboch starších verziách PHP 5.3, PHP 5.4 a PHP 5.6.

/** prevedie viacrozmerné pole na jednorozmerné pole pomocou zložitých indexov a nahradí znak @ v predpone CurlFile na použitie v Curl * @param $inputArray * @param string $inputKey * @return pole $requestVars = pole ("id" => pole( 1, 2,"id"=>1234), "name" => "log", "logfile" => "@/tmp/test.log"); dostaneme: ["id"]=> int(1) ["id"]=> int(2) ["id"]=> int(1234) ["name"]=> string(3) "log" [ "logfile"]=> string(13) "/tmp/test.log" ) */ function convertToStringArray($inputArray, $inputKey="") ( $resultArray=; foreach ($inputArray ako $key => $value ) ( $tmpKey = (bool)$inputKey ? $inputKey."[$key]" : $key; if (is_array($value)) ( $resultArray+=convertToStringArray($value, $tmpKey); ) elseif ($value = = "@")( $resultArray[$tmpKey] = (class_exists(" CURLFile ", false)) ? new CurlFile(ltrim($value, "@")) : $value; ) else ( $resultArray[$tmpKey ] = $value; ) ) return $resultArray; ) // kontrola $requestVars = array("id" => array(1, 2,"id"=>1234), "name" => "log", "logfile" " => "@/tmp/test.log"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "stránka"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars)); $res = curl_exec($ch); curl_close($ch); Príklady použitia Curl