PHP CURL - funkce a příklady použití. Pokročilé použití cURL v možnostech příkazového řádku PHP Curl
(PHP 4 >= 4.0.2, PHP 5, PHP 7)
curl_setopt — Nastavuje parametr pro relaci CURL
Seznam parametrů
popisovač cURL získaný z curl_init().
Parametr k nastavení CURLOPT_XXX.
Hodnota parametru opce.
bool:
Parametr | Poznámky | |
---|---|---|
CURLOPT_AUTOREFERER | SKUTEČNÝ pro automatické nastavení v terénu Referrer: v požadavcích přesměrovaných hlavičkou Umístění:. | |
CURLOPT_BINARYTRANSFER | SKUTEČNÝ vrátit nezpracovanou odezvu při použití konstanty CURLOPT_RETURNTRANSFER. | Od PHP 5.1.3 již tato možnost není vyžadována: při použití této možnosti je vždy vrácen nezpracovaný výstup CURLOPT_RETURNTRANSFER. |
CURLOPT_COOKIESESSION | SKUTEČNÝ aby dal aktuální relaci pokyn ke spuštění nové „relace“ souborů cookie. To způsobí, že libcurl bude ignorovat všechny soubory cookie „relace“, které by měl načíst z předchozí relace. Ve výchozím nastavení libcurl vždy ukládá a načítá všechny soubory cookie, bez ohledu na to, zda jsou „session“ nebo ne. Soubory cookie „relace“ jsou soubory cookie, jejichž platnost nevyprší a musí existovat pouze pro aktuální „relaci“. | |
CURLOPT_CERTINFO | SKUTEČNÝ pro výstup informací o certifikátu SSL do streamu STDERR se zabezpečeným připojením. | Přidáno v cURL 7.19.1. Dostupné od PHP 5.3.2. Pro správnou funkci vyžaduje povolení této možnosti CURLOPT_VERBOSE. |
CURLOPT_CONNECT_ONLY | SKUTEČNÝříká knihovně, aby provedla nezbytnou proxy autentizaci a nastavení připojení, ale nepřenáší data. Tato možnost je implementována pro HTTP, SMTP a POP3. | Přidáno 7.15.2. Dostupné od PHP 5.5.0. |
CURLOPT_CRLF | SKUTEČNÝ převést konce řádků Unix na CRLF. | |
CURLOPT_DNS_USE_GLOBAL_CACHE | SKUTEČNÝ používat globální mezipaměť DNS. Tato možnost není bezpečná pro vlákna a je ve výchozím nastavení povolena. | |
CURLOPT_FAILONERROR | SKUTEČNÝ pro podrobnou zprávu o selhání, pokud je přijatý kód HTTP větší nebo roven 400. Výchozí chování vrátí stránku jako normální, kód ignoruje. | |
CURLOPT_FILETIME | SKUTEČNÝ pokusit se získat datum změny vzdáleného dokumentu. Tuto hodnotu lze získat pomocí parametru CURLINFO_FILETIME z funkce curl_getinfo(). | |
CURLOPT_FOLLOWLOCATION | SKUTEČNÝ sledovat jakýkoli nadpis "Umístění:" odeslané serverem ve své odpovědi (všimněte si, že se to děje rekurzivně, PHP bude následovat všechny odeslané hlavičky "Umístění:", kromě případů, kdy je nastavena konstanta CURLOPT_MAXREDIRS). | |
CURLOPT_FORBID_REUSE | SKUTEČNÝ vynutit uzavření připojení po dokončení jeho zpracování, aby jej nebylo možné znovu použít. | |
CURLOPT_FRESH_CONNECT | SKUTEČNÝ vynutit použití nového připojení místo připojení uloženého v mezipaměti. | |
CURLOPT_FTP_USE_EPRT | SKUTEČNÝ používat EPRT (a LPRT) pro aktivní odesílání FTP. Použití NEPRAVDIVÉ za účelem deaktivace EPRT a LPRT a použití pouze PORT. | |
CURLOPT_FTP_USE_EPSV | SKUTEČNÝ pro počáteční testování příkazu EPSV během přenosů FTP. Pokud příkaz selže, přejde zpět na PASV. Instalovat v NEPRAVDIVÉ zakázat EPSV. | |
CURLOPT_FTP_CREATE_MISSING_DIRS | SKUTEČNÝ k vytvoření chybějících adresářů, pokud operace FTP narazí na neexistující cestu. | |
CURLOPT_FTPAPPEND | SKUTEČNÝ k zapsání vzdáleného souboru na konec, místo jeho přepsání přes existující soubor. | |
CURLOPT_TCP_NODELAY | Trvale určuje, zda má být nastavena nebo vymazána volba TCP_NODELAY (1 = nastaveno, 0 = vymazáno). Ve výchozím nastavení je tato možnost vymazána. | Dostupné od PHP 5.2.1 pro verze vytvořené s libcurl 7.11.2 nebo novější. |
CURLOPT_FTPASCII | Přezdívka CURLOPT_TRANSFERTEXT. Místo toho použijte toto. | |
CURLOPT_FTPLISTONLY | SKUTEČNÝ vrátit pouze seznam jmen z adresáře FTP. | |
CURLOPT_HEADER | SKUTEČNÝ k zahrnutí záhlaví do výstupu. | |
CURLINFO_HEADER_OUT | SKUTEČNÝ sledovat řetězec dotazu handle. | Dostupné od PHP 5.1.3. Předpona CURLINFO_ používá konkrétně. |
CURLOPT_HTTPGET | SKUTEČNÝ k resetování metody požadavku HTTP na metodu GET. Protože GET je výchozí nastavení, je tento parametr potřeba pouze v případě, že byla dříve změněna metoda požadavku. | |
CURLOPT_HTTPPROXYTUNNEL | SKUTEČNÝ k tunelování přes zadaný HTTP proxy. | |
CURLOPT_MUTE | SKUTEČNÝ pro úplné zakázání zpráv funkce cURL. | Odstraněno v cURL 7.15.5 (lze použít možnost CURLOPT_RETURNTRANSFER) |
CURLOPT_NETRC | SKUTEČNÝ k načtení souboru ~/.netrc pro přihlašovací jméno a heslo pro vzdálený web, se kterým se navazuje spojení. | |
CURLOPT_NOBODY | SKUTEČNÝ k vyloučení těla odpovědi z výstupu. Metoda požadavku je nastavena na HEAD. Změna tohoto nastavení na NEPRAVDIVÉ nezmění to zpět na GET. | |
CURLOPT_NOPROGRESS | SKUTEČNÝ pro deaktivaci indikátoru průběhu přenosu cURL.
|
|
CURLOPT_NOSIGNAL | SKUTEČNÝ ignorovat jakoukoli funkci cURL, která odesílá signály do procesu PHP. Tato možnost je ve výchozím nastavení povolena ve vícevláknových SAPI, aby parametry časového limitu fungovaly správně. | |
CURLOPT_POST | SKUTEČNÝ používat běžný HTTP POST. Tato metoda POST používá normální , běžně používané ve formulářích HTML. | |
CURLOPT_PUT | SKUTEČNÝ ke stažení souboru pomocí metody HTTP PUT. Použitý soubor je nutné nastavit pomocí voleb CURLOPT_INFILE A CURLOPT_INFILESIZE. | |
CURLOPT_RETURNTRANSFER | SKUTEČNÝ vrátit výsledek přenosu jako řetězec z curl_exec() místo přímého výstupu do prohlížeče. | |
CURLOPT_SAFE_UPLOAD | SKUTEČNÝ zakázat podporu prefixů @ pro stažené soubory v CURLOPT_POSTFIELDS, což znamená, že hodnoty předané s @ lze bezpečně přenášet jako pole. Místo předpony můžete použít volbu CURLFile d. | Přidáno v PHP 5.5.0 s výchozí hodnotou NEPRAVDIVÉ. V PHP 5.6.0 se standardně rovnal SKUTEČNÝ. |
CURLOPT_SSL_VERIFYPEER | NEPRAVDIVÉ zakázat cURL v kontrole hostitelského certifikátu. Alternativní certifikáty k ověření lze zadat pomocí parametru CURLOPT_CAINFO nebo adresář s certifikáty určený parametrem CURLOPT_CAPATH. | Výchozí je SKUTEČNÝ od cURL verze 7.10. Výchozí distribuce se instaluje od cURL verze 7.10. |
CURLOPT_TRANSFERTEXT | SKUTEČNÝ pro použití režimu ASCII pro přenosy FTP. Při použití LDAP jsou data vrácena jako prostý text namísto HTML. V systémech Windows vlákno STDOUT se nenastaví do binárního režimu. | |
CURLOPT_UNRESTRICTED_AUTH | SKUTEČNÝ pokračovat v odesílání přihlašovacího jména a hesla během přesměrování (při použití CURLOPT_FOLLOWLOCATION), i když se změní název hostitele. | |
CURLOPT_UPLOAD | SKUTEČNÝ pro přípravu na nahrání souboru na server. | |
CURLOPT_VERBOSE | SKUTEČNÝ pro zobrazení dalších informací. Zapíše výstup do streamu STDERR, nebo soubor určený parametrem CURLOPT_STDERR. |
U následujících hodnot parametru volby musí být parametr value typu celé číslo:
Parametr | Nastavte hodnotu hodnoty | Poznámky |
---|---|---|
CURLOPT_BUFFERSIZE | Velikost vyrovnávací paměti použité pro každé čtení. Neexistuje však žádná záruka, že tento požadavek bude dokončen. | Přidáno v cURL 7.10. |
CURLOPT_CLOSEPOLICY | Jedna z konstant CURLCLOSEPOLICY_*.
|
Odstraněno v PHP 5.6.0. |
CURLOPT_CONNECTTIMEOUT | Počet sekund čekání při pokusu o připojení. Chcete-li čekat neomezeně, použijte 0. | |
CURLOPT_CONNECTTIMEOUT_MS | Počet milisekund, které se mají čekat při pokusu o připojení. Chcete-li čekat neomezeně, použijte 0. Pokud je libcurl zkompilován pomocí systémového standardního překladače názvů, pak připojení bude stále používat celou sekundu čekání jako časový limit, s minimálním povoleným časovým limitem 1 sekunda. | Přidáno ve verzi cURL 7.16.2. Dostupné od PHP 5.2.3. |
CURLOPT_DNS_CACHE_TIMEOUT | Počet sekund, po které jsou záznamy DNS uloženy v paměti. Ve výchozím nastavení je tento parametr 120 (2 minuty). | |
CURLOPT_FTPSSLAUTH | Metoda ověřování FTP (v aktivním režimu): CURLFTPAUTH_SSL(nejprve se kontroluje SSL), CURLFTPAUTH_TLS(nejprve zkontrolováno TLS) popř CURLFTPAUTH_DEFAULT(cURL se rozhodne samo). | Přidáno ve verzi cURL 7.12.2. |
CURLOPT_HTTP_VERSION | CURL_HTTP_VERSION_NONE (ve výchozím nastavení CURL vybere, kterou verzi použít), CURL_HTTP_VERSION_1_0 (vynutit HTTP/1.0) nebo CURL_HTTP_VERSION_1_1 (vynutit HTTP/1.1). | |
CURLOPT_HTTPAUTH |
Můžete použít bitový operátor | (nebo) kombinovat několik metod dohromady. V tomto případě cURL požádá server o podporované metody autorizace a vybere tu nejlepší. 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čekávaná velikost souboru v bajtech při nahrávání souboru na vzdálený server. Upozorňujeme, že použití této možnosti nezastaví odesílání dalších dat nad tuto hodnotu, protože odeslaná data závisí na výsledku CURLOPT_READFUNCTION. | |
CURLOPT_LOW_SPEED_LIMIT | Horní práh rychlosti přenosu dat v bajtech za sekundu. Ověření probíhá uvnitř CURLOPT_LOW_SPEED_TIME sekund, po kterých PHP považuje přenos za příliš pomalý a přeruší jej. | |
CURLOPT_LOW_SPEED_TIME | Maximální počet sekund, během kterých nesmí přenosová rychlost překročit CURLOPT_LOW_SPEED_LIMIT, jinak PHP označí přenos jako příliš pomalý a zastaví ho. | |
CURLOPT_MAXCONNECTS | Maximální počet trvalých připojení. Po dosažení limitu se parametr používá k určení, které připojení se má uzavřít. CURLOPT_CLOSEPOLICY. | |
CURLOPT_MAXREDIRS | Maximální počet přijatých přesměrování. Použijte tuto možnost společně s možností CURLOPT_FOLLOWLOCATION. | |
CURLOPT_PORT | Alternativní připojovací port. | |
CURLOPT_POSTREDIR | Bitová maska obsahující 1 (301 trvale přesunuto), 2 (302 nalezeno) a 4 (303 viz jiné), která určuje, zda má být zpracována metoda HTTP POST, když je tato možnost povolena CURLOPT_FOLLOWLOCATION pokud došlo k zadanému typu přesměrování. | Přidáno v cURL 7.19.1. K dispozici od PHP 5.3.2. |
CURLOPT_PROTOCOLS |
Bitová maska hodnot CURLPROTO_*. Tato maska omezuje protokoly používané libcurl. To vám umožní pracovat s libcurl s velkým počtem protokolů a omezit provoz určitých přenosů pouze na jejich podmnožinu. Ve výchozím nastavení používá libcurl všechny podporované protokoly. Viz také parametr CURLOPT_REDIR_PROTOCOLS. Správné hodnoty protokolu: CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_LDAPS, CURLPROTO_TOALLTFPURL, CURLCURLPROTO_TOALLTPURL |
|
CURLOPT_PROXYAUTH | Metody autorizace HTTP používané při připojování k serveru proxy. Použijte stejné bitové masky, které byly popsány pro parametr CURLOPT_HTTPAUTH. V současné době jsou pro autorizaci proxy podporovány pouze CURLAUTH_BASIC a CURLAUTH_NTLM. | Přidáno ve verzi cURL 7.10.7. |
CURLOPT_PROXYPORT | Číslo portu proxy serveru, ke kterému je navázáno připojení. Toto číslo lze také nastavit pomocí parametru CURLOPT_PROXY. | |
CURLOPT_PROXYTYPE | Buď CURLPROXY_HTTP (výchozí) nebo CURLPROXY_SOCKS5 . | Přidáno v cURL 7.10. |
CURLOPT_REDIR_PROTOCOLS | Bitová maska hodnot CURLPROTO_*. Tato bitová maska omezuje protokoly používané libcurl při přesměrování (s povoleným parametrem CURLOPT_FOLLOWLOCATION). To umožňuje omezit sadu protokolů používaných při přesměrování pro některé přenosy. Ve výchozím nastavení libcurl podporuje všechny protokoly kromě FILE a SCP. Ve verzích před 7.19.4 bylo přesměrování používáno pro všechny protokoly bez výjimky. Viz také popis parametrů CURLOPT_PROTOCOLS pro seznam konstant s hodnotami protokolu. | Přidáno ve verzi cURL 7.19.4. |
CURLOPT_RESUME_FROM | Posun začátku přenosu v bajtech. | |
CURLOPT_SSL_VERIFYHOST | Pomocí 1 zkontrolujte existenci společného jména v certifikátu SSL. Použijte 2 ke kontrole, zda běžný název existuje a také odpovídá zadanému hostiteli. V bojovém prostředí by hodnota tohoto parametru měla být 2 (ve výchozím nastavení). | Podpora pro hodnotu 1 byla v cURL 7.28.1 odstraněna |
CURLOPT_SSLVERSION | Jedna z konstant 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) popř CURL_SSLVERSION_TLSv1_2 (6). | |
CURLOPT_TIMECONDITION | Metoda interpretace parametrů CURLOPT_TIMEVALUE. Pomocí CURL_TIMECOND_IFMODSINCE vrátíte stránku pouze v případě, že se změnila od doby uvedené v parametru CURLOPT_TIMEVALUE. Pokud nebyla stránka upravena, bude vrácen název "304 nezměněno", což znamená, že parametr CURLOPT_HEADER nainstalovaný v SKUTEČNÝ. Pro opačný efekt použijte CURL_TIMECOND_IFUNMODSINCE. Výchozí hodnota je CURL_TIMECOND_IFMODSINCE. | |
CURLOPT_TIMEOUT | Maximální počet sekund povolený pro provádění funkcí cURL. | |
CURLOPT_TIMEOUT_MS | Maximální počet milisekund povolený pro provádění funkcí cURL. Pokud je libcurl vytvořen pomocí normálního překladače názvů systému, pak toto rozpětí připojení bude stále používat časové limity pro zaokrouhlování sekund, přičemž minimální povolený časový limit je jedna sekunda. | Přidáno ve verzi cURL 7.16.2. Dostupné od PHP 5.2.3. |
CURLOPT_TIMEVALUE | Počet sekund od 1. ledna 1970. Tento čas bude použit parametrem CURLOPT_TIMECONDITION. Ve výchozím nastavení se používá parametr CURL_TIMECOND_IFMODSINCE. | |
CURLOPT_MAX_RECV_SPEED_LARGE | Pokud rychlost stahování překročí tuto hodnotu (uvedenou v bajtech za sekundu) v průměru za celý přenos, stahování se pozastaví, aby se udržela průměrná rychlost nižší nebo rovna tomuto parametru. Ve výchozím nastavení není rychlost omezena. | |
CURLOPT_MAX_SEND_SPEED_LARGE | Pokud nahrávání na server překročí tuto hodnotu (uvedenou v bajtech za sekundu) v průměru během celého přenosu, nahrávání se pozastaví, aby se udržela průměrná rychlost nižší nebo rovna tomuto parametru. Ve výchozím nastavení není rychlost omezena. | Přidáno ve verzi cURL 7.15.5. Dostupné od PHP 5.4.0. |
CURLOPT_SSH_AUTH_TYPES | Bitová maska skládající se z jedné nebo více konstant: CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD. Nainstalujte CURLSSH_AUTH_ANY aby si libcurl vybral jeden z nich nezávisle. | Přidáno v cURL 7.16.1. |
CURLOPT_IPRESOLVE | Umožňuje aplikaci vybrat typ adresy IP, se kterou je určen název hostitele. To je nutné, pokud používáte název hostitele, který je odvozen z více než jedné verze adresy IP. Možné hodnoty mohou být CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6 a ve výchozím nastavení CURL_IPRESOLVE_WHATEVER. | Přidáno v cURL 7.10.8. |
U následujících hodnot parametru volby musí být parametr value typu tětiva:
Parametr | Nastavte hodnotu hodnoty | Poznámky |
---|---|---|
CURLOPT_CAINFO | Název souboru obsahujícího jeden nebo více certifikátů, proti kterým budou uzly kontrolovány. Tento parametr má smysl pouze při použití ve spojení s CURLOPT_SSL_VERIFYPEER. | Vyžaduje absolutní cestu. |
CURLOPT_CAPATH | Adresář obsahující několik certifikátů CA. Použijte tuto možnost ve spojení s CURLOPT_SSL_VERIFYPEER. | |
CURLOPT_COOKIE | Obsah záhlaví "Cookie:", použitý v požadavku HTTP. Upozorňujeme, že více souborů cookie je odděleno středníkem následovaným mezerou (např. ovoce=jablko; barva=červená") | |
CURLOPT_COOKIEFILE | Název souboru obsahujícího soubory cookie. Tento soubor musí být ve formátu Netscape nebo jednoduše hlavičky HTTP zapsané do souboru. Pokud je jako název souboru předán prázdný řetězec, soubory cookie se neuloží, ale jejich zpracování bude stále povoleno. | |
CURLOPT_COOKIEJAR | Název souboru, do kterého budou uloženy všechny interní cookies aktuálního přenosu po zavření handle, například po zavolání curl_close. | |
CURLOPT_CUSTOMREQUEST | Místo toho byla použita metoda vlastního požadavku "DOSTAT" nebo "HLAVA" při vytváření požadavku HTTP. To je užitečné pro dotazy "VYMAZAT" nebo jiné, vzácnější požadavky HTTP. Správný význam by měla slova jako "DOSTAT", "POŠTA", "PŘIPOJIT" a tak dále; těch. Nezadávejte zde celý řádek požadavku HTTP. Například indikace "ZÍSKAT /index.html HTTP/1.0\r\n\r\n" bude špatně.
|
|
CURLOPT_EGDSOCKET | Jako CURLOPT_RANDOM_FILE, kromě toho, že název souboru je nastaven na socket Entropy Gathering Daemon. | |
CURLOPT_ENCODING | Obsah záhlaví "Accept-Encoding:". To umožňuje dekódování požadavku. Podporovaná kódování jsou "identita", "vypustit" A "gzip". Pokud je předán prázdný řetězec, "" , je odeslána hlavička obsahující všechny podporované typy kódování. | Přidáno v cURL 7.10. |
CURLOPT_FTPPORT | Hodnota, která bude použita k určení adresy IP pro příkaz FTP "PORT". Příkaz "PORT" sdělí serveru, ke které IP adrese se má připojit. Může to být IP adresa, název hostitele, název síťového rozhraní (v Unixu) nebo jednoduše "-" pro použití výchozí systémové IP adresy. | |
CURLOPT_INTERFACE | Název síťového rozhraní, které se má použít. Může to být název rozhraní, adresa IP nebo název hostitele. | |
CURLOPT_KEYPASSWD | Pro použití soukromého klíče je vyžadováno heslo CURLOPT_SSLKEY nebo CURLOPT_SSH_PRIVATE_KEYFILE. | Přidáno v cURL 7.16.1. |
CURLOPT_KRB4LEVEL | Úroveň zabezpečení KRB4 (Kerberos 4). Každá z následujících hodnot (v pořadí od nejslabší po nejsilnější) je správná: "Průhledná", "bezpečný", "důvěrné", „soukromé“.. Pokud se zadaný řetězec liší od zadaných hodnot, použije se hodnota "soukromý". Nastavení této možnosti na NULA zcela deaktivuje zabezpečení KRB4. V tuto chvíli zabezpečení KRB4 funguje pouze s FTP transakcemi. | |
CURLOPT_POSTFIELDS | Všechna data přenášená v požadavku HTTP POST. Chcete-li přenést soubor, zadejte před název souboru @ a také použijte úplnou cestu k souboru. Typ souboru lze také určit pomocí formátu " ;type=mimetype" za názvem souboru. Tento parametr lze předat jako řetězec zakódovaný v adrese URL, například " para1=val1¶2=val2&...", a ve formě pole, jehož klíče budou názvy polí a hodnoty budou jejich obsahem. Pokud je hodnota pole, záhlaví Typ obsahu bude nastaveno na multipart/form-data. Počínaje PHP 5.2.0 při přenosu souborů s prefixem @ , hodnota musí být pole. Od PHP 5.5.0 prefix @ je zastaralé a soubory lze odesílat pomocí CURLFile. Předpona @ lze deaktivovat a povolit hodnoty začínající na @ nastavením možnosti CURLOPT_SAFE_UPLOAD ve smyslu SKUTEČNÝ. | |
CURLOPT_PROXY | HTTP proxy, přes kterou budou požadavky směrovány. | |
CURLOPT_PROXYUSERPWD | Přihlašovací jméno a heslo napsané ve formuláři ":" , který se používá při připojení přes proxy. | |
CURLOPT_RANDOM_FILE | Název souboru použitý k inicializaci generátoru náhodných čísel pro SSL. | |
CURLOPT_RANGE | Rozsah dat ke stažení ve formátu "X-Y" a buď X nebo Y mohou být vynechány. Protokol HTTP také podporuje přenos více rozsahů oddělených čárkami, jsou uvedeny ve formátu "X-Y,N-M". | |
CURLOPT_REFERER | Obsah záhlaví "Referrer:", který bude použit v požadavku HTTP. | |
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 | Řetězec obsahující 32 hexadecimálních číslic. Řetězec musí být kontrolní součet MD5 veřejného klíče vzdáleného počítače a libcurl resetuje připojení ke vzdálenému hostiteli, dokud se kontrolní součet neshoduje s veřejným klíčem. Tato možnost je pouze pro přenos dat pomocí SCP a SFTP. | Přidáno v cURL 7.17.1. |
CURLOPT_SSH_PUBLIC_KEYFILE | Název souboru pro váš veřejný klíč. Není-li zadán, libcurl se jako výchozí použije soubor $HOME/.ssh/id_dsa.pub, pokud je nastavena proměnná prostředí HOME, a soubor "id_dsa.pub" v aktuálním adresáři, pokud není nastavena proměnná prostředí HOME. | Přidáno v cURL 7.16.1. |
CURLOPT_SSH_PRIVATE_KEYFILE | Název souboru pro váš soukromý klíč. Není-li zadán, libcurl se jako výchozí použije soubor $HOME/.ssh/id_dsa, pokud je nastavena proměnná prostředí HOME, a soubor "id_dsa" v aktuálním adresáři, pokud není nastavena proměnná prostředí HOME. Pokud je soubor chráněn heslem, nastavte heslo pomocí CURLOPT_KEYPASSWD. | Přidáno v cURL 7.16.1. |
CURLOPT_SSL_CIPHER_LIST | Seznam šifer používaných při přenosech SSL. Například, RC4-SHA A TLSv1 jsou platné seznamy šifer. | |
CURLOPT_SSLCERT | Název souboru se správně naformátovaným certifikátem PEM. | |
CURLOPT_SSLCERTPASSWD | Pro použití certifikátu je vyžadováno heslo CURLOPT_SSLCERT. | |
CURLOPT_SSLCERTTYPE | Formát certifikátu. Podporované formáty "PEM"(výchozí), "DER" A "ENG". | Přidáno ve verzi cURL 7.9.3. |
CURLOPT_SSLENGINE | ID šifrovacího stroje pro soukromý klíč SSL zadaný v parametru CURLOPT_SSLKEY. | |
CURLOPT_SSLENGINE_DEFAULT | Identifikátor šifrovacího mechanismu používaného pro operace asymetrického šifrování. | |
CURLOPT_SSLKEY | Název souboru soukromého klíče SSL. | |
CURLOPT_SSLKEYPASSWD | Tajné heslo požadované pro použití soukromého klíče SSL určeného parametrem CURLOPT_SSLKEY.
|
|
CURLOPT_SSLKEYTYPE | Typ soukromého klíče SSL zadaný v parametru CURLOPT_SSLKEY. Podporovány jsou následující typy klíčů: "PEM"(výchozí), "DER" A "ENG". | |
CURLOPT_URL | URL ke stažení. Tento parametr lze také nastavit při inicializaci relace pomocí curl_init(). | |
CURLOPT_USERAGENT | Obsah záhlaví "User-Agent: ", odeslané v požadavku HTTP. | |
CURLOPT_USERPWD | Přihlašovací jméno a heslo používané během připojení, zadané ve formátu ":" . |
U následujících hodnot parametru volby musí být parametr value pole:
Parametr | Nastavte hodnotu hodnoty | Poznámky |
---|---|---|
CURLOPT_HTTP200ALIASES | Pole odpovědí HTTP 200, které budou považovány spíše za správné než chybné. | Přidáno ve verzi cURL 7.10.3. |
CURLOPT_HTTPHEADER | Pole nastavených HTTP hlaviček ve formátu pole("Content-type: text/plain", "Content-length: 100") | |
CURLOPT_POSTQUOTE | Pole FTP příkazů spuštěných na serveru po dokončení požadavku FTP. | |
CURLOPT_QUOTE | Pole FTP příkazů spuštěných na serveru před odesláním požadavku FTP. |
U následujících hodnot parametru volby musí být parametr value popisovač proudu (vrácený například funkcí fopen()):
Parametr | Nastavte hodnotu hodnoty |
---|---|
CURLOPT_FILE | Soubor, do kterého bude zapsán výsledek přenosu. Výchozí výstupní proud STDOUT(okno prohlížeče). |
CURLOPT_INFILE | Soubor, ze kterého mají být načtena data při nahrávání na server. |
CURLOPT_STDERR | Alternativní chybový výstupní soubor použitý namísto chybového proudu STDERR. |
CURLOPT_WRITEHEADER | Soubor, do kterého budou zapsány hlavičky aktuální operace. |
U následujících hodnot parametru volby musí být parametr value platný název funkce nebo uzávěrka:
Parametr | Nastavte hodnotu hodnoty |
---|---|
CURLOPT_HEADERFUNCTION | Funkce zpětného volání má dva parametry. První parametr je handle cURL, druhý parametr je řetězec obsahující hlavičky, které se mají zapsat. Záhlaví musí být zapsáno pomocí této funkce zpětného volání. Měl by vrátit počet zapsaných bajtů. |
CURLOPT_PASSWDFUNCTION | Funkce zpětného volání má tři parametry. První parametr je popisovač cURL, druhý parametr je řetězec výzvy k zadání hesla a třetí parametr je maximální délka hesla. Měl by vrátit řetězec obsahující heslo. |
CURLOPT_PROGRESSFUNCTION |
Funkce zpětného volání má pět parametrů. První je deskriptor cURL, druhý je celkový počet bajtů očekávaných ke stažení ze serveru, třetí je počet již stažených bajtů, čtvrtý je celkový počet bajtů, které mají být odeslány na server a pátý je počet již odeslaných bajtů.
Pro zrušení převodu můžete vrátit nenulovou hodnotu. V tomto případě se zobrazí chyba CURLE_ABORTED_BY_CALLBACK. |
CURLOPT_READFUNCTION | Funkce zpětného volání má tři parametry. První parametr je handle cURL, druhý parametr je zdroj streamu předaný cURL přes volbu CURLOPT_INFILE a třetím parametrem je maximální povolené množství dat ke čtení. Funkce zpětného volání musí vracet řetězec o délce ne větší než požadované množství dat, obvykle čtením z předávaného zdroje streamování. Měl by vrátit prázdný řetězec, aby signalizoval konec souboru EOF. |
CURLOPT_WRITEFUNCTION | Funkce zpětného volání má dva parametry. První parametr je handle cURL a druhý parametr je řetězec obsahující data, která mají být zapsána. Pomocí této funkce je nutné ukládat data. Musí vrátit přesný počet zapsaných bajtů, jinak bude stahování přerušeno s chybou. |
Další významy:
Návratové hodnoty
Návraty SKUTEČNÝ po úspěšném absolvování popř NEPRAVDIVÉ v případě chyby.
Seznam změn
Verze | Popis |
---|---|
5.6.0 | Volba CURL_SAFE_UPLOAD nyní má výchozí hodnotu SKUTEČNÝ. |
5.6.0 | Odebrána možnost CURLOPT_CLOSEPOLICY a související významy. |
5.5.0 | Zdroj cURL je přidán jako první argument funkce zpětného volání CURLOPT_PROGRESSFUNCTION. |
5.5.0 | Přidána možnost CURLOPT_SHARE. |
5.3.0 | Přidána možnost CURLOPT_PROGRESSFUNCTION. |
5.2.10 | Přidány možnosti CURLOPT_PROTOCOLS A CURLOPT_REDIR_PROTOCOLS. |
5.1.0 | Přidány možnosti CURLOPT_AUTOREFERER, CURLOPT_BINARYTRANSFER, CURLOPT_FTPSSLAUTH, CURLOPT_PROXYAUTH A CURLOPT_TIMECONDITION. |
5.0.0 | Přidány možnosti CURLOPT_FTP_USE_EPRT, CURLOPT_NOSIGNAL, CURLOPT_UNRESTRICTED_AUTH, CURLOPT_BUFFERSIZE, CURLOPT_HTTPAUTH, CURLOPT_PROXYPORT, CURLOPT_PROXYTYPE, CURLOPT_SSLCERTTYPE A CURLOPT_HTTP200ALIASES. |
Příklady
Příklad č. 1 Inicializace relace CURL a načtení webové stránky
// vytvořit nový zdroj cURL /* http://localhost/upload.php: $ch = curl_init(); $data = array("name" => "Foo" , "file" => "@/home/user/test.png" ); Curl_setopt($ch, CURLOPT_URL, "http://localhost/upload.php"); Curl_exec($ch); Výsledek spuštění tohoto příkladu: Pole ( => Foo) Pole ( => Pole ( => test.png => obrázek/png => /tmp/phpcpjNeQ => 0 => 279)) Komentář: Předání pole do CURLOPT_POSTFIELDS zakóduje data jako multipart/form-data, zatímco předání řetězce zakódovaného URL zakóduje data jako application/x-www-form-urlencoded. cURL je nástroj, který umožňuje interakci s různými servery a podporuje mnoho protokolů: HTTP, FTP, TELNET atd. cURL je původně nástroj příkazového řádku. Ale naštěstí pro nás PHP podporuje práci s knihovnou cURL. V tomto článku se podíváme na netriviální příklady práce s cURL. Ve skutečnosti existuje mnoho dalších způsobů, jak odeslat požadavek na jiný server, například načíst obsah stránky. Mnoho lidí, většinou z lenosti, místo cURL používá jednoduché funkce PHP: $obsah = file_get_contents("http://www.example.com"); // nebo $lines = file("http://www.example.com"); // nebo readfile("http://www.example.com"); Neumožňují však efektivní zpracování chyb. Existuje také řada úkonů, které neumí vůbec – například práce s cookies, autorizace, požadavky na odesílání, stahování souborů. cUrl je výkonný nástroj, který podporuje více protokolů a poskytuje kompletní informace o požadavcích. Než přejdeme ke složitým příkladům, podívejme se na základní strukturu cURL požadavku v PHP. Chcete-li provést požadavek cURL v PHP, musíte provést 4 hlavní kroky: V tomto článku se většinou podíváme na krok č. 2, protože tam se děje kouzlo. Seznam možností cURL je velmi rozsáhlý, takže dnes nebudeme zvažovat všechny možnosti, ale použijeme ty, které jsou užitečné pro řešení konkrétních problémů. V případě potřeby můžete ke sledování chyb přidat následující řádky: // ... $output = curl_exec($ch); if ($output === FALSE) ( echo "cURL Error: " . curl_error($ch); ) // ... Upozorňujeme, že místo „==“ používáme „===“, protože Je nutné rozlišovat mezi prázdnou odpovědí serveru a booleovskou hodnotou FALSE, která je vrácena v případě chyby. Dalším volitelným krokem je získání informací o požadavku cURL po jeho provedení. // ... curl_exec($ch); $info = curl_getinfo($ch); echo "Vzalo". $info["total_time"] . "sekundy pro url". $info["url"]; //... V důsledku toho obdržíte pole s následujícími informacemi: V tomto příkladu napíšeme skript, který bude detekovat přesměrování na základě různých nastavení prohlížeče. Některé stránky například přesměrovávají návštěvníky z mobilních zařízení na návštěvníky z jiných zemí. Použijeme možnost CURLOPT_HTTPHEADER k nastavení vlastních záhlaví, včetně User-Agent a Language, a uvidíme, kam nás stránky přesměrují. // URL $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // prohlížeč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 jako Mac OS X; en) AppleWebKit/420+ (KHTML, jako Gecko) Verze/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "francouzš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 jako $url) ( echo "URL: $url\n"; foreach ($browsers jako $test_name => $browser) ( $ch = curl_init(); // nastavení adresy curl_setopt($ch, CURLOPT_URL , $url); // označte používaný prohlížeč a jazyk curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["jazyk" ]) ")); // nepotřebujeme obsah stránky curl_setopt($ch, CURLOPT_NOBODY, 1); // potřebujeme pouze záhlaví curl_setopt($ch, CURLOPT_HEADER, 1); // místo toho vrátí výsledek jeho výstupu curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); $output = curl_exec($ch); curl_close($ch); // definovat přesměrování v HTTP hlavičkách? if (preg_match("!Umístění: (.*)!" , $output, $matches)) ( echo "$test_name: přesměruje na $matches\n"; ) else ( echo "$test_name: žádné přesměrování\n"; ) ) echo "\n\n"; ) Ve smyčce kontrolujeme prohlížeče pro každou adresu URL. Nejprve nastavíme možnosti pro náš požadavek: URL a prohlížeč a jazyk, který se má testovat. Protože Nastavili jsme speciální volbu, výsledek požadavku bude obsahovat pouze HTTP hlavičky. Pomocí jednoduchého regulárního výrazu můžeme zkontrolovat, zda odpověď obsahuje řetězec "Location:". Výsledek spuštění skriptu: URL: http://www.cnn.com standardní: přesměruje na http://edition.cnn.com/ iphone: přesměruje na http://edition.cnn.com/ Francouzština: přesměruje na http://edition.cnn .com/ URL: http://www.mozilla.com standard: přesměruje na https://www.mozilla.org/firefox/ iphone: přesměruje na https://www.mozilla.org/firefox/ french: přesměruje na https://www.mozilla.org/firefox/ URL: http://www.facebook.com standard: přesměruje na https://www.facebook.com/ iphone: přesměruje na http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr Francouzština: žádné přesměrování Při provádění požadavků GET lze data předávat v řetězci dotazu. Když například vyhledáváte na Googlu, váš dotaz je přeložen do adresy URL: http://www.google.com/search?q=google K získání výsledku tohoto dotazu nepotřebujete ani cURL, můžete být líní a použít "file_get_contents()". Některé formuláře HTML však používají metodu POST. V tomto případě jsou data odeslána v těle zprávy požadavku spíše než v samotné URL. Pojďme napsat skript, který bude odesílat požadavky POST. Nejprve si vytvořte jednoduchý PHP soubor, který bude tyto požadavky přijímat a vracet do něj odeslaná data. Říkejme tomu post_output.php : $url = "http://localhost/post_output.php"; $post_data = pole ("foo" => "bar", "query" => "FooBar", "action" => "Odeslat"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // vytvoření požadavku POST curl_setopt($ch, CURLOPT_POST, 1); // přidání dat curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $výstup; Tento skript vypíše: Pole ( => pruh => FooBar => Odeslat) Tento skript odeslal požadavek POST do souboru post_output.php. který vypsal obsah pole $_POST a tuto odpověď jsme obdrželi pomocí cURL. Stejně jako v předchozím příkladu vytvořte soubor, který bude přijímat požadavky, upload_output.php : Print_r($_FILES); A samotný skript, který stahuje soubory: $url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar", // soubor k nahrání "upload" => "@/tmp/desert.jpg"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $výstup; Pokud chcete nahrát soubor, vše, co musíte udělat, je předat k němu cestu, stejně jako normální parametr požadavku POST, s předponou „@“. Výsledek skriptu: Pole ( => Pole ( => poušť.jpg => aplikace/oktet-stream => /tmp/phpAhEvXy => 0 => 845941)) Jednou z pokročilých funkcí cURL v PHP je schopnost provádět více požadavků současně a asynchronně. Za normálních podmínek se skript zastaví a čeká na dokončení požadavku. A pokud potřebujete provést mnoho dotazů, může to trvat hodně času, protože... budete provádět postupně. Toto omezení lze obejít: // vytvoření handlerů $ch1 = curl_init(); $ch2 = curl_init(); // nastavení voleb 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); //vytvoření vícenásobného cURL handle $mh = curl_multi_init(); // přidání handlerů curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $běží = null; // vykonání požadavků do ( curl_multi_exec($mh, $running); ) while ($running > 0); // uvolní zdroje curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh); Myšlenka je taková, že můžete vytvořit více úchytů cURL, zkombinovat je do jednoho více úchytu a spouštět je asynchronně. Nejprve je vše stejné jako u běžného požadavku cURL – vytvoří se deskriptor ( curl_init()
), parametry jsou nastaveny ( curl_setopt()
). Dále je vytvořen multideskriptor ( curl_multi_init()
) a jsou přidány dříve vytvořené běžné deskriptory ( curl_multi_add_handle()
). Místo normálního volání curl_exec() zavoláme curl_multi_exec()
tato funkce nás informuje o počtu aktivních spojení pomocí druhého parametru - $running. Cyklus tedy běží, dokud se $running nestane rovným 0. A samozřejmě po dokončení práce je nutné uvolnit zdroje. V tomto příkladu jednoduše vypíšeme výsledek dotazů do STDOUT. Uvažujme netriviální případ použití multi cURL. Představte si blog se spoustou příspěvků obsahujících odkazy na externí stránky. Některé z těchto odkazů nemusí fungovat. Pojďme napsat skript, který najde všechny nefunkční odkazy a ukáže nám je. Nejprve musíme stáhnout všechny externí odkazy z databáze: // CONFIG $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "site"); $max_connections = 10; $url_list = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $aktivní = null; // připojení k MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Nelze se připojit: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Mohl not select db: " . mysql_error()); ) // vzít všechny příspěvky s odkazy v textu $q = "VYBRAT post_content FROM wp_posts WHERE 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)) ( // shromáždit všechny odkazy pomocí regulárního výrazu if (preg_match_all("/href=\"(.*?)\"/", $d["post_content"], $matches )) ( foreach ($odpovídá $url) ( // odfiltrování nepotřebných domén $tmp = parse_url($url); if (isset($tmp["host"]) && in_array($tmp["host"], $ exclusive_domains)) ( pokračovat; ) // dát dohromady $url_list = $url; ) ) ) // odstranit opakování $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Žádná adresa URL ke kontrole"); ) V této části skriptu jednoduše vytáhneme všechny externí odkazy z databáze. Pojďme je zkontrolovat: $mh = curl_multi_init(); // 1. přidejte odkazy pro ($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 "==Mrtvé adresy URL==\n"; echo implode("\n", $dead_urls) . "\n\n"; echo "==404 URL==\n"; echo implode("\n", $not_found_urls) . "\n\n"; echo "==Pracovní adresy URL==\n"; echo implode("\n", $working_urls); echo "\n\n"; // 9. přidá handle s danou URL funkcí add_url_to_multi_handle($mh, $url_list) ( static $index = 0; // pokud jsou ještě odkazy if (isset($url_list[$index])) ( // vše je jako obvykle $ ch = curl_init(); // nastavit možnosti curl_setopt($ch, CURLOPT_URL, $url_list[$index]); // vrátit místo zobrazení výsledku curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // povolit přesměruje curl_setopt($ ch, CURLOPT_FOLLOWLOCATION, 1); // získáte pouze záhlaví, abyste ušetřili čas curl_setopt($ch, CURLOPT_NOBODY, 1); // přidejte do víceovládacího prvku curl_multi_add_handle($mh, $ch); $index++; ) ) Podívejme se na kód podrobněji (číslování odpovídá komentářům v kódu): Spustíme skript: Mrtvé adresy URL== xample1234.com/ ==404 URL== www.google.com/dsfasdfafd ==Fungující 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 kodex. 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. Spuštěním 10 vláken současně se výkon zvýší 10krát ve srovnání s běžnými požadavky cURL. Chcete-li získat obsah odpovědi serveru, použijte funkci curl_multi_getcontent($ch)
, kde $ch je deskriptor získaný z curl_multi_info_read()
. Pokud požadavek HTTP vyžaduje ověření, použijte následující kód: $url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // odeslání uživatelského jména a hesla curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // pokud jsou povolena přesměrování curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // cURL odešle heslo po přesměrování curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch); PHP má vlastní knihovnu pro práci s FTP, ale můžete také použít cURL: // přečtení souboru $file = fopen("/cesta/k/souboru", "r"); // url již obsahuje potřebné údaje $url = "ftp://username: [e-mail chráněný]:21/cesta/k/novému/souboru"; $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, velikost souboru("/cesta/k/souboru")); curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ ch); curl_close($ch); Žádosti lze podávat prostřednictvím konkrétního proxy: $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"); // pokud je vyžadována autorizace curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); curl_close($ch); Je možné použít zpětná volání, zatímco požadavek běží, aniž byste čekali na jeho dokončení. Například během stahování odpovědi serveru můžeme použít již přijatá data, aniž bychom čekali na úplné stažení. $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://example.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"funkce_progresu"); curl_exec($ch); curl_close($ch); function progress_function($ch,$str) ( echo $str; return strlen($str); ) Funkce zpětného volání musí vrátit délku řetězce, aby požadavek fungoval správně. Pokaždé, když je přijata další část odpovědi serveru, bude zavoláno zpětné volání. V tomto článku jsme se podívali na pokročilé funkce cURL v PHP. Až budete příště potřebovat požadavky na adresy URL, použijte cURL. Často musíme stahovat různé soubory z internetu, například soubory spustitelných programů, soubory skriptů, zdrojové archivy. To však není vždy nutné provádět prostřednictvím prohlížeče. V mnoha situacích je mnohem jednodušší provádět všechny akce prostřednictvím terminálu. Protože tímto způsobem můžete proces automatizovat. Na druhou stranu webmasteři musí čas od času testovat dostupnost webu, kontrolovat odeslané a přijaté hlavičky a mnoho dalšího. Chcete-li vyřešit takové problémy a problémy podobného rozsahu, můžete použít nástroj curl. Umožňuje vám řešit mnohem širší škálu problémů, včetně simulace uživatelských akcí na webu. V tomto článku se podíváme na to, jak používat curl, co to je a proč je tento program potřebný. Curl je ve skutečnosti více než jen nástroj příkazového řádku pro Linux nebo Windows. Jedná se o sadu knihoven, které implementují základní možnosti práce s URL stránkami a přenos souborů. Knihovna podporuje práci s protokoly: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, dále POP3, IMAP a SMTP. Je skvělý pro simulaci uživatelských akcí na stránkách a dalších operací s URL. Podpora knihovny curl byla přidána do mnoha různých programovacích jazyků a platforem. Obslužný program curl je nezávislý obal pro tuto knihovnu. Právě na tuto utilitu se zaměříme v tomto článku. Než přejdeme k popisu toho, jak lze použít příkaz curl linux, podívejme se na samotný nástroj a jeho hlavní možnosti, které budeme potřebovat. Syntaxe nástroje je velmi jednoduchá: $ odkaz možnosti curl Nyní se podívejme na hlavní možnosti: V žádném případě to nejsou všechny možnosti pro curl linux, ale jsou zde uvedeny základy, které budete muset použít. Probrali jsme vše, co souvisí s teorií práce s utilitou curl, nyní je čas přejít k praxi a podívat se na příklady příkazu curl. Nejčastější úkol je tento. Stažení souboru je velmi jednoduché. Chcete-li to provést, stačí předat název souboru nebo html stránku obslužnému programu v parametrech: curl https://raw.githubusercontent.com/curl/curl/master/README.md Zde vás ale čeká jedno překvapení: celý obsah souboru bude odeslán na standardní výstup. Chcete-li jej zapsat do libovolného souboru, použijte: curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md A pokud chcete, aby se výsledný soubor jmenoval stejně jako soubor na serveru, použijte volbu -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 případě potřeby můžete jedním příkazem stáhnout několik souborů: curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README Další věc, která může být pro správce užitečná, je stáhnout soubor pouze v případě, že byl změněn: curl -z 21-Dec-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README Rychlost stahování můžete omezit na požadovaný limit, abyste nepřetěžovali síť pomocí volby -Y: curl --limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz Zde musíte zadat počet kilobajtů za sekundu, které lze stáhnout. Pokud rychlost nestačí, můžete také ukončit připojení, použijte volbu -Y: curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md curl -T login.txt ftp://speedtest.tele2.net/upload/ Nebo zkontrolujte, zda je soubor odeslán přes HTTP; na to existuje speciální služba: curl -T ~/login.txt http://posttestserver.com/post.php V odpovědi vám obslužný program sdělí, kde můžete stažený soubor najít. Metodou POST můžete odesílat nejen soubory, ale i jakákoli data. Připomínám, že tento způsob se používá k odesílání dat různých forem. K odeslání takového požadavku použijte volbu -d. Pro testování použijeme stejnou službu: curl -d "pole1=val&fileld2=val1"http://posttestserver.com/post.php Pokud nejste spokojeni s touto možností odeslání, můžete předstírat odeslání formuláře. Existuje možnost -F: curl -F "password=@pass;type=text/plain" http://posttestserver.com/post.php Zde předáme pole hesla s formulářem jako prostý text, stejným způsobem můžete předat několik parametrů. Cookies používají webové stránky k ukládání určitých informací na straně uživatele. To může být nezbytné například pro autentizaci. Cookies můžete odesílat a přijímat pomocí curl. Chcete-li uložit přijaté soubory cookie do souboru, použijte volbu -c: curl -c cookie.txt http://posttestserver.com/post.php Pak můžete poslat cookie curl zpět: curl -b cookie.txt http://posttestserver.com/post.php Ne vždy nutně potřebujeme obsah stránky. Někdy mohou být zajímavé jen titulky. Chcete-li zobrazit pouze je, existuje možnost -I: curl -I https://site A volba -H vám umožňuje odeslat několik nebo více na server, například můžete předat záhlaví If-Modified-Since, takže stránka bude vrácena pouze v případě, že byla změněna: Pokud server vyžaduje jeden z běžných typů autentizace, jako je HTTP Basic nebo FTP, pak curl zvládne tento úkol velmi snadno. Chcete-li zadat podrobnosti ověřování, jednoduše je zadejte oddělené dvojtečkou ve volbě -u: curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt Autentizace na HTTP serverech bude probíhat stejným způsobem. Pokud potřebujete ke stahování souborů použít proxy server, je to také velmi jednoduché. Stačí zadat adresu proxy serveru ve volbě -x: curl -x proxysever.test.com:3128 http://google.co.in V tomto článku jsme se podívali na to, jak používat curl, proč je tento nástroj potřebný a jeho hlavní možnosti. Navzdory jejich podobnosti jsou velmi odlišné. Příkaz curl linux je navržen spíše pro analýzu a simulaci různých akcí na serveru, zatímco wget je vhodnější pro stahování souborů a procházení stránek. Tento článek bude hovořit o tak silném nástroji, jako je cURL, a také o knihovně pro PHP, která poskytuje přístup k tomuto nástroji - libcurl. K čemu to všechno je? Chcete-li komunikovat se serverem pomocí protokolů přenosu dat, například http nebo ftp. Zbytek protokolů nás nijak zvlášť nezajímá, pokud se chce někdo do tohoto tématu ponořit hlouběji, bude muset vyhrabat anglicky psané zdroje a základy a příklady použití bude obsahovat tento článek. Knihovna libcurl nám tedy poskytuje možnost přenášet data na server a přijímat od něj odpovědi. Co nám to dává? Schopnost emulovat chování uživatele nebo ! Můžete přijímat obsah stránek pro následnou analýzu, můžete přijímat hlavičky odpovědí služby a programově se přihlašovat na stránky, vytvářet skripty pro odesílání zpráv (například na Twitter nebo na fórech) nebo informací. Vše je omezeno pouze vaší fantazií! První věc, kterou musíme udělat, je nainstalovat knihovnu. Na svém lokálním počítači používám sestavení Denwer, jako naprostá většina začínajících webmasterů, kterým je článek určen. Zkušení uživatelé, kteří si samostatně nainstalují kombinaci php+apache+mysql, budou moci nainstalovat cURL, není na mně, abych jim vysvětloval, jak se to dělá;) A my, začátečníci, používáme hotová řešení, abychom to usnadnili. Proto nainstalujte libcurl následovně: a odstraňte středník na začátku pojmů: ;přípona=php_curl.dll Připraven. Chcete-li zkontrolovat funkčnost knihovny, můžete zavolat funkci phpinfo() a najít tam řádek: podpora cURL povolena. Gratuluji k prvnímu vítězství. Chcete-li začít pracovat s nástrojem, je třeba jej inicializovat. To se provádí následovně: $ch = curl_init(); Použili jsme funkci inicializace relace cURL. V tomto případě můžete adresu URL nastavit hned, takto: $ch = curl_init("https://site"); A můžete to udělat později v možnostech. Na pořadí, ve kterém jsou doplňky instalovány, nezáleží. To se provádí další funkcí: Curl_setopt (zdroj ch, možnost řetězce, smíšená hodnota) První parametr této funkce, tedy resource ch, jsme již vytvořili hned výše, ale existuje spousta parametrů možností a hodnot. Myslím, že byste je sem neměli všechny kopírovat a vkládat, ale stačí dát odkaz na podrobný popis funkce, doufám, že se nikdo neurazí: curl_setopt. Uvedu příklad možností nastavení pomocí adresy URL jako příklad: $url = "https://stránka"; curl_setopt($ch, CURLOPT_URL,$url); Několik dalších příkladů možností nastavení: pojďme získat záhlaví odpovědi serveru, aniž bychom získali samotnou stránku: Curl_setopt($ch, CURLOPT_HEADER, 1); // přečtení hlavičky curl_setopt($ch, CURLOPT_NOBODY, 1); // čtení POUZE záhlaví bez těla Takže jsme inicializovali relaci, nastavili parametry, které potřebujeme, nyní provedeme výsledný požadavek, zavřeme relaci a zobrazíme výsledek: $vysledek = curl_exec($ch); curl_close($ch); echo $výsledek; Výsledkem je náš první plně funkční příklad použití knihovny libcurl: $ch = curl_init(); $url = "https://stránka"; curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 1); // přečtení hlavičky curl_setopt($ch, CURLOPT_NOBODY, 1); // přečte POUZE hlavičku bez těla $result = curl_exec($ch); curl_close($ch); echo $výsledek; Jak to funguje, je doufám jasné, protože jsme se podívali na každý krok zvlášť :) Výsledkem je, že ze serveru obdržíme hlavičku HTTP odpovědi, kterou určitě analyzujeme níže, abychom lépe porozuměli všem fázím interakce mezi prohlížeč a server: HTTP/1.1 200 OK Server: nginx/1.2..php 1 Báječný! Obdrželi jsme hlavičku odpovědi ze serveru a otestovali knihovnu v akci. Jak je to pro nás užitečné? Protože nyní si můžete zhruba představit sled akcí při práci s cURL: Například jsem se obrátil na stránku ya.ru a podíval se na vygenerovaný požadavek prohlížeče a odpověď přijatou ze serveru. Zde jsou: Věřím, že poté, co jsou některé obecné body již jasné a vše se zdá být jasné, je čas přejít k procvičování a zdokonalování svých dovedností pomocí příkladu. Mě osobně vždy svrbí ruce vše vyzkoušet v praxi :) Protože cURL je pro analyzátory tak dobré, uvažujme funkci získání kódu stránky podle její adresy. V tomto případě bude výstupem pole s názvem, obsahem stránky a dokonce i kódy chyb, pokud se něco pokazí. Funkce get_web_page($url) ( $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 verze/12.14"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // vrátí webovou stránku curl_setopt($ch, CURLOPT_HEADER, 0); // nevrátí záhlaví curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // následuje přesměrování curl_setopt($ch, CURLOPT_ENCODING, ""); // zpracuje všechna kódování curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // uživatelský agent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // vypršení časového limitu připojení curl_setopt($ch, CURLOPT_TIMEOUT, 120); // časový limit odpovědi curl_setopt_MAXIROPT(CURLOPT_URL) , 10); // zastavení po 10. přesměrování $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í parametry: Funkci použijeme například takto: $vysledek = get_web_page("https://ya.ru"); if (($result["errno"] != 0)||($result["http_code"] != 200)) ( echo $result["errmsg"]; ) else ( $page = $result["obsah "]; echo $page; ) Vše by mělo probíhat bez chyb a kód stránky obdržíte v proměnné $page. Pokud se pokusíme získat neexistující stránku yaaaaaaaaaaaa.ru, dostaneme chybu: Nelze vyřešit hostitele: yaaaaaaaaaaaa.ru; Hostitel nenalezen Vše je zpracováno správně a krásně :) JavaScript je ve vašem prohlížeči blokován. Povolte prosím JavaScript, aby stránka fungovala! PHP podporuje libcurl, knihovnu vytvořenou Danielem Stenbergem, která umožňuje připojení k různým typům serverů a protokolů. Tyto funkce byly zavedeny v PHP 4.0.2. curl_init - inicializuje relaci CURL. zdroj curl_init() Funkce curl_init() inicializuje novou relaci a vrátí popisovač CURL pro použití ve funkcích a. Pokud je volitelný parametr url je poskytnuta, pak možnost CURLOPT_URL obdrží hodnotu tohoto parametru. Můžete jej nainstalovat ručně pomocí . curl_setopt - nastavuje možnosti pro přenos/přenos CURL. bool curl_setopt(zdroj ch, možnost řetězce, smíšená hodnota) Funkce curl_setopt() nastavuje možnosti pro relaci CURL identifikovanou parametrem ch. Parametr volba je možnost, kterou chcete nastavit, a hodnota toto je hodnota opce volba . Parametr hodnota musí být dlouhé pro následující možnosti (určené parametrem volba): Parametr hodnota musí být řetězec pro následující hodnoty parametrů volba : Následující možnosti očekávají deskriptor souboru, který se získá pomocí funkce fopen() : Parametr hodnota long write_callback (resource ch, string data)( ... return strlen($data);) volba : Parametr hodnota by měla být funkcí následujícího tvaru řetězec read_callback (resource ch, resource fd, long length)() pro následující hodnoty parametrů volba : curl_exec - provede relaci CURL. bool curl_exec(zdroj ch) Tato funkce by měla být volána poté, co jste inicializovali relaci CURL a všechny možnosti pro tuto relaci již byly nastaveny. Jeho účelem je jednoduše provést předdefinovanou relaci CURL (zadanou v parametru ch). curl_close - zavře relaci CURL. prázdnota curl_close(zdroj ch) Tato funkce zavře relaci CURL a uvolní všechny zdroje. rukojeť CURL ch je také vymazán. curl_errno - vrací celé číslo obsahující poslední číslo chyby. Pokud potřebujete odeslat vícerozměrné pole a soubor v požadavku POST, narazíte na neřešitelný problém. Pokud předáte vícerozměrné pole CURLOPT_POSTFIELDS, bude druhá úroveň předána jako řetězec "Array". Pokud převedete pomocí http_build_query, nebudete moci přenést soubor. Níže je uvedena funkce pro kódování dvourozměrného pole s načítáním souborů pro Curl, která bude fungovat v obou starších verzích PHP 5.3, PHP 5.4 a PHP 5.6. /** převede vícerozměrné pole na jednorozměrné pomocí komplexních indexů a nahradí @ v předponě CurlFile pro použití v Curl * @param $inputArray * @param řetězec $inputKey * @return pole $requestVars = pole ("id" => array( 1, 2,"id"=>1234), "name" => "log", "logfile" => "@/tmp/test.log"); dostaneme: ["id"]=> int(1) ["id"]=> int(2) ["id"]=> int(1234) ["jméno"]=> string(3) "log" [ "logfile"]=> string(13) "/tmp/test.log" ) */ funkce convertToStringArray($inputArray, $inputKey="") ( $resultArray=; foreach ($inputArray jako $klíč => $hodnota ) ( $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, "web"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars)); $res = curl_exec($ch); curl_close($ch); Příklady aplikací použití Curl
$ch = curl_init();
print_r($_POST);
print_r($_FILES);
*/
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
?>
Poznámky
Proč cURL?
Základy cUrl
// 1. inicializace $ch = curl_init(); // 2. nastavení možností, včetně URL curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. provedení požadavku a přijetí odpovědi $output = curl_exec($ch); // 4. čištění zdrojů curl_close($ch); Sledování chyb
Získání informací o požadavku
Sledování přesměrování v závislosti na prohlížeči
Odesílání požadavků POST
Nahrávání souborů
Více cURL
Kontrola externích odkazů ve WordPressu
Další funkce cURL v PHP
HTTP ověřování
Nahrát přes FTP
Pomocí proxy
Funkce zpětného volání
Závěr
příkaz curl
Jak používat curl?
Rychlostní limit
Přenos souborů
Odesílání dat POST
Odesílání a přijímání cookies
Přenos a analýza hlavičky
autentizace curl
Pomocí proxy
závěry
Co přesně jsou cURL a libcurl? Obecné body
Instalace cURL na Denwer (Denver). Jak začít používat libcurl?
Popis cURL a první kroky
Struktura hlavičky HTTP požadavku
Žádost
GET / HTTP/1.1 - Snažíme se získat stránku na /, tedy hlavní stránku umístěnou v kořenovém adresáři složky. Používáme protokol verze 1.1.
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 verze/12.14— Představujeme se serveru, jsme prohlížeč Opera.
Host: ya.ru — Název domény požadovaného zdroje.
Přijmout: text/html, aplikace/xml;q=0.9, aplikace/xhtml+xml, obrázek/png, obrázek/webp, obrázek/jpeg, obrázek/gif, obrázek/x-xbitmap, */*;q=0,1— Seznam přijatelných formátů zdrojů.
Accept-Language: ru-RU,ru;q=0,9,en;q=0,8— Seznam podporovaných jazyků.
Accept-Encoding: gzip, deflate— Podporované metody kódování.
Cookie: yandexuid=ХХХХХ - Cookies, pokud je to nutné.
Připojení: Keep-Alive – Prosím nepřerušujte spojení a zůstaňte v kontaktu.
Odpovědět
HTTP/1.1 200 Ok - Obdržíme odpověď s kódem 200, což znamená, že je vše v pořádku.
Server: nginx - Server se představil - toto je nginx.
Datum: Ne, 10. března 2013 14:10:50 GMT— Aktuální datum a čas na serveru.
Content-Typ: text/html; znaková sada=UTF-8— Typ obsahu a kódování.
Připojení: zavřít - Server s námi nechce udržovat trvalé spojení, proto jej okamžitě uzavře. Pro další požadavek bude vytvořeno nové připojení.
Cache-Control: no-cache,no-store,max-age=0,must-revalidate— Správa mezipaměti. V tomto případě je zakázáno.
Vyprší: Ne, 10. března 2013 14:10:50 GMT— Datum očekávaného ukončení relace. V našem případě se shoduje s otevírací dobou, protože ji server okamžitě zavřel, ihned po zpracování.
Poslední změna: Ne, 10. března 2013 14:10:50 GMT— Čas poslední úpravy.
Content-Encoding: gzip — Metoda kódování informací.
Kompletní seznam všech parametrů, které lze nalézt v hlavičce HTTP požadavku, najdete na Wikipedii.
Nyní máte přibližnou představu o tom, jak spolu váš prohlížeč a webový server komunikují. To je velmi užitečné vědět a pochopit, protože se pokusíme emulovat akce prohlížeče pomocí knihovny libcurl. Pokračuj.Ukázka práce s knihovnou
url — adresa stránky nebo webu.
Hodnoty výstupních parametrů (pole se třemi prvky):
header['errno'] - pokud se něco pokazilo, bude zde kód chyby.
header[‘errmsg’] – zde se objeví chybový text.
header['content'] - skutečná stránka\soubor\obrázek atd.
Poté si můžete s kódem stránky dělat, co chcete, například jej analyzovat pomocí regulárních výrazů. Ale to je v dalších lekcích vše, ale u tohoto se zatím zastavme.Kučera
libcurl aktuálně podporuje protokoly http, https, ftp, gopher, telnet, dict, file a ldap.
libcurl také podporuje HTTPS certifikáty, HTTP POST, HTTP PUT, FTP upload (toto lze provést také pomocí ftp PHP rozšíření), HTTP nahrání na základě formuláře, proxy, cookies a autentizaci uživatele+heslo.curl_init
Popis
curl_setopt
Popis
curl_exec
Popis
curl_close
Popis
curl_errno
Popis
Příklad 1: Inicializace nové relace CURL a načtení webové stránky.
Příklad 2: Použití modulu CURL v PHP k získání example.com
Příklad 3: Kontrola dostupnosti URL pomocí PHP CURL
Příklad 4: Oddělení hlavičky od těla získaného pomocí PHP CURL
Příklad 5: Určení odkazující adresy URL pomocí PHP CURL
problém: curl_setopt($ch,FOLLOW_LOCATION,1); chyba: potíže s open_basedir a safe_mode řešení: funkce již vyvinutá někým řešení n 2: stejná funkce, upravená, pro mě funguje skvěle.= $curl_max_loops) ( $curl_loops = 0; return FALSE; ) curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); seznam($hlavička, $data) = explode("\n\n", $data, 2); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 301 || $http_code == 302) ( $matches = ; preg_match("/Location:(.*?)\n/", $header, $matches); $url = @parse_url(trim (array_pop($matches))); if (!$url) ( //nelze zpracovat adresu URL pro přesměrování na $curl_loops = 0; vrátit $data; ) $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)) ; if (!$url["schéma"]) $url["schéma"] = $poslední_url["schéma"]; if (!$url["host"]) $url["host"] = $poslední_url[ "host"]; if (!$url["cesta"]) $url["cesta"] = $posledni_url["cesta"]; $new_url = $url["schéma"] . "://" . $ url["hostitel"] . $url["cesta"] . ($url["dotaz"]?"?".$url["dotaz"]:""); curl_setopt($ch, CURLOPT_URL, $new_url) ; debug("Přesměrování na", $new_url); return curl_redir_exec($ch); ) else ( $curl_loops=0; return $data; ) ) ?>
stačí použít tuto funkci bez de FOLLOW_LOCATION a měla by fungovat. problém byl v tom, že když se dostanete na řádek, kde vracíte data, pokud byl http_code jiný než 301 oe 302, $data má zastaralé informace nebo žádné. takže $debbbb to udělá. Příklad 6: Analýza souboru cookie z hlavičky pomocí CURL PHP
Někdy nemůžete použít CURLOPT_COOKIEJAR a CURLOPT_COOKIEFILE kvůli nastavení php-settings serveru (Říká se, že pomocí těchto možností můžete získat jakékoli soubory ze serveru). Zde je řešení 1)Nepoužívejte CURLOPT_FOLLOWLOCATION 2)Používejte curl_setopt($ch, CURLOPT_HEADER, 1) 3)Uchopte soubory cookie z hlavičky takto: preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $results); 4)Nastavte je pomocí curl_setopt($ch, CURLOPT_COOKIE, $cookies); Příklad 7: Analýza souboru cookie z hlavičky pomocí CURL PHP
Jak již dříve zmínil Jevgen, někdy nemůžeme použít CURLOPT_COOKIEJAR a CURLOPT_COOKIEFILE. Níže je funkce zpětného volání záhlaví, kterou jsem napsal v lednu a která vám umožňuje udržovat soubory cookie mezi požadavky cURL. Soubory cookie se přidávají do $ch během všech požadavků i během přesměrování, takže můžete použijte jej společně s CURLOPT_FOLLOWLOCATION. Zde je kód: function read_header($ch, $string) ( global $location; #keep track of location/redirects global $cookiearr; #store cookies here global $ch; # ^override the function param $ch # to je v pořádku, protože potřebujeme # aktualizovat globální $ch pomocí # nových souborů cookie $length = strlen($string); if(!strncmp($string, "Location:", 9)) ( #keep track of poslední přesměrování $location = trim(substr($string, 9, -1)); ) if(!strncmp($string, "Set-Cookie:", 11)) ( #get the 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 pouze na konci záhlaví foreach ($cookiearr jako $key=>$value) ( $cookie .= "$key=$value; "; ) curl_setopt ($ ch, CURLOPT_COOKIE, $cookie); ) return $length; ) curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_header"); Tento kód předpokládá, že $ch použijete znovu, aniž byste jej pokaždé inicializovali (zavolejte curl_init pouze jednou, na začátku). Pokud potřebujete v kterémkoli bodě kódu znovu inicializovat $ch, můžete přistupovat k aktuálně uloženým souborům cookie v $cookiearr a zahrnout je do nového $ch. Tuto funkci jsem napsal dříve, než jsem měl dostatek zkušeností s regulárními výrazy, takže zde nenajdete žádná volání preg_match. Tento kód jsem používal poměrně dlouho a bez problémů jsem se dostal na gmail, yahoo, hotmail, aol atd., kde jsem musel projděte přihlášení a několik stránek, než jsem se dostal k tomu, co jsem hledal. Příklad 8: Nastavení obslužného programu načítání záhlaví pomocí CURL PHP
Pomocí cURL jsem potřeboval zavolat skript třetí strany, který vracel binární data jako přílohu, abych znovu předal načtená data jako přílohu. Problém byl v tom, že skript třetí strany občas vracel chyby HTTP a chtěl jsem se v takových případech vyhnout předání přílohy s nulovou délkou. Kombinace použití zpětného volání CURLOPT_FAILONERROR a CURLOPT_HEADERFUNCTION pomohla úhledně zpracovat chyby HTTP skriptu třetí strany: funkce curlHeaderCallback($resURL, $strHeader) ( if (preg_match("/^HTTP/i", $strHeader)) ( header($strHeader) ); header("Content-Disposition: attachment; filename="název-souboru.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ódem: " . $intReturnCode; ) Příklad 9. Uložení stránky do souboru a výpočet přenosové rychlosti pomocí 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 "Průměrná rychlost stahování == " . $sAverageSpeedDownload ."
"; curl_close($sh); FClose ($hFile); echo "( Viz soubor "".$sTxtfile."" ve stejné cestě jako hosting." " kam tento skript PHP).
"; echo "Průměrná rychlost nahrávání == " . $sAverageSpeedUpload ."
"; echo"
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo "
";
}
Příklad 9. Příjem stránky přes SSL připojení (https)
$ch=curl_init("https://site"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Zakáže chybu "Problém s certifikátem SSL, ověřte, zda je certifikát CA v pořádku" curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Zakáže chybu "SSL: název předmětu certifikátu "hostname.ru" neodpovídá cílovému názvu hostitele "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); Příklad 10: Použití relací a souborů cookie ve zvlnění
$cookie_filename=sys_get_temp_dir()+"/cookie.tmp"; $curl=curl_init("http://web"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename);//uložení přijatých COOKIE do souboru curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //odeslat na server soubory COOKIE přijaté od něj během autorizace $out=curl_exec($curl); Příklad 11: Nahrání souboru a vícerozměrné pole v Curl. CURLOPT_POSTFIELDS + CurlFile