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.

Komentarz:

PHP automatycznie ustawia ten parametr na PRAWDA, zmień go tylko na potrzeby debugowania.

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_*.

Komentarz:

Ta opcja jest przestarzała, ponieważ nigdy nie została zaimplementowana w cURL i nie działała.

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.

Komentarz:

Nie używaj tej funkcji, dopóki nie będziesz pewien, że serwer obsługuje tego typu żądania.

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.

Komentarz:

Ponieważ ten parametr zawiera cenne hasło, pamiętaj, aby przechowywać ten skrypt PHP w bezpiecznym miejscu.

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.

Komentarz:

Funkcja wywołania zwrotnego jest wywoływana tylko wtedy, gdy opcja CURLOPT_NOPROGRESS ustawić na wartość FAŁSZ.

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
$ch = curl_init();

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

$ch = curl_init();

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

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

Curl_exec($ch);
?>

Wynik uruchomienia tego przykładu:

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

Notatki

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.

Dlaczego 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.

Podstawy curla

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:

  1. Inicjalizacja.
  2. Ustawianie opcji.
  3. Wykonanie żądania.
  4. Środki czyszczące.
// 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);

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.

Śledzenie błędó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.

Uzyskiwanie informacji o żądaniu

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:

  • „adres URL”
  • "Typ zawartości"
  • „kod http”
  • „rozmiar_nagłówka”
  • „rozmiar_żądania”
  • „czas pliku”
  • „wynik_weryfikacji_ssl”
  • „liczba_przekierowań”
  • "czas całkowity"
  • „czas_wyszukiwania_nazw”
  • „czas_połączenia”
  • „czas_przedtransferu”
  • „przesłanie rozmiaru”
  • „pobierz_rozmiar”
  • „szybkość_pobierania”
  • „szybkość_przesyłania”
  • „pobierz_długość_treści”
  • „prześlij_długość_treści”
  • „czas_rozpoczęcia transferu”
  • „czas_przekierowania”

Śledzenie przekierowań, w zależności od przeglądarki

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

Wysyłanie żądań POST

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.

Przesyłanie plików

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))

Wiele Curl

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.

Sprawdzanie linków zewnętrznych w WordPress

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):

  1. Dodajemy początkową liczbę deskryptorów, aby nie przeciążać systemu wątkami. Liczba jest kontrolowana przez zmienną $max_connections.
  2. Zmienna $curRunning przechowuje liczbę uruchomionych wątków, $running przechowuje poprzednią wartość; jeśli staną się nierówne, oznacza to, że jeden z wątków zakończył pracę.
  3. Otrzymujemy informację o zrealizowanym zgłoszeniu.
  4. Jeżeli serwer nie odpowiada, łącze nie działa.
  5. Odpowiedź serwera to 404.
  6. W przeciwnym razie link będzie działać.
  7. Żądanie zostało zrealizowane, zwalniamy zasoby.
  8. Dodajmy nowy adres URL do multi deskryptora.
  9. Funkcjonować add_url_to_multi_handle() dodaje nowy uchwyt z podanym adresem URL do multideskryptora.

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() .

Inne funkcje cURL w PHP

Uwierzytelnianie HTTP

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);

Prześlij przez FTP

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);

Korzystanie z serwera proxy

Żą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);

Funkcje wywołania zwrotnego

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.

Wniosek

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.

polecenie zwijania

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:

  • -# - wyświetlać prosty pasek postępu podczas ładowania;
  • -0 - korzystać z protokołu http 1.0;
  • -1 - użyj protokołu szyfrowania tlsv1;
  • -2 - użyj sslv2;
  • -3 - użyj sslv3;
  • -4 - użyj IPv4;
  • -6 - użyj protokołu IPv6;
  • -A- podaj swojego USER_AGENTA;
  • -B- zapisz Cookie do pliku;
  • -C- wyślij Cookie z pliku na serwer;
  • -C- kontynuuj pobieranie pliku od punktu przerwania lub określonego przesunięcia;
  • -M- maksymalny czas oczekiwania na odpowiedź z serwera;
  • -D- wysłać dane metodą POST;
  • -D- zapisz nagłówki zwrócone przez serwer do pliku;
  • -mi- ustaw pole Referer-uri wskazujące, z której strony przyszedł użytkownik;
  • -MI- użyj zewnętrznego certyfikatu SSL;
  • -F- nie wyświetlaj komunikatów o błędach;
  • -F- przesłać dane w formie formularza;
  • -G- jeżeli opcja jest włączona, to wszystkie dane określone w opcji -d będą przesyłane metodą GET;
  • -H- przesyłać nagłówki do serwera;
  • -I- odbierz tylko nagłówek HTTP i zignoruj ​​​​całą zawartość strony;
  • -J- czytać i wysyłać pliki cookie z pliku;
  • -J- usuń nagłówek z żądania;
  • -L- akceptować i przetwarzać przekierowania;
  • -S- maksymalna liczba przekierowań za pomocą Lokalizacji;
  • -o- wyjście zawartości strony do pliku;
  • -O- zapisać treść do pliku z nazwą strony lub pliku na serwerze;
  • -P- użyj proxy;
  • --proto- wskazać protokół, który ma być zastosowany;
  • -R- zapisz czas ostatniej modyfikacji zdalnego pliku;
  • -S- wyświetlać minimum informacji o błędach;
  • -S- wyświetlać komunikaty o błędach;
  • -T- wgraj plik na serwer;
  • -w- najbardziej szczegółowe dane wyjściowe;
  • -y- minimalna prędkość pobierania;
  • -Y- maksymalna prędkość pobierania;
  • -z- pobierz plik tylko wtedy, gdy został zmodyfikowany później niż w określonym czasie;
  • -V- wyświetl wersję.

