PHP CURL - funkcje i przykłady użycia. Zaawansowane wykorzystanie cURL w opcjach wiersza poleceń PHP Curl
(PHP 4 >= 4.0.2, PHP 5, PHP 7)
curl_setopt — Ustawia parametr sesji CURL
Lista parametrów
Uchwyt cURL uzyskany z curl_init().
Parametr do ustawienia CURLOPT_XXX.
Wartość parametru opcji.
bool:
Parametr | Notatki | |
---|---|---|
CURLOPT_AUTOREFERER | PRAWDA do automatycznego ustawiania pola Strona odsyłająca: w żądaniach przekierowanych przez nagłówek Lokalizacja:. | |
TRANSFER CURLOPT_BINARY | PRAWDA aby zwrócić surową odpowiedź w przypadku użycia stałej TRANSFER CURLOPT_RETURN. | Od wersji PHP 5.1.3 ta opcja nie jest już wymagana: przy jej użyciu zawsze zwracane są nieprzetworzone dane wyjściowe TRANSFER CURLOPT_RETURN. |
CURLOPT_COOKIESESSION | PRAWDA aby poinstruować bieżącą sesję, aby rozpoczęła nową „sesję” plików cookie. Spowoduje to, że libcurl zignoruje wszelkie pliki cookie „sesji”, które powinien załadować z poprzedniej sesji. Domyślnie libcurl zawsze zapisuje i ładuje wszystkie pliki cookie, niezależnie od tego, czy są one „sesyjne”, czy nie. Pliki cookie „sesyjne” to pliki cookie, które nie wygasają i muszą istnieć tylko podczas bieżącej „sesji”. | |
CURLOPT_CERTINFO | PRAWDA do wysyłania strumieniowego informacji o certyfikacie SSL STDERR z bezpiecznymi połączeniami. | Dodano w cURL 7.19.1. Dostępne począwszy od PHP 5.3.2. Wymaga włączenia tej opcji do prawidłowego działania CURLOPT_VERBOSE. |
CURLOPT_CONNECT_ONLY | PRAWDA informuje bibliotekę o konieczności przeprowadzenia niezbędnego uwierzytelnienia proxy i konfiguracji połączenia, ale nie przesyła danych. Ta opcja jest zaimplementowana dla protokołów HTTP, SMTP i POP3. | Dodano w 7.15.2. Dostępne od PHP 5.5.0. |
CURLOPT_CRLF | PRAWDA do konwersji końcówek linii Uniksa na CRLF. | |
CURLOPT_DNS_USE_GLOBAL_CACHE | PRAWDA aby korzystać z globalnej pamięci podręcznej DNS. Ta opcja nie jest bezpieczna dla wątków i jest domyślnie włączona. | |
CURLOPT_FAILONERROR | PRAWDA aby uzyskać szczegółowy raport w przypadku niepowodzenia, jeśli otrzymany kod HTTP jest większy lub równy 400. Domyślne zachowanie zwraca normalną stronę, ignorując kod. | |
CURLOPT_FILETIME | PRAWDA aby spróbować uzyskać datę modyfikacji zdalnego dokumentu. Wartość tę można uzyskać wykorzystując parametr CURLINFO_FILETIME z funkcji curl_getinfo(). | |
CURLOPT_FOLLOWLOCATION | PRAWDA podążać za dowolnym nagłówkiem "Lokalizacja: " wysłane przez serwer w odpowiedzi (zwróć uwagę, że dzieje się to rekurencyjnie, PHP będzie podążać za wszystkimi wysłanymi nagłówkami "Lokalizacja: ", chyba że ustawiona jest stała CURLOPT_MAXREDIRS). | |
CURLOPT_FORBID_REUSE | PRAWDA wymusić zamknięcie połączenia po zakończeniu jego przetwarzania, tak aby nie można było go ponownie wykorzystać. | |
CURLOPT_FRESH_CONNECT | PRAWDA aby wymusić użycie nowego połączenia zamiast połączenia buforowanego. | |
CURLOPT_FTP_USE_EPRT | PRAWDA aby używać EPRT (i LPRT) do aktywnego przesyłania FTP. Używać FAŁSZ aby wyłączyć EPRT i LPRT i używać tylko PORT. | |
CURLOPT_FTP_USE_EPSV | PRAWDA do wstępnego testowania polecenia EPSV podczas transferów FTP. Jeśli polecenie się nie powiedzie, zostanie przywrócone ustawienie PASV. Zainstaluj w FAŁSZ aby wyłączyć EPSV. | |
CURLOPT_FTP_CREATE_MISSING_DIRS | PRAWDA do tworzenia brakujących katalogów, jeśli operacja FTP napotka nieistniejącą ścieżkę. | |
CURLOPT_FTPAPPEND | PRAWDA aby zapisać zdalny plik do końca, zamiast nadpisywać go na istniejącym pliku. | |
CURLOPT_TCP_NODELAY | Określa na stałe, czy opcja TCP_NODELAY powinna być ustawiona, czy wyczyszczona (1 = ustawiona, 0 = wyczyszczona). Domyślnie opcja jest wyczyszczona. | Dostępne od PHP 5.2.1 dla wersji zbudowanych z libcurl 7.11.2 lub nowszych. |
CURLOPT_FTPASCII | Przezwisko CURLOPT_TRANSFERTEXT. Zamiast tego użyj tego. | |
TYLKO CURLOPT_FTPLISTONLY | PRAWDA aby zwrócić tylko listę nazw z katalogu FTP. | |
CURLOPT_HEADER | PRAWDA aby uwzględnić nagłówki w wynikach. | |
CURLINFO_HEADER_OUT | PRAWDA do śledzenia ciągu zapytania uchwytu. | Dostępne począwszy od PHP 5.1.3. Prefiks CURLINFO_ specjalnie użyte. |
CURLOPT_HTTPGET | PRAWDA aby zresetować metodę żądania HTTP do metody GET. Ponieważ wartością domyślną jest GET, ten parametr jest potrzebny tylko wtedy, gdy metoda żądania została wcześniej zmieniona. | |
CURLOPT_HTTPPROXYTUNNEL | PRAWDA do tunelowania przez określony serwer proxy HTTP. | |
CURLOPT_MUTE | PRAWDA aby całkowicie wyłączyć komunikaty funkcji cURL. | Usunięto w cURL 7.15.5 (można użyć opcji CURLOPT_RETURNTRANSFER) |
CURLOPT_NETRC | PRAWDA aby odczytać plik ~/.netrc zawierający login i hasło do zdalnej witryny, z którą nawiązywane jest połączenie. | |
CURLOPT_NIKT | PRAWDA aby wykluczyć treść odpowiedzi z danych wyjściowych. Metoda żądania jest ustawiona na HEAD. Zmiana tego ustawienia na FAŁSZ nie zmienia go z powrotem na GET. | |
CURLOPT_NOPROGRESS | PRAWDA aby wyłączyć wskaźnik postępu transferów cURL.
|
|
CURLOPT_NOSIGNAL | PRAWDA aby zignorować dowolną funkcję cURL, która wysyła sygnały do procesu PHP. Ta opcja jest domyślnie włączona w wielowątkowych interfejsach SAPI, aby umożliwić prawidłowe działanie parametrów limitu czasu. | |
CURLOPT_POST | PRAWDA aby używać zwykłego protokołu HTTP POST. Ta metoda POST używa metody normalnej , powszechnie używane w formularzach HTML. | |
CURLOPT_PUT | PRAWDA aby pobrać plik metodą HTTP PUT. Używany plik należy ustawić za pomocą opcji CURLOPT_INFILE I CURLOPT_INFILESIZE. | |
TRANSFER CURLOPT_RETURN | PRAWDA aby zwrócić wynik transferu jako ciąg znaków curl_exec() zamiast bezpośredniego wysyłania danych do przeglądarki. | |
CURLOPT_SAFE_UPLOAD | PRAWDA aby wyłączyć obsługę prefiksów @ dla pobranych plików w formacie CURLOPT_POSTFIELDS, co oznacza, że wartości przekazywane z @ mogą być bezpiecznie przesyłane w postaci pól. Zamiast przedrostka możesz użyć opcji Plik CURLF D. | Dodano w PHP 5.5.0 z wartością domyślną FAŁSZ. W PHP 5.6.0 domyślnie stało się ono równe PRAWDA. |
CURLOPT_SSL_VERIFYPEER | FAŁSZ aby zatrzymać cURL sprawdzanie certyfikatu hosta. Za pomocą parametru można określić alternatywne certyfikaty, które mają zostać zweryfikowane CURLOPT_CAINFO lub katalog z certyfikatami określonymi przez parametr CURLOPT_CAPATH. | Domyślnie jest PRAWDA od wersji cURL 7.10. Domyślna dystrybucja jest instalowana począwszy od wersji cURL 7.10. |
CURLOPT_TRANSFERTEXT | PRAWDA aby używać trybu ASCII do transferów FTP. W przypadku korzystania z protokołu LDAP dane są zwracane w postaci zwykłego tekstu, a nie HTML. W systemach Windows wątek STDOUT nie przechodzi w tryb binarny. | |
CURLOPT_UNRESTRICTED_AUTH | PRAWDA aby kontynuować wysyłanie loginu i hasła podczas przekierowań (przy użyciu CURLOPT_FOLLOWLOCATION), nawet jeśli nazwa hosta ulegnie zmianie. | |
CURLOPT_UPLOAD | PRAWDA aby przygotować się do przesłania pliku na serwer. | |
CURLOPT_VERBOSE | PRAWDA aby wyświetlić dodatkowe informacje. Zapisuje dane wyjściowe do strumienia STDERR lub plik określony przez parametr CURLOPT_STDERR. |
W przypadku następujących wartości parametrów opcji parametr value musi być typu liczba całkowita:
Parametr | Ustaw wartość wartości | Notatki |
---|---|---|
CURLOPT_BUFFERSIZE | Rozmiar bufora używanego dla każdego odczytu. Nie ma jednak gwarancji, że żądanie to zostanie zrealizowane. | Dodano w cURL 7.10. |
CURLOPT_CLOSEPOLICY | Jedna ze stałych CURLCLOSEPOLICY_*.
|
Usunięto w PHP 5.6.0. |
CURLOPT_CONNECTTIMEOUT | Liczba sekund oczekiwania podczas próby połączenia. Użyj 0, aby czekać w nieskończoność. | |
CURLOPT_CONNECTTIMEOUT_MS | Liczba milisekund oczekiwania podczas próby połączenia. Użyj 0, aby czekać w nieskończoność. Jeśli biblioteka libcurl jest skompilowana przy użyciu standardowego systemowego mechanizmu rozpoznawania nazw, połączenie nadal będzie korzystać z pełnej sekundy oczekiwania jako limitu czasu, przy czym minimalny dozwolony limit czasu wynosi 1 sekundę. | Dodano w wersji cURL 7.16.2. Dostępne począwszy od PHP 5.2.3. |
CURLOPT_DNS_CACHE_TIMEOUT | Liczba sekund, przez które rekordy DNS są przechowywane w pamięci. Domyślnie ten parametr wynosi 120 (2 minuty). | |
CURLOPT_FTPSSLAUTH | Metoda uwierzytelniania FTP (w trybie aktywnym): CURLFTPAUTH_SSL(najpierw sprawdzany jest SSL), CURLFTPAUTH_TLS(najpierw sprawdzone TLS) lub CURLFTPAUTH_DEFAULT(cURL decyduje sam). | Dodano w wersji cURL 7.12.2. |
CURLOPT_HTTP_VERSION | CURL_HTTP_VERSION_NONE (domyślnie CURL wybiera, której wersji użyć), CURL_HTTP_VERSION_1_0 (wymuś HTTP/1.0) lub CURL_HTTP_VERSION_1_1 (wymuś HTTP/1.1). | |
CURLOPT_HTTPAUTH |
Możesz użyć operatora bitowego | (lub) połączyć kilka metod razem. W takim przypadku cURL odpyta serwer pod kątem obsługiwanych metod autoryzacji i wybierze najlepszą. CURLAUTH_ANY jest aliasem CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. CURLAUTH_ANYSAFE jest aliasem CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. |
|
CURLOPT_INFILESIZE | Oczekiwany rozmiar pliku (w bajtach) podczas przesyłania pliku na serwer zdalny. Należy pamiętać, że użycie tej opcji nie spowoduje wstrzymania przesyłania dalszych danych powyżej tej wartości, ponieważ wysłane dane zależą od wyniku FUNKCJA CURLOPT_READ. | |
CURLOPT_LOW_SPEED_LIMIT | Górny próg szybkości przesyłania danych w bajtach na sekundę. Weryfikacja odbywa się w ciągu CURLOPT_LOW_SPEED_TIME sekund, po czym PHP uzna transfer za zbyt wolny i przerywa go. | |
CURLOPT_LOW_SPEED_TIME | Maksymalna liczba sekund, podczas których szybkość transmisji nie może przekroczyć CURLOPT_LOW_SPEED_LIMIT, w przeciwnym razie PHP oznaczy transfer jako zbyt wolny i zatrzyma go. | |
CURLOPT_MAXCONNECTS | Maksymalna liczba trwałych połączeń. Po osiągnięciu limitu parametr służy do określenia, które połączenie należy zamknąć. CURLOPT_CLOSEPOLICY. | |
CURLOPT_MAXREDIRS | Maksymalna liczba zaakceptowanych przekierowań. Użyj tej opcji razem z opcją CURLOPT_FOLLOWLOCATION. | |
CURLOPT_PORT | Alternatywny port połączenia. | |
CURLOPT_POSTREDIR | Maska bitowa zawierająca 1 (301 Przeniesiona na stałe), 2 (302 Znaleziono) i 4 (303 Zobacz Inne) określająca, czy metoda HTTP POST powinna być przetwarzana, gdy opcja jest włączona CURLOPT_FOLLOWLOCATION jeśli wystąpił określony typ przekierowania. | Dodano w cURL 7.19.1. Dostępne od PHP 5.3.2. |
PROTOKOŁY CURLOPT |
Maska bitowa wartości CURLPROTO_*. Ta maska ogranicza protokoły używane przez libcurl. Dzięki temu libcurl może pracować z dużą liczbą protokołów i ograniczać działanie niektórych transferów tylko do ich podzbioru. Domyślnie libcurl używa wszystkich obsługiwanych protokołów. Zobacz także parametr CURLOPT_REDIR_PROTOCOLS. Poprawne wartości protokołu: CURLPROTO_HTTP, CURLPROTO_HTTPS, CURLPROTO_FTP, CURLPROTO_FTPS, CURLPROTO_SCP, CURLPROTO_SFTP, CURLPROTO_TELNET, CURLPROTO_LDAP, CURLPROTO_LDAPS, CURLPROTO_DICT, CURLPROTO_FILE, CURLP ROTO_TFTP , CURLPROTO_ALL |
|
CURLOPT_PROXYAUTH | Metody autoryzacji HTTP używane podczas łączenia się z serwerem proxy. Użyj tych samych masek bitowych, które opisano dla parametru CURLOPT_HTTPAUTH. Obecnie do autoryzacji proxy obsługiwane są tylko CURLAUTH_BASIC i CURLAUTH_NTLM. | Dodano w wersji cURL 7.10.7. |
CURLOPT_PROXYPORT | Numer portu serwera proxy, z którym nawiązywane jest połączenie. Liczbę tę można również ustawić za pomocą parametru CURLOPT_PROXY. | |
CURLOPT_PROXYTYPE | Albo CURLPROXY_HTTP (domyślnie) albo CURLPROXY_SOCKS5 . | Dodano w cURL 7.10. |
CURLOPT_REDIR_PROTOCOLS | Maska bitowa wartości CURLPROTO_*. Ta maska bitowa ogranicza protokoły używane przez libcurl podczas przekierowywania (z włączonym parametrem CURLOPT_FOLLOWLOCATION). Pozwala to ograniczyć zestaw protokołów używanych przy przekierowaniach dla niektórych transmisji. Domyślnie libcurl obsługuje wszystkie protokoły z wyjątkiem FILE i SCP. W wersjach wcześniejszych niż 7.19.4 przekierowanie było używane dla wszystkich protokołów bez wyjątku. Zobacz także opis parametrów PROTOKOŁY CURLOPT aby uzyskać listę stałych z wartościami protokołu. | Dodano w wersji cURL 7.19.4. |
CURLOPT_RESUME_FROM | Przesunięcie początku transmisji w bajtach. | |
CURLOPT_SSL_VERIFYHOST | Użyj 1, aby sprawdzić, czy w certyfikacie SSL istnieje nazwa zwyczajowa. Użyj 2, aby sprawdzić, czy nazwa zwyczajowa istnieje i pasuje również do określonego hosta. W środowisku bojowym wartość tego parametru powinna wynosić 2 (ustawiona domyślnie). | Obsługa wartości 1 została usunięta w cURL 7.28.1 |
CURLOPT_SSLVERSION | Jedna ze stałych 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) lub CURL_SSLVERSION_TLSv1_2 (6). | |
CURLOPT_TIMECONDITION | Metoda interpretacji parametrów WARTOŚĆ CURLOPT_CZASU. Użyj CURL_TIMECOND_IFMODSINCE, aby zwrócić stronę tylko wtedy, gdy zmieniła się od czasu określonego w parametrze WARTOŚĆ CURLOPT_CZASU. Jeśli strona nie została zmodyfikowana, tytuł zostanie zwrócony „304 Nie zmodyfikowano”, co oznacza, że parametr CURLOPT_HEADER zainstalowany w PRAWDA. Użyj CURL_TIMECOND_IFUNMODSINCE, aby uzyskać odwrotny efekt. Wartość domyślna to CURL_TIMECOND_IFMODSINCE. | |
CURLOPT_TIMEOUT | Maksymalna liczba sekund dozwolona na wykonywanie funkcji cURL. | |
CURLOPT_TIMEOUT_MS | Maksymalna liczba milisekund dozwolona na wykonywanie funkcji cURL. Jeśli biblioteka libcurl jest zbudowana przy użyciu normalnego mechanizmu rozpoznawania nazw systemowych, wówczas ten zakres połączenia będzie nadal korzystał z limitów czasu zaokrąglania drugiego, z minimalnym dopuszczalnym limitem czasu wynoszącym jedną sekundę. | Dodano w wersji cURL 7.16.2. Dostępne począwszy od PHP 5.2.3. |
WARTOŚĆ CURLOPT_CZASU | Liczba sekund od 1 stycznia 1970 r. Czas ten zostanie wykorzystany przez parametr CURLOPT_TIMECONDITION. Domyślnie używany jest parametr CURL_TIMECOND_IFMODSINCE. | |
CURLOPT_MAX_RECV_SPEED_LARGE | Jeżeli prędkość pobierania przekroczy tę wartość (określoną w bajtach na sekundę) średnio w trakcie całego transferu, pobieranie zostanie wstrzymane, aby utrzymać średnią prędkość mniejszą lub równą temu parametrowi. Domyślnie prędkość nie jest ograniczona. | |
CURLOPT_MAX_SEND_SPEED_LARGE | Jeśli przesyłanie na serwer przekroczy tę wartość (określoną w bajtach na sekundę) średnio przez cały czas przesyłania, przesyłanie zostanie wstrzymane, aby utrzymać średnią prędkość mniejszą lub równą temu parametrowi. Domyślnie prędkość nie jest ograniczona. | Dodano w cURL 7.15.5. Dostępne począwszy od PHP 5.4.0. |
CURLOPT_SSH_AUTH_TYPES | Maska bitowa składająca się z jednej lub więcej stałych: CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD. zainstalować CURLSSH_AUTH_ANY aby libcurl mógł wybrać jeden z nich niezależnie. | Dodano w cURL 7.16.1. |
CURLOPT_IPRESOLVE | Zezwala aplikacji na wybór typu adresu IP, na podstawie którego określana jest nazwa hosta. Jest to konieczne, jeśli używasz nazwy hosta pochodzącej z więcej niż jednej wersji adresu IP. Możliwe wartości mogą być CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6 i domyślnie CURL_IPRESOLVE_WHATEVER. | Dodano w cURL 7.10.8. |
W przypadku następujących wartości parametrów opcji parametr value musi być typu strunowy:
Parametr | Ustaw wartość wartości | Notatki |
---|---|---|
CURLOPT_CAINFO | Nazwa pliku zawierającego jeden lub więcej certyfikatów, względem których będą sprawdzane węzły. Parametr ten ma sens tylko w połączeniu z CURLOPT_SSL_VERIFYPEER. | Wymaga ścieżki bezwzględnej. |
CURLOPT_CAPATH | Katalog zawierający kilka certyfikatów CA. Użyj tej opcji w połączeniu z CURLOPT_SSL_VERIFYPEER. | |
CURLOPT_COOKIE | Treść nagłówka "Ciastko:", używany w żądaniu HTTP. Należy pamiętać, że wiele plików cookie oddziela się średnikiem, po którym następuje spacja (na przykład „ owoc=jabłko; kolor=czerwony") | |
PLIK CURLOPT_COOKIE | Nazwa pliku zawierającego pliki cookies. Plik ten musi być w formacie Netscape lub po prostu nagłówkami HTTP zapisanymi w pliku. Jeżeli jako nazwę pliku zostanie przekazany pusty ciąg znaków, wówczas pliki cookies nie zostaną zapisane, ale ich przetwarzanie będzie nadal możliwe. | |
CURLOPT_COOKIEJAR | Nazwa pliku, w którym zostaną zapisane wszystkie wewnętrzne cookies bieżącego przelewu po zamknięciu uchwytu, np. po wywołaniu curl_close. | |
ŻĄDANIE CURLOPT_CUSTOM | Zamiast tego użyto niestandardowej metody żądania "DOSTAWAĆ" Lub "GŁOWA" podczas tworzenia żądania HTTP. Jest to przydatne w przypadku zapytań "USUWAĆ" lub inne, rzadsze żądania HTTP. Prawidłowe znaczenia to słowa takie jak "DOSTAWAĆ", "POST", "ŁĄCZYĆ" i tak dalej; te. Nie wprowadzaj tutaj całej linii żądania HTTP. Na przykład wskazanie „POBIERZ /index.html HTTP/1.0\r\n\r\n” będzie źle.
|
|
CURLOPT_EGDSOCKET | Tak jak CURLOPT_RANDOM_FILE, z tą różnicą, że nazwa pliku jest ustawiona na gniazdo Entropy Gathering Daemon. | |
CURLOPT_ENCODING | Treść nagłówka „Akceptuj-kodowanie:”. Umożliwia to rozszyfrowanie żądania. Obsługiwane kodowania to "tożsamość", "siadać" I „gzip”. Jeśli zostanie przekazany pusty ciąg znaków, "" , wysyłany jest nagłówek zawierający wszystkie obsługiwane typy kodowania. | Dodano w cURL 7.10. |
CURLOPT_FTPPORT | Wartość, która będzie używana do określenia adresu IP dla polecenia FTP „PORT”. Polecenie „PORT” informuje serwer, z jakim adresem IP powinien się połączyć. Może to być adres IP, nazwa hosta, nazwa interfejsu sieciowego (w systemie Unix) lub po prostu „-”, aby użyć domyślnego adresu IP systemu. | |
CURLOPT_INTERFACE | Nazwa używanego interfejsu sieciowego. Może to być nazwa interfejsu, adres IP lub nazwa hosta. | |
CURLOPT_KEYPASSWD | Hasło wymagane do użycia klucza prywatnego CURLOPT_SSLKEY Lub CURLOPT_SSH_PRIVATE_KEYFILE. | Dodano w cURL 7.16.1. |
POZIOM CURLOPT_KRB4 | Poziom bezpieczeństwa KRB4 (Kerberos 4). Którakolwiek z poniższych wartości (w kolejności od najsłabszej do najsilniejszej) jest poprawna: "jasne", "bezpieczna", "poufny", "prywatny".. Jeżeli podany ciąg różni się od podanych wartości, zostanie użyta wartość "prywatny". Ustawienie tej opcji na ZERO całkowicie wyłączy zabezpieczenia KRB4. W tej chwili bezpieczeństwo KRB4 działa tylko z transakcjami FTP. | |
CURLOPT_POSTFIELDS | Wszystkie dane przesyłane w żądaniu HTTP POST. Aby przesłać plik, określ przed nazwą pliku @ , a także użyj pełnej ścieżki do pliku. Typ pliku można również określić w formacie „ ;typ=typ MIME" po nazwie pliku. Ten parametr można przekazać jako ciąg zakodowany w adresie URL, np. " para1=wartość1¶2=wartość2&...", oraz w postaci tablicy, której kluczami będą nazwy pól, a wartościami będzie ich zawartość. Jeśli wartość jest tablicą, nagłówek Typ zawartości zostanie ustawiony na dane wieloczęściowe/formularzowe. Począwszy od PHP 5.2.0, podczas przesyłania plików z prefiksem @ , wartość musi być tablicą. Od PHP 5.5.0, prefiks @ jest przestarzały i pliki można wysyłać za pomocą Plik CURLF. Prefiks @ można wyłączyć, aby zezwolić na wartości zaczynające się od @ ustawiając opcję CURLOPT_SAFE_UPLOAD w znaczeniu PRAWDA. | |
CURLOPT_PROXY | Serwer proxy HTTP, przez który będą kierowane żądania. | |
CURLOPT_PROXYUSERPWD | Login i hasło wpisane w formularzu ":" , używany podczas łączenia się za pośrednictwem serwera proxy. | |
CURLOPT_RANDOM_FILE | Nazwa pliku używanego do inicjalizacji generatora liczb losowych dla protokołu SSL. | |
CURLOPT_RANGE | Zakres danych do pobrania, w formacie „X-Y”, a X lub Y można pominąć. Protokół HTTP obsługuje także transmisję wielu zakresów oddzielonych przecinkami, są one określone w formacie „X-Y, N-M”. | |
CURLOPT_REFERER | Treść nagłówka „Odsyłający:”, który zostanie użyty w żądaniu HTTP. | |
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 | Ciąg zawierający 32 cyfry szesnastkowe. Ciąg musi być sumą kontrolną MD5 klucza publicznego komputera zdalnego, a libcurl zresetuje połączenie ze zdalnym hostem, dopóki suma kontrolna nie będzie odpowiadać kluczowi publicznemu. Ta opcja służy tylko do przesyłania danych przy użyciu protokołu SCP i SFTP. | Dodano w cURL 7.17.1. |
CURLOPT_SSH_PUBLIC_KEYFILE | Nazwa pliku klucza publicznego. Jeśli nie określono, libcurl domyślnie przyjmuje plik $HOME/.ssh/id_dsa.pub, jeśli zmienna środowiskowa HOME jest ustawiona, i plik „id_dsa.pub” w bieżącym katalogu, jeśli zmienna środowiskowa HOME nie jest ustawiona. | Dodano w cURL 7.16.1. |
CURLOPT_SSH_PRIVATE_KEYFILE | Nazwa pliku klucza prywatnego. Jeśli nie określono, libcurl domyślnie wybiera plik $HOME/.ssh/id_dsa, jeśli zmienna środowiskowa HOME jest ustawiona, i plik „id_dsa” w bieżącym katalogu, jeśli zmienna środowiskowa HOME nie jest ustawiona. Jeśli plik jest chroniony hasłem, ustaw hasło za pomocą CURLOPT_KEYPASSWD. | Dodano w cURL 7.16.1. |
CURLOPT_SSL_CIPHER_LIST | Lista szyfrów używanych w transferach SSL. Na przykład, RC4-SHA I TLSv1 są prawidłowymi listami szyfrów. | |
CURLOPT_SSLCERT | Nazwa pliku z poprawnie sformatowanym certyfikatem PEM. | |
CURLOPT_SSLCERTPASSWD | Hasło wymagane do korzystania z certyfikatu CURLOPT_SSLCERT. | |
TYP CURLOPT_SSLCERTTYPE | Format certyfikatu. Obsługiwane formaty „PEM”(domyślny), „DER” I „ENG”. | Dodano w wersji cURL 7.9.3. |
CURLOPT_SSLENGINE | Identyfikator mechanizmu szyfrowania dla klucza prywatnego SSL określony w parametrze CURLOPT_SSLKEY. | |
CURLOPT_SSLENGINE_DEFAULT | Identyfikator mechanizmu szyfrowania używanego w operacjach szyfrowania asymetrycznego. | |
CURLOPT_SSLKEY | Nazwa pliku klucza prywatnego SSL. | |
CURLOPT_SSLKEYPASSWD | Tajne hasło wymagane do użycia klucza prywatnego SSL określonego w parametrze CURLOPT_SSLKEY.
|
|
CURLOPT_SSLKEYTYPE | Typ klucza prywatnego SSL określony w parametrze CURLOPT_SSLKEY. Obsługiwane są następujące typy kluczy: „PEM”(domyślny), „DER” I „ENG”. | |
CURLOPT_URL | Adres URL do pobrania. Parametr ten można również ustawić podczas inicjowania sesji za pomocą curl_init(). | |
CURLOPT_USERAGENT | Treść nagłówka "Agent użytkownika: ", wysłany w żądaniu HTTP. | |
CURLOPT_USRPWD | Login i hasło używane podczas połączenia, określone w formacie ":" . |
W przypadku następujących wartości parametrów opcji parametr value musi być tablicą:
Parametr | Ustaw wartość wartości | Notatki |
---|---|---|
CURLOPT_HTTP200ALIASES | Tablica odpowiedzi HTTP 200, które będą traktowane jako odpowiedzi prawidłowe, a nie błędne. | Dodano w wersji cURL 7.10.3. |
CURLOPT_HTTPHEADER | Tablica ustawionych nagłówków HTTP w formacie array("Typ zawartości: tekst/zwykły", "Długość treści: 100") | |
CURLOPT_POSTQUOTE | Tablica poleceń FTP wykonywanych na serwerze po zakończeniu żądania FTP. | |
CURLOPT_CYTAT | Tablica poleceń FTP wykonywanych na serwerze przed wysłaniem żądania FTP. |
Dla poniższych wartości parametrów opcji parametr value musi być uchwytem strumienia (zwracanym na przykład przez funkcję otwórz()):
Parametr | Ustaw wartość wartości |
---|---|
PLIK CURLOPT | Plik, w którym zostanie zapisany wynik przelewu. Domyślny strumień wyjściowy STDOUT(okno przeglądarki). |
CURLOPT_INFILE | Plik z którego mają zostać odczytane dane przy przesyłaniu na serwer. |
CURLOPT_STDERR | Alternatywny plik wyjściowy błędu używany zamiast strumienia błędów STDERR. |
CURLOPT_WRITEHEADER | Plik, w którym zostaną zapisane nagłówki bieżącej operacji. |
W przypadku następujących wartości parametrów opcji parametr value musi być prawidłową nazwą funkcji lub jej zamknięciem:
Parametr | Ustaw wartość wartości |
---|---|
FUNKCJA CURLOPT_HEADER | Funkcja wywołania zwrotnego przyjmuje dwa parametry. Pierwszy parametr to uchwyt cURL, drugi parametr to ciąg zawierający nagłówki do zapisania. Nagłówki należy pisać przy użyciu tej funkcji wywołania zwrotnego. Powinien zwrócić liczbę zapisanych bajtów. |
FUNKCJA CURLOPT_PASSWDFUNCTION | Funkcja wywołania zwrotnego przyjmuje trzy parametry. Pierwszy parametr to uchwyt cURL, drugi parametr to ciąg monitu o hasło, a trzeci parametr to maksymalna długość hasła. Powinien zwrócić ciąg zawierający hasło. |
FUNKCJA CURLOPT_PROGRESS |
Funkcja wywołania zwrotnego przyjmuje pięć parametrów. Pierwszy to deskryptor cURL, drugi to całkowita liczba bajtów, które mają zostać pobrane z serwera, trzeci to liczba bajtów już pobranych, czwarty to całkowita liczba bajtów, które mają zostać wysłane do serwera, oraz piąta to liczba już wysłanych bajtów.
Możesz zwrócić wartość różną od zera, aby anulować transfer. W takim przypadku wyświetli się błąd CURLE_ABORTED_BY_CALLBACK. |
FUNKCJA CURLOPT_READ | Funkcja wywołania zwrotnego przyjmuje trzy parametry. Pierwszy parametr to uchwyt cURL, drugi parametr to zasób strumienia przekazywany do cURL za pomocą opcji CURLOPT_INFILE, a trzeci parametr to maksymalna dozwolona ilość danych do odczytania. Funkcja wywołania zwrotnego musi zwrócić ciąg znaków o długości nie większej niż żądana ilość danych, zwykle poprzez odczyt z przekazanego zasobu przesyłanego strumieniowo. Powinien zwrócić pusty ciąg znaków, aby zasygnalizować koniec pliku EOF. |
FUNKCJA CURLOPT_WRITE | Funkcja wywołania zwrotnego przyjmuje dwa parametry. Pierwszy parametr to uchwyt cURL, a drugi parametr to ciąg znaków zawierający dane do zapisania. Przy użyciu tej funkcji należy zapisać dane. Musi zwrócić dokładną liczbę zapisanych bajtów, w przeciwnym razie pobieranie zostanie przerwane z błędem. |
Inne znaczenia:
Zwróć wartości
Zwroty PRAWDA po pomyślnym zakończeniu lub FAŁSZ w przypadku błędu.
Lista zmian
Wersja | Opis |
---|---|
5.6.0 | Opcja CURL_SAFE_UPLOAD ma teraz domyślną wartość PRAWDA. |
5.6.0 | Usunięta opcja CURLOPT_CLOSEPOLICY i związane z nim znaczenia. |
5.5.0 | Zasób cURL jest dodawany jako pierwszy argument funkcji wywołania zwrotnego FUNKCJA CURLOPT_PROGRESS. |
5.5.0 | Dodana opcja CURLOPT_SHARE. |
5.3.0 | Dodana opcja FUNKCJA CURLOPT_PROGRESS. |
5.2.10 | Dodano opcje PROTOKOŁY CURLOPT I CURLOPT_REDIR_PROTOCOLS. |
5.1.0 | Dodano opcje CURLOPT_AUTOREFERER, TRANSFER CURLOPT_BINARY, CURLOPT_FTPSSLAUTH, CURLOPT_PROXYAUTH I CURLOPT_TIMECONDITION. |
5.0.0 | Dodano opcje CURLOPT_FTP_USE_EPRT, CURLOPT_NOSIGNAL, CURLOPT_UNRESTRICTED_AUTH, CURLOPT_BUFFERSIZE, CURLOPT_HTTPAUTH, CURLOPT_PROXYPORT, CURLOPT_PROXYTYPE, TYP CURLOPT_SSLCERTTYPE I CURLOPT_HTTP200ALIASES. |
Przykłady
Przykład nr 1 Inicjowanie sesji CURL i ładowanie strony internetowej
// utwórz nowy zasób 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); Wynik uruchomienia tego przykładu: Tablica ( => Foo) Tablica ( => Tablica ( => test.png => image/png => /tmp/phpcpjNeQ => 0 => 279)) Komentarz: Przekazywanie tablicy do CURLOPT_POSTFIELDS koduje dane jako dane wieloczęściowe/formularzowe, natomiast przekazanie ciągu zakodowanego w adresie URL spowoduje zakodowanie danych jako application/x-www-form-urlencoded. cURL to narzędzie, które pozwala na interakcję z różnymi serwerami i obsługuje wiele protokołów: HTTP, FTP, TELNET itp. cURL jest pierwotnie narzędziem wiersza poleceń. Ale na szczęście dla nas PHP obsługuje pracę z biblioteką cURL. W tym artykule przyjrzymy się nietrywialnym przykładom pracy z cURL. W rzeczywistości istnieje wiele innych sposobów wysłania żądania do innego serwera w celu na przykład pobrania zawartości strony. Wiele osób, głównie z lenistwa, zamiast cURL używa prostych funkcji PHP: $content = file_get_contents("http://www.example.com"); // lub $lines = plik("http://www.example.com"); // lub plik read("http://www.example.com"); Nie pozwalają jednak na efektywną obsługę błędów. Istnieje również szereg zadań, których w ogóle nie mogą wykonać - na przykład praca z plikami cookie, autoryzacja, żądania wysłania wiadomości, pobieranie plików. cUrl to potężne narzędzie, które obsługuje wiele protokołów i zapewnia pełne informacje o żądaniach. Zanim przejdziemy do skomplikowanych przykładów, przyjrzyjmy się podstawowej strukturze żądania cURL w PHP. Aby wykonać żądanie cURL w PHP, musisz wykonać 4 główne kroki: W tym artykule będziemy głównie przyglądać się krokowi nr 2, ponieważ to tam dzieje się magia. Lista opcji cURL jest bardzo duża, dlatego nie będziemy dzisiaj rozważać wszystkich opcji, ale skorzystamy z tych, które są przydatne do rozwiązania konkretnych problemów. Jeśli to konieczne, możesz dodać następujące wiersze, aby śledzić błędy: // ... $wyjście = curl_exec($ch); if ($output === FALSE) ( echo "Błąd cURL: " . curl_error($ch); ) // ... Pamiętaj, że używamy „===” zamiast „==”, ponieważ Należy rozróżnić pustą odpowiedź serwera od wartości logicznej FALSE, która jest zwracana w przypadku błędu. Kolejnym opcjonalnym krokiem jest uzyskanie informacji o żądaniu cURL po jego wykonaniu. // ... curl_exec($ch); $info = curl_getinfo($ch); echo „Wzięłem”. $info["całkowity czas"] . „sekundy na adres URL”. $info["url"]; // ... W rezultacie otrzymasz tablicę zawierającą następujące informacje: W tym przykładzie napiszemy skrypt, który będzie wykrywał przekierowania na podstawie różnych ustawień przeglądarki. Na przykład niektóre witryny przekierowują odwiedzających z urządzeń mobilnych do gości z innych krajów. Użyjemy opcji CURLOPT_HTTPHEADER, aby ustawić własne nagłówki, w tym User-Agent i Language, i zobaczyć, dokąd przekierowują nas witryny. // Adresy URL $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // przeglądarki $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)", "język" => "en-us,en;q=0.5"), "iphone" => array ("user_agent" => "Mozilla/5.0 (iPhone; U; Procesor taki jak Mac OS X; en) AppleWebKit/420+ (KHTML, jak Gecko) Wersja/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "francuski" => array ("user_agent" = > "Mozilla/4.0 (kompatybilny; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "język" => "fr,fr-FR;q=0.5"); foreach ($urls jako $url) ( echo "URL: $url\n"; foreach ($przeglądarki jako $test_name => $przeglądarka) ( $ch = curl_init(); // ustaw adres curl_setopt($ch, CURLOPT_URL , $url); // wskaż przeglądarkę i używany język curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($przeglądarka["język" ]) ")); // nie potrzebujemy zawartości strony curl_setopt($ch, CURLOPT_NOBODY, 1); // potrzebujemy tylko nagłówków curl_setopt($ch, CURLOPT_HEADER, 1); // zamiast tego zwróć wynik wyników curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); $output = curl_exec($ch); curl_close($ch); // zdefiniować przekierowania w nagłówkach HTTP? if (preg_match("!Lokalizacja: (.*)!" , $wyjście, $dopasowania)) ( echo "$nazwa_testu: przekierowuje do $dopasowań\n"; ) else ( echo "$nazwa_testu: brak przekierowania\n"; ) ) echo "\n\n"; ) W pętli sprawdzamy przeglądarki pod kątem każdego adresu URL. Najpierw ustawiamy opcje naszego żądania: adres URL oraz przeglądarkę i język, który ma zostać przetestowany. Ponieważ Ustawiliśmy specjalną opcję; wynik żądania będzie zawierał wyłącznie nagłówki HTTP. Za pomocą prostego wyrażenia regularnego możemy sprawdzić, czy odpowiedź zawiera ciąg „Lokalizacja:”. Wynik wykonania skryptu: Adres URL: http://www.cnn.com standard: przekierowuje do http://edition.cnn.com/ iphone: przekierowuje do http://edition.cnn.com/ Francuski: przekierowuje do http://edition.cnn .com/ URL: http://www.mozilla.com standard: przekierowuje do https://www.mozilla.org/firefox/ iphone: przekierowuje do https://www.mozilla.org/firefox/ francuski: przekierowuje do https://www.mozilla.org/firefox/ URL: http://www.facebook.com standard: przekierowuje do https://www.facebook.com/ iphone: przekierowuje do http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr Francuski: brak przekierowania Podczas wykonywania żądań GET dane mogą być przekazywane w ciągu zapytania. Na przykład podczas wyszukiwania w Google zapytanie jest tłumaczone na adres URL: http://www.google.com/search?q=google Aby uzyskać wynik tego zapytania, nie potrzebujesz nawet cURL, możesz być leniwy i użyć „file_get_contents()”. Ale niektóre formularze HTML używają metody POST. W takim przypadku dane są wysyłane w treści żądania, a nie w samym adresie URL. Napiszmy skrypt, który będzie wysyłał żądania POST. Najpierw utwórzmy prosty plik PHP, który zaakceptuje te żądania i zwróci przesłane do niego dane. Nazwijmy to post_output.php : $url = "http://localhost/post_output.php"; $post_data = array („foo” => „bar”, „query” => „FooBar”, „action” => „Prześlij”); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // wykonaj żądanie POST curl_setopt($ch, CURLOPT_POST, 1); // dodaj dane curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $wyjście = curl_exec($ch); curl_close($ch); echo $wyjście; Ten skrypt wyświetli: Array ( => bar => FooBar => Prześlij) Skrypt ten wysłał żądanie POST do pliku post_output.php. który wygenerował zawartość tablicy $_POST i otrzymaliśmy tę odpowiedź za pomocą cURL. Podobnie jak w poprzednim przykładzie utwórzmy plik, który będzie akceptował żądania, upload_output.php : Print_r($_FILES); Oraz sam skrypt pobierający pliki: $url = "http://localhost/upload_output.php"; $post_data = array („foo” => „bar”, // plik do przesłania „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); $wyjście = curl_exec($ch); curl_close($ch); echo $wyjście; Jeśli chcesz przesłać plik, wystarczy podać ścieżkę do niego, tak jak w przypadku zwykłego parametru żądania POST, poprzedzonego przedrostkiem „@”. Wynik skryptu: Tablica ( => Tablica ( => Desert.jpg => aplikacja/octet-stream => /tmp/phpAhEvXy => 0 => 845941)) Jedną z zaawansowanych funkcji cURL w PHP jest możliwość wykonywania wielu żądań jednocześnie i asynchronicznie. W normalnych warunkach skrypt zatrzymuje się i czeka na zakończenie żądania. A jeśli musisz wykonać wiele zapytań, może to zająć dużo czasu, ponieważ... będziesz występować po kolei. To ograniczenie można ominąć: // utwórz procedury obsługi $ch1 = curl_init(); $ch2 = curl_init(); // ustaw opcje 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); //utwórz wielokrotny uchwyt cURL $mh = curl_multi_init(); // dodaj procedury obsługi curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $działanie = null; // wykonaj żądania do ( curl_multi_exec($mh, $running); ) while ($running > 0); // zwolnij zasoby curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh); Pomysł jest taki, że możesz utworzyć wiele uchwytów cURL, połączyć je w jeden multi-uchwyt i wykonać je asynchronicznie. Po pierwsze wszystko przebiega tak samo jak w przypadku zwykłego żądania cURL - tworzony jest deskryptor ( curl_init()
), ustawiane są parametry ( curl_setopt()
). Następnie tworzony jest wielodeskryptor ( curl_multi_init()
) i dodawane są wcześniej utworzone deskryptory regularne ( curl_multi_add_handle()
). Zamiast normalnie wywoływać funkcję curl_exec(), wywołamy ją curl_multi_exec()
funkcja ta informuje nas o ilości aktywnych połączeń za pomocą drugiego parametru - $running. Dlatego pętla działa, dopóki $running nie osiągnie wartości 0. I oczywiście po zakończeniu pracy konieczne jest zwolnienie zasobów. W tym przykładzie po prostu wyprowadzamy wynik zapytań na STDOUT. Rozważmy nietrywialny przypadek użycia wielu cURL. Wyobraź sobie bloga z dużą ilością postów zawierających linki do stron zewnętrznych. Niektóre z tych linków mogą nie działać. Napiszmy skrypt, który znajdzie wszystkie uszkodzone linki i nam je pokaże. Najpierw musimy pobrać wszystkie linki zewnętrzne z bazy danych: // KONFIG $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "site"); $max_connections = 10; $url_list = tablica(); $working_urls = tablica(); $martwe_urls = tablica(); $not_found_urls = tablica(); $aktywny = null; // połącz się z MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Nie można połączyć: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Można nie wybieraj db: " . mysql_error()); ) // pobierz wszystkie posty z linkami w tekście $q = "WYBIERZ post_content Z wp_posts GDZIE post_content LIKE "%href=%" ORAZ post_status = "publikuj" ORAZ typ_postu = "post „ ”; $r = mysql_query($q) lub die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // zbierz wszystkie linki za pomocą wyrażenia regularnego if (preg_match_all("/href=\"(.*?)\"/", $d["post_content"], $matches )) ( foreach ($pasuje do $url) ( // odfiltruj niepotrzebne domeny $tmp = parse_url($url); if (isset($tmp["host"]) && in_array($tmp["host"], $ wykluczone_domeny)) (kontynuuj; ) // połącz $url_list = $url; ) ) ) // usuń powtórzenia $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Brak adresu URL do sprawdzenia"); ) W tej części skryptu po prostu wyciągamy z bazy wszystkie linki zewnętrzne. Sprawdźmy je: $mh = curl_multi_init(); // 1. dodaj linki dla ($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 "==Martwe adresy URL==\n"; echo implode("\n", $dead_urls) . „\n\n”; echo "==404 adresy URL==\n"; echo implode("\n", $not_found_urls) . „\n\n”; echo "==Działające adresy URL==\n"; echo implode("\n", $working_urls); echo "\n\n"; // 9. dodaje uchwyt z podaną funkcją URL add_url_to_multi_handle($mh, $url_list) ( static $index = 0; // jeśli nadal istnieją linki if (isset($url_list[$index])) ( // wszystko to jak zwykle $ ch = curl_init(); // ustaw opcje curl_setopt($ch, CURLOPT_URL, $url_list[$index]); // zwróć zamiast wyświetlać wynik curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // zezwól przekierowuje curl_setopt($ ch, CURLOPT_FOLLOWLOCATION, 1); // pobierz tylko nagłówki, aby zaoszczędzić czas curl_setopt($ch, CURLOPT_NOBODY, 1); // dodaj do wielouchwytowego curl_multi_add_handle($mh, $ch); $index++; ) ) Przyjrzyjmy się kodowi bardziej szczegółowo (numeracja odpowiada komentarzom w kodzie): Uruchommy skrypt: Martwe adresy URL== xample1234.com/ ==404 adresy URL== www.google.com/dsfasdfafd ==Działają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 codex. wordpress.org/Plugin_API/Filter_Reference codex.wordpress.org/Roles_and_Capabilities code.google.com/p/google-api-php-client/wiki/OAuth2#Google_APIs_Console jplayer.org/ code.google.com/p/google-api -php-client/ developers.google.com/+/ account.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 Sprawdzanie trwało około 2 sekund. Uruchamiając jednocześnie 10 wątków, wydajność wzrasta 10-krotnie w porównaniu ze zwykłymi żądaniami cURL. Aby uzyskać treść odpowiedzi serwera należy skorzystać z funkcji curl_multi_getcontent($ch)
, gdzie $ch jest deskryptorem uzyskanym z curl_multi_info_read()
. Jeśli żądanie HTTP wymaga uwierzytelnienia, użyj następującego kodu: $url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // wyślij nazwę użytkownika i hasło curl_setopt($ch, CURLOPT_USERPWD, "mojanazwa_użytkownika:mojehasło"); // jeśli przekierowania są dozwolone curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // cURL wyśle hasło po przekierowaniach curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $wyjście = curl_exec($ch); curl_close($ch); PHP ma własną bibliotekę do pracy z FTP, ale możesz także użyć cURL: // odczytaj plik $file = fopen("/ścieżka/do/pliku", "r"); // url zawiera już niezbędne dane $url = "ftp://username: [e-mail chroniony]:21/ścieżka/do/nowy/plik"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // opcje curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/ścieżka/do/pliku")); curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ ch); curl_close($ch); Żądania można składać za pośrednictwem określonego serwera proxy: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // adres proxy curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // jeśli wymagana jest autoryzacja curl_setopt($ch, CURLOPT_PROXYUSERPWD,"użytkownik:hasło"); $wyjście = curl_exec($ch); curl_close($ch); Możliwe jest korzystanie z wywołań zwrotnych w trakcie działania żądania, bez czekania na jego zakończenie. Przykładowo, podczas pobierania odpowiedzi serwera, możemy wykorzystać już otrzymane dane, nie czekając na pełne pobranie. $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://example.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"funkcja_postępu"); curl_exec($ch); curl_close($ch); funkcja Progress_function($ch,$str) ( echo $str; return strlen($str); ) Funkcja wywołania zwrotnego musi zwracać długość ciągu, aby żądanie działało poprawnie. Za każdym razem, gdy odebrana zostanie kolejna część odpowiedzi serwera, zostanie wywołane wywołanie zwrotne. W tym artykule przyjrzeliśmy się zaawansowanym funkcjom cURL w PHP. Następnym razem, gdy będziesz musiał wysłać żądanie adresu URL, użyj cURL. Często musimy pobierać z Internetu różne pliki, na przykład pliki programów wykonywalnych, pliki skryptów, archiwa źródłowe. Nie zawsze jednak trzeba to robić za pośrednictwem przeglądarki. W wielu sytuacjach dużo łatwiej jest wykonać wszystkie czynności poprzez terminal. Ponieważ w ten sposób możesz zautomatyzować proces. Z drugiej strony webmasterzy od czasu do czasu muszą testować dostępność witryny, sprawdzać wysłane i otrzymane nagłówki i wiele więcej. Aby rozwiązać takie problemy i problemy o podobnym zakresie, możesz użyć narzędzia curl. Pozwala rozwiązać znacznie szerszy zakres problemów, włączając w to nawet symulowanie działań użytkowników na stronie. W tym artykule przyjrzymy się, jak używać curl, co to jest i dlaczego ten program jest potrzebny. W rzeczywistości curl to coś więcej niż tylko narzędzie wiersza poleceń dla systemu Linux lub Windows. Jest to zestaw bibliotek realizujących podstawowe możliwości pracy ze stronami URL i przesyłania plików. Biblioteka obsługuje współpracę z protokołami: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, a także POP3, IMAP i SMTP. Świetnie nadaje się do symulowania działań użytkownika na stronach i innych operacji na adresach URL. Do wielu różnych języków programowania i platform dodano obsługę biblioteki curl. Narzędzie curl jest niezależnym opakowaniem tej biblioteki. To właśnie na tym narzędziu skupimy się w tym artykule. Zanim przejdziemy do opisu użycia polecenia curl linux, przyjrzyjmy się samemu narzędziu i jego głównym opcjom, których będziemy potrzebować. Składnia narzędzia jest bardzo prosta: Link do opcji $ curl Przyjrzyjmy się teraz głównym opcjom: To w żadnym wypadku nie są wszystkie opcje curl linux, ale zawiera listę podstaw, z których będziesz musiał skorzystać. Omówiliśmy już wszystko, co wiąże się z teorią pracy z narzędziem curl, teraz czas przejść do praktyki i przyjrzeć się przykładom polecenia curl. Najczęstszym zadaniem jest to. Pobieranie pliku jest bardzo proste. Aby to zrobić, po prostu przekaż nazwę pliku lub stronę HTML do narzędzia w parametrach: curl https://raw.githubusercontent.com/curl/curl/master/README.md Ale tutaj czeka na Ciebie niespodzianka: cała zawartość pliku zostanie wysłana na standardowe wyjście. Aby zapisać go do dowolnego pliku, użyj: curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md A jeśli chcesz, aby wynikowy plik miał taką samą nazwę jak plik na serwerze, użyj opcji -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 W razie potrzeby jednym poleceniem możesz pobrać kilka plików: curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README Kolejną rzeczą, która może być przydatna dla administratora, jest pobieranie pliku tylko wtedy, gdy został on zmodyfikowany: curl -z 21-grudzień-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README Możesz ograniczyć prędkość pobierania do wymaganego limitu, aby nie przeciążać sieci za pomocą opcji -Y: curl --limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz Tutaj musisz określić liczbę kilobajtów na sekundę, które można pobrać. Możesz także zakończyć połączenie, jeśli prędkość nie jest wystarczająca, użyj w tym celu opcji -Y: curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md curl -T login.txt ftp://speedtest.tele2.net/upload/ Ewentualnie sprawdźmy, czy plik jest wysyłany przez HTTP; jest do tego specjalna usługa: curl -T ~/login.txt http://posttestserver.com/post.php W odpowiedzi narzędzie poinformuje Cię, gdzie możesz znaleźć pobrany plik. Metodą POST możesz przesyłać nie tylko pliki, ale także dowolne dane. Przypomnę, że tą metodą służy do przesyłania danych w różnych formach. Aby wysłać takie żądanie, użyj opcji -d. Do testów będziemy korzystać z tej samej usługi: curl -d "field1=val&fileld2=val1"http://posttestserver.com/post.php Jeśli nie jesteś zadowolony z tej opcji przesyłania, możesz udawać, że wysyłasz formularz. Istnieje opcja -F: curl -F "hasło=@pass;type=text/plain" http://posttestserver.com/post.php Tutaj przekazujemy pole hasła z formularzem w postaci zwykłego tekstu, w ten sam sposób można przekazać kilka parametrów. Pliki cookies wykorzystywane są przez strony internetowe do przechowywania określonych informacji po stronie użytkownika. Może to być konieczne na przykład w celu uwierzytelnienia. Możesz wysyłać i odbierać pliki cookie za pomocą curl. Aby zapisać otrzymane Cookies do pliku należy skorzystać z opcji -c: curl -c cookie.txt http://posttestserver.com/post.php Następnie możesz odesłać plik cookie curl: curl -b cookie.txt http://posttestserver.com/post.php Nie zawsze koniecznie potrzebujemy zawartości strony. Czasami tylko nagłówki mogą być interesujące. Aby wyświetlić tylko je, dostępna jest opcja -I: curl -I https://site A opcja -H pozwala wysłać kilka lub więcej na serwer, na przykład możesz przekazać nagłówek If-Modified-Since, aby strona została zwrócona tylko wtedy, gdy została zmodyfikowana: Jeśli serwer wymaga jednego z popularnych typów uwierzytelniania, takiego jak HTTP Basic lub FTP, wówczas curl z łatwością poradzi sobie z tym zadaniem. Aby określić szczegóły uwierzytelniania, po prostu podaj je oddzielone dwukropkiem w opcji -u: curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt Uwierzytelnianie na serwerach HTTP zostanie przeprowadzone w ten sam sposób. Jeśli do pobierania plików potrzebujesz użyć serwera proxy, jest to również bardzo proste. Wystarczy podać adres serwera proxy w opcji -x: curl -x proxysever.test.com:3128 http://google.co.in W tym artykule przyjrzeliśmy się, jak używać curl, dlaczego to narzędzie jest potrzebne i jego główne możliwości. Pomimo podobieństwa, są bardzo różne. Polecenie curl linux jest przeznaczone bardziej do analizowania i symulowania różnych działań na serwerze, podczas gdy wget jest bardziej odpowiedni do pobierania plików i przeszukiwania witryn. W tym artykule omówimy tak potężne narzędzie jak cURL, a także bibliotekę dla PHP, która zapewnia dostęp do tego narzędzia - libcurl. Po co to wszystko? Aby komunikować się z serwerem za pomocą protokołów przesyłania danych, na przykład http lub ftp. Reszta protokołów nie jest dla nas szczególnie interesująca, jeśli ktoś chce głębiej zagłębić się w ten temat, będzie musiał dokopać się do anglojęzycznych zasobów i w tym artykule znajdą się podstawy i przykłady użycia. Zatem biblioteka libcurl zapewnia nam możliwość przesyłania danych do serwera i otrzymywania od niego odpowiedzi. Co nam to daje? Możliwość emulowania zachowań użytkownika lub! Możesz otrzymać zawartość stron do późniejszej analizy, możesz otrzymać nagłówki odpowiedzi serwisowych i programowo zalogować się do witryn, stworzyć skrypty do wysyłania wiadomości (na przykład na Twitterze lub na forach) lub informacji. Wszystko ogranicza tylko Twoja wyobraźnia! Pierwszą rzeczą, którą musimy zrobić, to zainstalować bibliotekę. Na moim komputerze lokalnym korzystam z kompilacji Denwer, jak zdecydowana większość początkujących webmasterów, dla których artykuł jest przeznaczony. Doświadczeni użytkownicy, którzy samodzielnie zainstalują kombinację php+apache+mysql, będą mogli zainstalować cURL, nie mnie jest im tłumaczyć, jak to się robi;) A my, początkujący, korzystamy z gotowych rozwiązań, aby to ułatwić. Dlatego zainstaluj libcurl w następujący sposób: i usuń średnik na początku terminów: ;extension=php_curl.dll Gotowy. Aby sprawdzić funkcjonalność biblioteki, możesz wywołać funkcję phpinfo() i znaleźć tam linię: obsługa cURL włączona. Gratuluję pierwszego zwycięstwa. Aby rozpocząć pracę z narzędziem, należy je zainicjować. Odbywa się to w następujący sposób: $ch = curl_init(); Użyliśmy funkcji inicjalizacji sesji cURL. W takim przypadku możesz od razu ustawić adres URL w następujący sposób: $ch = curl_init("https://strona"); Możesz to zrobić później, w opcjach. Kolejność instalowania opcji nie ma znaczenia. Odbywa się to za pomocą innej funkcji: Curl_setopt (kanał zasobu, opcja ciągu, wartość mieszana) Stworzyliśmy już pierwszy parametr tej funkcji, czyli Resource ch, tuż powyżej, ale jest tam sporo parametrów opcji i wartości. Myślę, że nie należy ich tu wszystkich kopiować-wklejać, a jedynie podać link do szczegółowego opisu funkcji, mam nadzieję, że nikt się nie obrazi: curl_setopt. Podam przykład ustawienia opcji na przykładzie adresu URL: $url = "https://strona"; curl_setopt($ch, CURLOPT_URL,$url); Jeszcze kilka przykładów ustawień opcji: pobierzmy nagłówek odpowiedzi serwera, bez pobierania samej strony: Curl_setopt($ch, CURLOPT_HEADER, 1); // przeczytaj nagłówek curl_setopt($ch, CURLOPT_NOBODY, 1); // czytaj TYLKO nagłówek bez treści Zainicjowaliśmy więc sesję, ustawiliśmy potrzebne parametry, teraz wykonujemy wynikowe żądanie, zamykamy sesję i wyświetlamy wynik: $wynik = curl_exec($ch); curl_close($ch); echo $wynik; W rezultacie otrzymujemy nasz pierwszy w pełni działający przykład wykorzystania biblioteki libcurl: $ch = curl_init(); $url = "https://strona"; curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 1); // przeczytaj nagłówek curl_setopt($ch, CURLOPT_NOBODY, 1); // czytaj TYLKO nagłówek bez treści $result = curl_exec($ch); curl_close($ch); echo $wynik; Jak to działa, mam nadzieję, jest jasne, ponieważ przyjrzeliśmy się każdemu krokowi z osobna :) W rezultacie otrzymujemy z serwera nagłówek odpowiedzi HTTP, który na pewno przeanalizujemy poniżej, aby lepiej zrozumieć wszystkie etapy interakcji pomiędzy przeglądarka i serwer: HTTP/1.1 200 OK Serwer: nginx/1.2..php 1 Wspaniały! Otrzymaliśmy nagłówek odpowiedzi z serwera i przetestowaliśmy bibliotekę w działaniu. W jaki sposób jest to dla nas przydatne? Ponieważ teraz możesz z grubsza wyobrazić sobie sekwencję działań podczas pracy z cURL: Na przykład odwiedziłem stronę ya.ru i przejrzałem wygenerowane żądanie przeglądarki oraz odpowiedź otrzymaną z serwera. Tutaj są: Wierzę, że gdy już pewne ogólne punkty są już jasne i wszystko wydaje się jasne, czas przejść do ćwiczeń i doskonalenia swoich umiejętności na przykładzie. Mnie osobiście ręce zawsze swędzą od wypróbowania wszystkiego w praktyce :) Ponieważ cURL jest tak dobry dla parserów, rozważmy funkcję pobierania kodu strony na podstawie jej adresu. W tym przypadku wynikiem będzie tablica zawierająca tytuł, zawartość strony, a nawet kody błędów, jeśli coś pójdzie nie tak. Funkcja get_web_page($url) ( $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 wersja/12.14"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // zwraca stronę internetową curl_setopt($ch, CURLOPT_HEADER, 0); // nie zwraca nagłówków curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // podąża za przekierowaniami curl_setopt($ch, CURLOPT_ENCODING, ""); // procesy wszystkie kodowania curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // limit czasu połączenia curl_setopt($ch, CURLOPT_TIMEOUT, 120); // limit czasu odpowiedzi curl_setopt($ch, CURLOPT_MAXREDIRS , 10); // zatrzymaj po 10. przekierowaniu $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"] = $treść; return $header; ) Parametry wejściowe: Z funkcji korzystamy np. w ten sposób: $result = get_web_page("https://ya.ru"); if (($result["errno"] != 0)||($result["http_code"] != 200)) ( echo $result["errmsg"]; ) else ( $strona = $result["treść "]; echo $strona; ) Wszystko powinno pójść bez błędów, a kod strony otrzymasz w zmiennej $page. Jeśli spróbujemy uzyskać nieistniejącą stronę yaaaaaaaaaaaa.ru, otrzymamy błąd: Nie można rozwiązać hosta: yaaaaaaaaaaaa.ru; Host nieznaleziony Wszystko jest przetwarzane poprawnie i pięknie :) JavaScript jest zablokowany w Twojej przeglądarce. Aby strona działała, włącz obsługę JavaScript! PHP obsługuje libcurl, bibliotekę stworzoną przez Daniela Stenberga, która umożliwia łączenie się z różnymi typami serwerów i przy użyciu różnych protokołów. Funkcje te zostały wprowadzone w PHP 4.0.2. curl_init - inicjuje sesję CURL. ratunek curl_init() Funkcjonować curl_init() inicjuje nową sesję i zwraca uchwyt CURL do użycia w funkcjach i . Jeśli opcjonalny parametr adres URL zostanie podany, wówczas opcja CURLOPT_URL otrzyma wartość tego parametru. Można go zainstalować ręcznie za pomocą pliku . curl_setopt - ustawia opcje transferu/transferu CURL. bool curl_setopt(kanał zasobu, opcja ciągu, wartość mieszana) Funkcjonować curl_setopt() ustawia opcje dla sesji CURL identyfikowanej przez parametr rozdz. Parametr opcja to opcja, którą chcesz ustawić, oraz wartość to jest wartość opcji opcja . Parametr wartość musi być długi dla następujących opcji (określonych przez parametr opcja): Parametr wartość musi być ciągiem dla następujących wartości parametrów opcja : Poniższe opcje oczekują deskryptora pliku, który jest uzyskiwany za pomocą funkcji otwórz() : Parametr wartość długi write_callback (kanał zasobu, dane ciągu znaków)( ... return strlen($data);) opcja : Parametr wartość powinna być funkcją następującej postaci string read_callback (kanał zasobu, fd zasobu, długa długość)() dla następujących wartości parametrów opcja : curl_exec - wykonuje sesję CURL. bool curl_exec(rozdz. zasobu) Tę funkcję należy wywołać po zainicjowaniu sesji CURL i ustawieniu wszystkich opcji dla tej sesji. Jego celem jest po prostu wykonanie predefiniowanej sesji CURL (określonej w parametrze rozdz). curl_close - zamyka sesję CURL. próżnia curl_close(rozdz. zasobu) Ta funkcja zamyka sesję CURL i zwalnia wszystkie zasoby. Uchwyt CURL rozdz jest również usuwany. curl_errno - zwraca liczbę całkowitą zawierającą numer ostatniego błędu. Jeśli chcesz wysłać wielowymiarową tablicę i plik w żądaniu POST, napotkasz nierozwiązywalny problem. Jeśli przekażesz tablicę wielowymiarową do CURLOPT_POSTFIELDS, drugi poziom zostanie przekazany jako ciąg znaków „Array”. Jeśli dokonasz konwersji za pomocą http_build_query, nie będziesz mógł przesłać pliku. Poniżej funkcja kodowania tablicy dwuwymiarowej z ładowaniem pliku dla Curl, która będzie działać zarówno w starszych wersjach PHP 5.3, PHP 5.4, jak i PHP 5.6 /** konwertuje tablicę wielowymiarową na tablicę jednowymiarową przy użyciu złożonych indeksów i zastępuje @ w przedrostku przez CurlFile do użycia w Curl * @param $inputArray * @param string $inputKey * @return tablica $requestVars = array („id” => tablica( 1, 2, „id”=>1234), „nazwa” => „log”, „logfile” => „@/tmp/test.log”); otrzymujemy: ["id"]=> int(1) ["id"]=> int(2) ["id"]=> int(1234) ["nazwa"]=> string(3) "log" [ "logfile"]=> string(13) "/tmp/test.log" ) */ funkcja konwertujToStringArray($inputArray, $inputKey="") ( $resultArray=; foreach ($inputArray as $key => $wartość ) ( $tmpKey = (bool)$inputKey ? $inputKey."[$key]" : $key; if (is_array($wartość)) ( $resultArray+=convertToStringArray($wartość, $tmpKey); ) elseif ($wartość = = "@")( $resultArray[$tmpKey] = (class_exists(" CURLFile ", false)) ? new CurlFile(ltrim($wartość, "@")): $wartość; ) else ( $resultArray[$tmpKey ] = $wartość; ) ) return $resultArray; ) // sprawdź $requestVars = array("id" => array(1, 2,"id"=>1234), "name" => "log", "logfile " => "@/tmp/test.log"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "witryna"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, konwertujToStringArray($requestVars)); $res = curl_exec($ch); curl_close($ch); Przykłady zastosowań wykorzystania Curl
$ch = curl_init();
print_r($_POST);
print_r($_FILES);
*/
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
?>
Notatki
Dlaczego cURL?
Podstawy curla
// 1. inicjalizacja $ch = curl_init(); // 2. ustaw opcje, w tym adres URL curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. wykonanie żądania i otrzymanie odpowiedzi $output = curl_exec($ch); // 4. czyszczenie zasobów curl_close($ch); Śledzenie błędów
Uzyskiwanie informacji o żądaniu
Śledzenie przekierowań, w zależności od przeglądarki
Wysyłanie żądań POST
Przesyłanie plików
Wiele Curl
Sprawdzanie linków zewnętrznych w WordPress
Inne funkcje cURL w PHP
Uwierzytelnianie HTTP
Prześlij przez FTP
Korzystanie z serwera proxy
Funkcje wywołania zwrotnego
Wniosek
polecenie zwijania
Jak używać curla?
Ograniczenie prędkości
Przesyłanie plików
Wysyłanie danych POST
Wysyłanie i odbieranie plików cookie
Transmisja i analiza nagłówka
uwierzytelnianie curl
Korzystanie z serwera proxy
wnioski
Czym dokładnie są cURL i libcurl? Ogólne uwagi
Instalowanie cURL na Denwer (Denver). Jak zacząć korzystać z libcurl?
Opis cURL i pierwsze kroki
Struktura nagłówka żądania HTTP
Wniosek
GET / HTTP/1.1 - Próbujemy uzyskać stronę w /, czyli stronę główną znajdującą się w katalogu głównym folderu. Używamy protokołu w wersji 1.1.
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Wersja/12.14— Przedstawiamy się serwerowi, jesteśmy przeglądarką Opera.
Host: ya.ru — nazwa domeny żądanego zasobu.
Akceptuj: tekst/html, aplikacja/xml;q=0.9, aplikacja/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1— Lista akceptowalnych formatów zasobów.
Zaakceptuj język: ru-RU,ru;q=0,9,en;q=0,8— Lista obsługiwanych języków.
Akceptuj-kodowanie: gzip, deflate— Obsługiwane metody kodowania.
Cookie: yandexuid=ХХХХХ - Pliki cookie, jeśli to konieczne.
Połączenie: Keep-Alive — nie przerywaj połączenia i pozostań w kontakcie.
Odpowiedź
HTTP/1.1 200 Ok - Otrzymujemy odpowiedź z kodem 200, co oznacza, że wszystko jest w porządku.
Serwer: nginx - Serwer się przedstawił - to jest nginx.
Data: niedziela, 10 marca 2013, 14:10:50 GMT— Bieżąca data i godzina na serwerze.
Typ zawartości: tekst/html; zestaw znaków=UTF-8— Typ treści i kodowanie.
Połączenie: zamknij - Serwer nie chce utrzymywać z nami stałego połączenia, więc natychmiast je zamyka. Dla następnego żądania zostanie nawiązane nowe połączenie.
Kontrola pamięci podręcznej: brak pamięci podręcznej, brak sklepu, maksymalny wiek = 0, należy ponownie sprawdzić— Zarządzanie buforowaniem. W tym przypadku jest ona wyłączona.
Wygasa: niedziela, 10 marca 2013, 14:10:50 GMT— Data przewidywanego zakończenia sesji. W naszym przypadku pokrywa się to z godziną otwarcia, ponieważ serwer natychmiast ją zamknął, zaraz po przetworzeniu.
Ostatnia modyfikacja: niedziela, 10 marca 2013, 14:10:50 GMT— Czas ostatniej modyfikacji.
Content-Encoding: gzip — Metoda kodowania informacji.
Pełną listę wszystkich parametrów, które można znaleźć w nagłówku żądania HTTP można znaleźć na Wikipedii.
Teraz masz ogólne pojęcie o tym, jak Twoja przeglądarka i serwer WWW komunikują się ze sobą. Warto to wiedzieć i zrozumieć, ponieważ spróbujemy emulować działania przeglądarki za pomocą biblioteki libcurl. Zacząć robić.Przykład współpracy z biblioteką
url — adres strony lub witryny.
Wartości parametrów wyjściowych (tablica z trzema elementami):
header['errno'] - jeśli coś poszło nie tak, pojawi się tutaj kod błędu.
header[‚errmsg’] – tutaj pojawi się tekst błędu.
nagłówek['treść'] - rzeczywista strona\plik\obraz itp.
Następnie możesz zrobić co chcesz z kodem strony, na przykład przeanalizować go za pomocą wyrażeń regularnych. Ale to wszystko w następnych lekcjach, ale na razie na tym poprzestańmy.Kędzior
libcurl obsługuje obecnie protokoły http, https, ftp, gopher, telnet, dict, file i ldap.
Biblioteka libcurl obsługuje także certyfikaty HTTPS, HTTP POST, HTTP PUT, przesyłanie FTP (można to również zrobić za pomocą rozszerzenia PHP ftp), przesyłanie w oparciu o formularz HTTP, serwery proxy, pliki cookie i uwierzytelnianie użytkownika + hasło.curl_init
Opis
curl_setopt
Opis
curl_exec
Opis
curl_close
Opis
curl_errno
Opis
Przykład 1: Inicjowanie nowej sesji CURL i pobieranie strony internetowej.
Przykład 2: Użycie modułu CURL PHP do pobrania example.com
Przykład 3: Sprawdzanie dostępności adresu URL za pomocą PHP CURL
Przykład 4: Oddzielenie nagłówka od treści uzyskanej za pomocą PHP CURL
Przykład 5: Określanie adresu URL odsyłającego za pomocą PHP CURL
problem: curl_setopt($ch,FOLLOW_LOCATION,1); błąd: problem z open_basedir i Safe_mode rozwiązanie: funkcja już opracowana przez kogoś rozwiązanie nr 2: ta sama funkcja, zmodyfikowana, działa świetnie dla mnie..= $curl_max_loops) ( $curl_loops = 0; zwróć FALSE; ) curl_setopt($ch, CURLOPT_HEADER, prawda); curl_setopt($ch, CURLOPT_RETURNTRANSFER, prawda); $dane = curl_exec($ch); list($nagłówek, $dane) = eksploduj("\n\n", $dane, 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) ( //nie udało się przetworzyć adresu URL w celu przekierowania do $curl_loops = 0; return $data; ) $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)) ; if (!$url["schemat"]) $url["schemat"] = $last_url["schemat"]; if (!$url["host"]) $url["host"] = $last_url[ "host"]; if (!$url["ścieżka"]) $url["ścieżka"] = $last_url["ścieżka"]; $nowy_url = $url["schemat"] . "://" . $ url["host"] .$url["ścieżka"] .($url["zapytanie"]?"?".$url["zapytanie"]:""); curl_setopt($ch, CURLOPT_URL, $nowy_url) ; debug("Przekierowanie do", $new_url); return curl_redir_exec($ch); ) else ( $curl_loops=0; return $data; ) ) ?>
po prostu użyj tej funkcji bez FOLLOW_LOCATION i powinno działać. problem polegał na tym, że gdy dojdziesz do wiersza, w którym zwracasz dane, jeśli http_code był inny niż 301 oe 302, $data zawiera nieaktualne informacje lub nie zawiera ich wcale. więc $debbbb wykonuje zadanie. Przykład 6: Parsowanie pliku cookie z nagłówka przy użyciu CURL PHP
Czasami nie możesz użyć CURLOPT_COOKIEJAR i CURLOPT_COOKIEFILE ze względu na ustawienia php serwera (mówią, że możesz pobrać dowolne pliki z serwera używając tych opcji). Oto rozwiązanie 1) Nie używaj CURLOPT_FOLLOWLOCATION 2) Użyj curl_setopt($ch, CURLOPT_HEADER, 1) 3)Pobierz z nagłówka pliki cookie w następujący sposób: preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $results); 4) Ustaw je za pomocą curl_setopt($ch, CURLOPT_COOKIE, $cookies); Przykład 7: Analizowanie pliku cookie z nagłówka przy użyciu CURL PHP
Jak wspomniał wcześniej Yevgen, czasami nie możemy używać CURLOPT_COOKIEJAR i CURLOPT_COOKIEFILE. Poniżej znajduje się funkcja wywołania zwrotnego nagłówka, którą napisałem w styczniu, która pozwala na przechowywanie plików cookie pomiędzy żądaniami cURL. Pliki cookie są dodawane do $ch podczas wszystkich żądań, nawet podczas przekierowania, więc możesz użyj go razem z CURLOPT_FOLLOWLOCATION.Oto kod: funkcja read_header($ch, $string) ( global $location; #śledź lokalizację/przekierowania global $cookiearr; #store cookies tutaj global $ch; # ^zastępuje parametr funkcji $ch # to jest w porządku, ponieważ musimy # zaktualizować globalny $ch o # nowe pliki cookie $length = strlen($string); if(!strncmp($string, "Location:", 9)) ( #śledź ostatnie przekierowanie $lokalizacja = trim(substr($string, 9, -1)); ) if(!strncmp($string, "Set-Cookie:", 11)) ( #pobierz plik cookie $cookiestr = trim(substr( $string, 11, -1)); $cookie = eksploduj(";", $cookiestr); $cookie = eksploduj("=", $cookie); $cookiename = trim(array_shift($cookie)); $cookiearr [$cookiename] = trim(implode("=", $cookie)); ) $ciastko = ""; if(trim($string) == "") ( #wykonaj tylko na końcu nagłówka foreach ($cookiearr as $key=>$value) ( $cookie .= "$key=$value; "; ) curl_setopt ($ ch, CURLOPT_COOKIE, $cookie); ) return $długość; ) curl_setopt($ch, CURLOPT_HEADERFUNCTION, "nagłówek_czytania"); Ten kod zakłada, że będziesz ponownie używać $ch bez inicjowania go za każdym razem (wywołaj curl_init tylko raz, na początku). Jeśli zajdzie potrzeba ponownej inicjalizacji $ch w dowolnym momencie kodu, możesz uzyskać dostęp do aktualnie przechowywanych plików cookie w $cookiearr i dołączyć je do nowego $ch. Napisałem tę funkcję, zanim miałem wystarczające doświadczenie z wyrażeniami regularnymi, więc nie znajdziesz tutaj żadnych wywołań preg_match. Używam tego kodu od dłuższego czasu i bez żadnych problemów z dostępem do Gmaila, Yahoo, Hotmaila, AOL itp., gdzie musiałem przejdź przez login i kilka stron, zanim dotrzesz do tego, czego szukałem. Przykład 8: Konfigurowanie modułu obsługi ładowania nagłówka przy użyciu CURL PHP
Korzystając z cURL, musiałem wywołać skrypt innej firmy, który zwracał dane binarne jako załącznik, aby ponownie przekazać pobrane dane jako załącznik. Problem polegał na tym, że skrypt innej firmy czasami zwracał błędy HTTP, a ja chciałem uniknąć przekazywania w takich przypadkach załączników o zerowej długości. Połączenie wywołania zwrotnego CURLOPT_FAILONERROR i CURLOPT_HEADERFUNCTION pomogło w dokładnym przetworzeniu błędów HTTP skryptu strony trzeciej: funkcja curlHeaderCallback($resURL, $strHeader) ( if (preg_match("/^HTTP/i", $strHeader)) ( header($strHeader) ); header("Dyspozycja treści: załącznik; nazwa pliku="nazwa-pliku.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 "Błąd z kodem: " . $intReturnCode; ) Przykład 9. Zapisanie strony do pliku i obliczenie szybkości transferu za pomocą CURL PHP
WritePageToFile("http://es.php.net", "es.php.net.txt"); funkcja 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 "Średnia prędkość pobierania == ". $sAverageSpeedDownload. "
"; curl_close($sh); FClose ($hFile); echo "( Zobacz plik ".$sTxtfile."" w tej samej ścieżce hostingu." "do miejsca, w którym znajduje się ten skrypt PHP).
"; echo "Średnia prędkość przesyłania == ". $sAverageSpeedUpload."
"; Echo "
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo "
";
}
Przykład 9. Odbieranie strony poprzez połączenie SSL (https)
$ch=curl_init("https://strona"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Wyłącz błąd „Problem z certyfikatem SSL, sprawdź, czy certyfikat CA jest OK” curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Wyłącz błąd „SSL: nazwa podmiotu certyfikatu „nazwa hosta.ru” nie pasuje do docelowej nazwy hosta „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); Przykład 10: Używanie sesji i plików cookie w curl
$cookie_filename=sys_get_temp_dir()+"/cookie.tmp"; $curl=curl_init("http://strona"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEJAR, $nazwa_pliku_cookie);//zapisz otrzymane pliki COOKIE do pliku curl_setopt($curl, CURLOPT_COOKIEFILE, $nazwa_pliku_cookie); //wyślij na serwer COOKIE otrzymane od niego podczas autoryzacji $out=curl_exec($curl); Przykład 11: Przesyłanie pliku i tablica wielowymiarowa w Curl. CURLOPT_POSTFIELDS + plik Curl