To w żadnym wypadku nie są wszystkie opcje curl linux, ale zawiera listę podstaw, z których będziesz musiał skorzystać.

Jak używać curla?

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

Ograniczenie prędkości

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

Przesyłanie plików

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.

Wysyłanie danych POST

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.

Wysyłanie i odbieranie plików cookie

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

Transmisja i analiza nagłówka

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:

uwierzytelnianie curl

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.

Korzystanie z serwera proxy

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

wnioski

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.

Czym dokładnie są cURL i libcurl? Ogólne uwagi

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!

Instalowanie cURL na Denwer (Denver). Jak zacząć korzystać z libcurl?

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:

  • Pobierz gotowy pakiet rozszerzeń „PHP5: moduły dodatkowe”.
  • W związku z tym instalujemy go. Nic skomplikowanego, zgadzam się :)
  • Otwórz plik w Notatniku (zawsze polecam Notepad++): X:/webservers/usr/local/php5/php.ini //gdzie X to dysk, na którym zainstalowany jest serwer WWW

    i usuń średnik na początku terminów:

    ;extension=php_curl.dll

  • Restartujemy serwer Denver.

Gotowy. Aby sprawdzić funkcjonalność biblioteki, możesz wywołać funkcję phpinfo() i znaleźć tam linię: obsługa cURL włączona. Gratuluję pierwszego zwycięstwa.

Opis cURL i pierwsze kroki

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:

  • Zainicjuj sesję (curl_init)
  • Ustaw potrzebne nam opcje (curl_setopt)
  • Wykonaj otrzymane żądanie (curl_exec)
  • Zakończ sesję (curl_close)

Struktura nagłówka żądania HTTP

Na przykład odwiedziłem stronę ya.ru i przejrzałem wygenerowane żądanie przeglądarki oraz odpowiedź otrzymaną z serwera. Tutaj są:
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ą

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:
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.

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 :)
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.

JavaScript jest zablokowany w Twojej przeglądarce. Aby strona działała, włącz obsługę JavaScript!

Kędzior

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.
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.

Funkcje te zostały wprowadzone w PHP 4.0.2.

curl_init

curl_init - inicjuje sesję CURL.

Opis

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

curl_setopt - ustawia opcje transferu/transferu CURL.

Opis

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):

  • CURLOPT_INFILESIZE: Jeśli przesyłasz plik do zdalnej witryny, tej opcji należy użyć, aby poinformować PHP, jaki będzie oczekiwany rozmiar pliku.
  • CURLOPT_VERBOSE: Ustaw tę opcję na wartość niezerową, jeśli chcesz, aby CURL raportował wszystkie akcje.
  • CURLOPT_HEADER: Ustaw tę opcję na wartość różną od zera, jeśli chcesz, aby nagłówek był uwzględniany w wynikach.
  • CURLOPT_NOPROGRESS: Ustaw tę opcję na wartość różną od zera, jeśli nie chcesz, aby PHP wyświetlało wskaźnik postępu transferu CURL. (PHP automatycznie ustawia tę opcję na wartość różną od zera; wystarczy ją zmienić tylko podczas debugowania.)
  • CURLOPT_NIKT: Ustaw tę opcję na wartość różną od zera, jeśli nie chcesz, aby treść była uwzględniana w wynikach.
  • CURLOPT_FAILONERROR: Ustaw tę opcję na wartość różną od zera, jeśli chcesz, aby PHP po cichu zakończył działanie, jeśli zwrócony kod HTTP jest większy niż 300. Domyślnie strona jest zwracana normalnie z kodem ignorowanym.
  • CURLOPT_UPLOAD: Ustaw tę opcję na wartość różną od zera, jeśli chcesz, aby PHP przygotowało plik do przesłania.
  • CURLOPT_POST: Ustaw tę opcję na wartość różną od zera, jeśli chcesz, aby PHP wykonywał zwykły HTTP POST. Ten POST ma normalną postać application/x-www-form-urlencoded, najczęściej używaną w formularzach HTML.
  • TYLKO CURLOPT_FTPLISTONLY: Ustaw tę opcję na wartość różną od zera, a PHP wyświetli listę nazw katalogów FTP.
  • CURLOPT_FTPAPPEND: Ustaw tę opcję na wartość różną od zera, a PHP dołączy do zdalnego pliku zamiast go nadpisywać.
  • CURLOPT_NETRC: Ustaw tę opcję na wartość różną od zera, a PHP przeskanuje Twój plik ~./netrc w celu znalezienia Twojej nazwy użytkownika i hasła do zdalnej witryny, z którą się łączysz.
  • CURLOPT_FOLLOWLOCATION: Ustaw tę opcję na wartość różną od zera, aby podążała za każdym nagłówkiem „Location:” wysyłanym przez serwer jako część nagłówka HTTP (zwróć uwagę, że jest to rekurencja, PHP będzie podążać za wszystkimi wysłanymi nagłówkami „Location: „ -headers”). )
  • CURLOPT_PUT: Ustaw tę opcję na wartość różną od zera, aby HTTP PUT pliku. Plik dla PUT musi być ustawiony przy użyciu CURLOPT_INFILE i CURLOPT_INFILESIZE.
  • CURLOPT_MUTE: Ustaw tę opcję na wartość niezerową, a PHP będzie działać w ukryciu w odniesieniu do funkcji CURL.
  • CURLOPT_TIMEOUT: Przekaż parametr long jako parametr zawierający maksymalny czas w sekundach, przez jaki funkcje CURL mogą działać.
  • CURLOPT_CONNECTTIMEOUT: Podaj parametr long jako parametr zawierający maksymalny czas (w sekundach) oczekiwania podczas próby połączenia. Użyj 0, aby czekać wiecznie.
  • CURLOPT_LOW_SPEED_LIMIT: Przekaż parametr long jako parametr zawierający prędkość transferu w bajtach na sekundę, poniżej której transfer musi się odbyć podczas wykonywania CURLOPT_LOW_SPEED_TIME w sekundach, aby PHP uznał go za zbyt wolny i przerwał.
  • CURLOPT_LOW_SPEED_TIME: Przekaż parametr long jako parametr zawierający czas w sekundach, poniżej którego musi nastąpić transfer podczas działania CURLOPT_LOW_SPEED_LIMIT, aby PHP uznał go za zbyt wolny i przerwał.
  • CURLOPT_RESUME_FROM: Pass long jako parametr zawierający przesunięcie bajtu, od którego powinien rozpocząć się transfer.
  • CURLOPT_SSLVERSION: Przekaż parametr long jako parametr zawierający wersję SSL, której chcesz użyć (2 lub 3). Domyślnie PHP próbuje to określić samodzielnie, chociaż w niektórych przypadkach konieczne jest ustawienie tego ręcznie.
  • CURLOPT_SSL_VERIFYHOST: Przekaż długo, jeśli CURL powinien sprawdzić nazwę zwyczajową certyfikatu równorzędnego podczas uzgadniania SSL. Wartość 1 oznacza, że ​​powinniśmy sprawdzić istnienie nazwy pospolitej, wartość 2 wskazuje, że powinniśmy upewnić się, że jest ona zgodna z podaną nazwą hosta.
  • CURLOPT_TIMECONDITION: Przekaż parametr long jako parametr określający sposób traktowania CURLOPT_TIMEVALUE. Można ustawić ten parametr na TIMECOND_IFMODSINCE lub TIMECOND_ISUNMODSINCE. Działa to tylko w przypadku protokołu HTTP.
  • WARTOŚĆ CURLOPT_CZASU: Podaj parametr long, czyli czas w sekundach od 1 stycznia 1970. Czas ten jest używany zgodnie z opcją CURLOPT_TIMEVALUE lub zostanie użyta domyślna wartość TIMECOND_IFMODSINCE.
  • TRANSFER CURLOPT_RETURN: Podaj wartość różną od zera, jeśli chcesz, aby CURL bezpośrednio zwracał otrzymane informacje, zamiast je bezpośrednio drukować.

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() :

  • PLIK CURLOPT: Plik, w którym powinien zostać umieszczony wynik Twojego przelewu, domyślnie jest to STDOUT.
  • CURLOPT_INFILE: Plik, z którego pochodzą dane wejściowe do przesyłania.
  • CURLOPT_WRITEHEADER: Plik do nagrywania części nagłówkowej wyjścia.
  • CURLOPT_STDERR: Plik do rejestrowania błędów zamiast stderr.

Parametr wartość długi write_callback (kanał zasobu, dane ciągu znaków)( ... return strlen($data);) opcja :

  • FUNKCJA CURLOPT_WRITE: .
  • FUNKCJA CURLOPT_HEADER: .

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 :

  • FUNKCJA CURLOPT_READ: .

curl_exec

curl_exec - wykonuje sesję CURL.

Opis

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

curl_close - zamyka sesję CURL.

Opis

próżnia curl_close(rozdz. zasobu)

Ta funkcja zamyka sesję CURL i zwalnia wszystkie zasoby. Uchwyt CURL rozdz jest również usuwany.

curl_errno

curl_errno - zwraca liczbę całkowitą zawierającą numer ostatniego błędu.

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. " 
"; echo "Średnia prędkość przesyłania == ". $sAverageSpeedUpload."
"; Echo "
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo "
"; 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).
"; }
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

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