PHP CURL – функції та приклади використання. Просунуте використання cURL у PHP Curl параметри командного рядка

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

curl_setopt - Встановлює параметр для сеансу CURL

Список параметрів

Дескриптор cURL, отриманий з curl_init().

Встановлюваний параметр CURLOPT_XXX.

Значення параметра option.

bool:

Параметр Зауваження
CURLOPT_AUTOREFERER TRUEдля автоматичного встановлення поля Referer:у запитах, перенаправлених заголовком Location:.
CURLOPT_BINARYTRANSFER TRUEдля повернення необробленої відповіді під час використання константи CURLOPT_RETURNTRANSFER. З PHP 5.1.3 ця опція більше не потрібна: необроблений висновок завжди повертається під час використання опції CURLOPT_RETURNTRANSFER.
CURLOPT_COOKIESESSION TRUEдля вказівки поточного сеансу розпочати нову "сесію" cookies. Це змусить libcurl проігнорувати всі "сесійні" cookies, які вона мала б завантажити, отримані з попередньої сесії. За замовчуванням, libcurl завжди зберігає та завантажує всі cookies, незалежно від того, чи є вони сесійними чи ні. "Сесійні" cookie - це cookie без терміну закінчення, які повинні існувати тільки для поточної "сесії".
CURLOPT_CERTINFO TRUEдля виведення інформації про сертифікат SSL у потік STDERRпри безпечних з'єднаннях. Додано до cURL 7.19.1. Доступна з версії PHP 5.3.2. Для коректної роботи вимагає увімкненої опції CURLOPT_VERBOSE.
CURLOPT_CONNECT_ONLY TRUEповідомляє бібліотеці, щоб вона провела необхідні аутентифікацію проксі та налаштування з'єднання, але не передавала дані. Ця опція реалізована для HTTP, SMTP та POP3. Додано до 7.15.2. Доступна з версії PHP 5.5.0.
CURLOPT_CRLF TRUEдля перетворення кінців рядків Unix на CRLF.
CURLOPT_DNS_USE_GLOBAL_CACHE TRUEвикористання глобального кешу DNS. Цей параметр не є безпечним і за замовчуванням увімкнено.
CURLOPT_FAILONERROR TRUEдля докладного звіту при невдачі, якщо отриманий HTTP-код більше або дорівнює 400. Стандартна поведінка повертає сторінку як звичайно, ігноруючи код.
CURLOPT_FILETIME TRUEдля спроби отримання дати модифікації віддаленого документа. Це значення можна отримати за допомогою параметра CURLINFO_FILETIME з функції curl_getinfo().
CURLOPT_FOLLOWLOCATION TRUEдля дотримання будь-якого заголовка "Location: ", відправленому сервером у своїй відповіді (врахуйте, що це відбувається рекурсивно, PHP буде слідувати за всіма заголовками, що посилаються) "Location: ", за винятком випадку, коли встановлено константу CURLOPT_MAXREDIRS).
CURLOPT_FORBID_REUSE TRUEдля примусового закриття з'єднання після завершення обробки так, щоб його не можна було використовувати повторно.
CURLOPT_FRESH_CONNECT TRUEдля примусового використання нового з'єднання замість закешованого.
CURLOPT_FTP_USE_EPRT TRUEдля використання EPRT (і LPRT) при активних завантаженнях FTP. Використовуйте FALSEдля того, щоб вимкнути EPRT та LPRT та використовувати тільки PORT.
CURLOPT_FTP_USE_EPSV TRUEдля початкової спроби команди EPSV під час FTP передач. Якщо команда не вдалася, буде здійснено зворотний відкат до PASV. Встановіть у FALSEдля вимкнення EPSV.
CURLOPT_FTP_CREATE_MISSING_DIRS TRUEдля створення відсутніх директорій, якщо FTP операція виявляє неіснуючий шлях.
CURLOPT_FTPAPPEND TRUEдля запису віддаленого файлу в кінець, замість перезаписування його поверх існуючого файлу.
CURLOPT_TCP_NODELAY Задає на постійній основі чи опція TCP_NODELAY встановлена ​​чи очищена (1 = встановлена, 0 = очищена). За замовчуванням опція очищується. Доступна з версії PHP 5.2.1 для версій, зібраних з libcurl 7.11.2 або новіших.
CURLOPT_FTPASCII Псевдонім CURLOPT_TRANSFERTEXT. Використовуйте його натомість.
CURLOPT_FTPLISTONLY TRUEдля повернення тільки списку імен із FTP директорії.
CURLOPT_HEADER TRUEдля включення заголовків у висновок.
CURLINFO_HEADER_OUT TRUEдля відстеження рядка запиту дескриптора. Доступний з версії PHP 5.1.3. Префікс CURLINFO_вжито спеціально.
CURLOPT_HTTPGET TRUEдля скидання методу HTTP-запиту метод GET. Оскільки GET використовується за умовчанням, цей параметр необхідний лише у випадку, якщо метод запиту було змінено раніше.
CURLOPT_HTTPPROXYTUNNEL TRUEдля тунелювання через вказаний HTTP-проксі.
CURLOPT_MUTE TRUEдля повного вимкнення повідомлень функцій cURL. Видалено в cURL 7.15.5 (Можна використовувати опцію CURLOPT_RETURNTRANSFER)
CURLOPT_NETRC TRUEдля зчитування файлу ~/.netrc на предмет логіну та пароля для віддаленого сайту, з яким встановлюється з'єднання.
CURLOPT_NOBODY TRUEдля виключення тіла відповіді з виводу. Метод запиту встановлюється у HEAD. Зміна цього параметра FALSEне змінює його назад у GET.
CURLOPT_NOPROGRESS

TRUEдля скасування індикатора прогресу під час передачі cURL.

Зауваження:

PHP автоматично встановлює цей параметр у TRUE, змінюйте його тільки для налагоджувальних цілей.

CURLOPT_NOSIGNAL TRUEдля ігнорування будь-якої функції cURL, що надсилає сигнали PHP процесу. Цей параметр увімкнено за замовчуванням у багатопотокових SAPIs для коректної роботи таймів параметрів.
CURLOPT_POST TRUEдля використання звичайного HTTP POST. Цей метод POST використовує звичайний , що зазвичай використовується в HTML-формах.
CURLOPT_PUT TRUEдля завантаження файлу за допомогою HTTP PUT. Файл, що використовується, повинен бути встановлений за допомогою параметрів CURLOPT_INFILEі CURLOPT_INFILESIZE.
CURLOPT_RETURNTRANSFER TRUEдля повернення результату передачі як рядок з curl_exec()замість прямого виведення у браузер.
CURLOPT_SAFE_UPLOAD TRUEдля відключення підтримки префікса @ для завантажуваних файлів у CURLOPT_POSTFIELDS, Що означає, що значення, передані з @ можуть безпечно передаватися як полів. Замість префікса можна використовувати опцію CURLFile d. Додана до PHP 5.5.0 зі значенням за замовчуванням FALSE. У PHP 5.6.0 стала за умовчанням рівна TRUE.
CURLOPT_SSL_VERIFYPEER FALSEдля зупинки URL від перевірки сертифіката вузла мережі. Альтернативні сертифікати можуть бути вказані за допомогою параметра CURLOPT_CAINFOабо директорії із сертифікатами, що вказується параметром CURLOPT_CAPATH. За замовчуванням одно TRUEз версії cURL 7.10. Стандартний дистрибутив встановлюється починаючи з версії cURL 7.10.
CURLOPT_TRANSFERTEXT TRUEдля використання режиму ASCII при FTP передачах. За допомогою LDAP дані повертаються простим текстом замість HTML. У Windows системах потік STDOUTне встановлюється у бінарний режим.
CURLOPT_UNRESTRICTED_AUTH TRUEдля продовження посилки логіну та паролю при редиректах (при використанні CURLOPT_FOLLOWLOCATION), навіть за зміни імені хоста.
CURLOPT_UPLOAD TRUEдля підготовки до завантаження файлу на сервер.
CURLOPT_VERBOSE TRUEдля виведення додаткової інформації. Записує виведення у потік STDERR, або файл, вказаний параметром CURLOPT_STDERR.

Для наступних значень параметра option параметр value повинен бути типу integer:

Параметр Встановлюване значення value Зауваження
CURLOPT_BUFFERSIZE Розмір буфера, який використовується при кожному читанні. Однак, немає жодної гарантії, що цей запит буде завершено. Доданий до версії cURL 7.10.
CURLOPT_CLOSEPOLICY Одна з констант CURLCLOSEPOLICY_*.

Зауваження:

Ця опція застаріла, тому що ніколи не була реалізована в URL і не працювала.

Видалено в PHP 5.6.0.
CURLOPT_CONNECTTIMEOUT Кількість секунд очікування під час спроби з'єднання. Використовуйте 0 для нескінченного очікування.
CURLOPT_CONNECTTIMEOUT_MS Кількість мілісекунд очікування під час спроби з'єднання. Використовуйте 0 для нескінченного очікування. Якщо бібліотека libcurl скомпільована з використанням стандартного системного перетворювача імен, то з'єднання як і раніше використовуватиме повносекундне очікування як тайм-аут з мінімально допустимим тайм-аутом в 1 секунду. Доданий до версії cURL 7.16.2. Доступно з версії PHP 5.2.3.
CURLOPT_DNS_CACHE_TIMEOUT Кількість секунд, протягом яких у пам'яті зберігаються записи DNS. За промовчанням цей параметр дорівнює 120 (2 хвилини).
CURLOPT_FTPSSLAUTH Метод FTP аутентифікації (в активному режимі): CURLFTPAUTH_SSL(спочатку перевіряється SSL), CURLFTPAUTH_TLS(спочатку перевіряється TLS) або CURLFTPAUTH_DEFAULT(CURL вирішує сама). Доданий до версії cURL 7.12.2.
CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE (за замовчуванням, CURL сама вибирає використовувану версію), CURL_HTTP_VERSION_1_0 (примусове використання HTTP/1.0), або CURL_HTTP_VERSION_1_1 (примусове використання HTTP/1.1).
CURLOPT_HTTPAUTH

Можна використовувати побітовий оператор | (або) для комбінації кількох методів разом. У цьому випадку cURL опитає сервер на предмет підтримуваних методів авторизації та вибере найкращий із них.

CURLAUTH_ANY – це псевдонім CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLAUTH_ANYSAFE – це псевдонім CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLOPT_INFILESIZE Очікуваний розмір файлу в байтах при завантаженні файлу на віддалений сервер. Врахуйте, що використання цієї опції не зупинить подальшу посилку даних, що перевищують це значення, оскільки дані, що посилаються, залежать від результату CURLOPT_READFUNCTION.
CURLOPT_LOW_SPEED_LIMIT Верхній поріг швидкості передачі даних у байтах за секунду. Перевірка відбувається протягом CURLOPT_LOW_SPEED_TIMEсекунд, після чого PHP вважає передачу надто повільною та перериває її.
CURLOPT_LOW_SPEED_TIME Максимальна кількість секунд, протягом яких швидкість передачі не повинна перевищувати CURLOPT_LOW_SPEED_LIMIT, інакше PHP помітить передачу як надто повільну та припинить її.
CURLOPT_MAXCONNECTS Максимальна кількість постійних з'єднань. При досягненні ліміту для визначення з'єднання, що закривається, використовується параметр CURLOPT_CLOSEPOLICY.
CURLOPT_MAXREDIRS Максимальна кількість редиректів, що приймаються. Використовуйте цей параметр разом із параметром CURLOPT_FOLLOWLOCATION.
CURLOPT_PORT Альтернативний порт з'єднання.
CURLOPT_POSTREDIR Бітова маска, що містить 1 (301 Moved Permanently), 2 (302 Found) і 4 (303 See Other), щоб задавати чи повинен метод HTTP POST оброблятися при включеній опції CURLOPT_FOLLOWLOCATION, якщо вказаний тип перенаправлення. Додано до cURL 7.19.1. Доступно з PHP 5.3.2.
CURLOPT_PROTOCOLS

Бітова маска із значень CURLPROTO_*. Ця маска обмежує використовувані протоколи libcurl. Це дозволяє мати libcurl, що працює з великою кількістю протоколів, і обмежувати роботу певних передач тільки для деякого їхнього набору. За замовчуванням, libcurl використовує всі протоколи, що підтримуються. Дивіться також параметр CURLOPT_REDIR_PROTOCOLS.

Коректні значення протоколів: CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_TOP TO_TFTP , CURLPROTO_ALL

CURLOPT_PROXYAUTH Методи авторизації HTTP, які використовуються при з'єднанні з проксі-сервером. Використовуйте ті ж бітові маски, які були описані у параметра CURLOPT_HTTPAUTH. На даний момент для авторизації проксі підтримуються лише CURLAUTH_BASIC та CURLAUTH_NTLM. Доданий до версії cURL 7.10.7.
CURLOPT_PROXYPORT Номер порту проксі-сервера, до якого здійснюється з'єднання. Цей номер також можна встановити за допомогою параметра CURLOPT_PROXY.
CURLOPT_PROXYTYPE Або CURLPROXY_HTTP (за замовчуванням), або CURLPROXY_SOCKS5 . Доданий до версії cURL 7.10.
CURLOPT_REDIR_PROTOCOLS Бітова маска із значень CURLPROTO_*. Дана бітова маска обмежує протоколи, що використовуються libcurl при редиректі (при включеному параметрі CURLOPT_FOLLOWLOCATION). Це дозволяє обмежити набір протоколів, що використовуються при редиректах для деяких передач. За замовчуванням libcurl підтримує всі протоколи, крім FILE і SCP. У версіях, що передували 7.19.4, перенаправлення використовувалося всім протоколів без винятку. Дивіться також опис параметра CURLOPT_PROTOCOLSдля списку констант із значеннями протоколів. Доданий до версії cURL 7.19.4.
CURLOPT_RESUME_FROM Усунення початку передачі, в байтах.
CURLOPT_SSL_VERIFYHOST Використовуйте 1 для перевірки загального імені в сертифікаті SSL. Використовуйте 2 для перевірки існування спільного імені та його збігу з зазначеним хостом. У бойовому оточенні значення цього параметра має бути 2 (за замовчуванням). Підтримка значення 1 прибрана до cURL 7.28.1
CURLOPT_SSLVERSION Одна з констант 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) або CURL_SSLVERSION_TLSv1_2 (6).
CURLOPT_TIMECONDITION Спосіб трактування параметра CURLOPT_TIMEVALUE. Використовуйте CURL_TIMECOND_IFMODSINCE для повернення сторінки, тільки якщо вона була змінена з часу, вказаного у параметрі CURLOPT_TIMEVALUE. Якщо сторінку не було змінено, повернеться заголовок "304 Not Modified", маючи на увазі, що параметр CURLOPT_HEADERвстановлений в TRUE. Використовуйте CURL_TIMECOND_IFUNMODSINCE для зворотного ефекту. За промовчанням використовується CURL_TIMECOND_IFMODSINCE .
CURLOPT_TIMEOUT Максимально дозволена кількість секунд для виконання функцій cURL.
CURLOPT_TIMEOUT_MS Максимально дозволена кількість мілісекунд для виконання cURL-функцій. Якщо libcurl зібрана з використанням звичайного системного розпізнавача імен, цей проміжок з'єднання все ще буде використовувати секундне округлення таймаутів, з мінімально дозволеним таймаутом в одну секунду. Доданий до версії cURL 7.16.2. Доступний з версії PHP 5.2.3.
CURLOPT_TIMEVALUE Кількість секунд починаючи з 1 січня 1970 року. Цей час буде використано параметром CURLOPT_TIMECONDITION. За промовчанням використовується параметр CURL_TIMECOND_IFMODSINCE .
CURLOPT_MAX_RECV_SPEED_LARGE Якщо швидкість стрибки перевищить це значення (зазначене в байтах на секунду) в середньому протягом усієї передачі, то стрибка буде призупинена для підтримки середньої швидкості менше або дорівнює цьому параметру. За замовчуванням швидкість не обмежується.
CURLOPT_MAX_SEND_SPEED_LARGE Якщо завантаження на сервер перевищить це значення (зазначене в байтах на секунду) в середньому протягом усієї передачі, то завантаження буде призупинено для підтримки середньої швидкості менше або дорівнює цьому параметру. За замовчуванням швидкість не обмежується. Доданий до версії cURL 7.15.5. Доступний починаючи з версії PHP 5.4.0.
CURLOPT_SSH_AUTH_TYPES Бітова маска, що складається з однієї або більше констант: CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD. Встановіть CURLSSH_AUTH_ANYдля того, щоб libcurl вибрав одну з них самостійно. Додано до cURL 7.16.1.
CURLOPT_IPRESOLVE Дозволяє застосунку вибрати вид IP-адреси, з якою визначається ім'я хоста. Це необхідно, якщо використовується ім'я хоста, яке виходить з використанням більш ніж однієї версії IP адреси. Можливими значеннями можуть бути CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6, і за замовчуванням CURL_IPRESOLVE_WHATEVER. Додано до cURL 7.10.8.

Для наступних значень параметра option параметр value повинен бути типу string:

Параметр Встановлюване значення value Зауваження
CURLOPT_CAINFO Ім'я файлу, який містить один або більше сертифікатів, з якими звірятимуться вузли. Цей параметр має сенс лише при використанні спільно з CURLOPT_SSL_VERIFYPEER. Потребує абсолютний шлях.
CURLOPT_CAPATH Директорія містить кілька CA сертифікатів. Використовуйте цей параметр разом із CURLOPT_SSL_VERIFYPEER.
CURLOPT_COOKIE Вміст заголовка "Cookie:", який використовується в HTTP-запиті. Зверніть увагу, що кілька cookies розділяються крапкою з комою з наступним пробілом (наприклад, " fruit = apple; colour=red")
CURLOPT_COOKIEFILE Ім'я файлу, що містить cookies. Цей файл має бути у форматі Netscape або просто заголовками HTTP, записаними у файл. Якщо в якості імені файлу передано порожній рядок, то cookies зберігатися не будуть, але їхня обробка все ще буде включена.
CURLOPT_COOKIEJAR Ім'я файлу, в якому будуть збережені всі внутрішні cookie поточної передачі після закриття дескриптора, наприклад, після виклику curl_close.
CURLOPT_CUSTOMREQUEST

Власний метод запиту, який використовується замість "GET"або "HEAD"під час виконання HTTP-запиту. Це корисно при запитах "DELETE"або інших, більш рідкісних HTTP-запитах. Коректними значеннями будуть слова на кшталт "GET", "POST", "CONNECT"і так далі; тобто. не вводьте тут весь рядок із HTTP-запитом. Наприклад, вказівка "GET /index.html HTTP/1.0\r\n\"буде неправильним.

Зауваження:

Не використовуйте цю можливість, поки не переконайтеся, що сервер підтримує цей тип запиту.

CURLOPT_EGDSOCKET На кшталт CURLOPT_RANDOM_FILE, крім того, що ім'я файлу встановлюється в сокет Entropy Gathering Daemon.
CURLOPT_ENCODING Вміст заголовка "Accept-Encoding: ". Це дозволяє декодувати запит. Підтримуваним кодуванням є "identity", "deflate"і "gzip". Якщо передано порожній рядок, "" , посилається заголовок, що містить всі типи кодувань, що підтримуються. Доданий до версії cURL 7.10.
CURLOPT_FTPPORT Значення, яке використовуватиметься для визначення IP-адреси для команди "PORT" FTP-протоколу. Команда "PORT" повідомляє серверу, з якою IP-адресою він повинен встановлювати з'єднання. Це може бути IP-адреса, ім'я хоста, ім'я мережного інтерфейсу (під Unix), або просто "-" для використання системної IP-адреси за промовчанням.
CURLOPT_INTERFACE Ім'я мережного інтерфейсу. Може бути ім'ям інтерфейсу, IP-адресою або ім'ям хоста.
CURLOPT_KEYPASSWD Пароль, який потрібний для використання приватного ключа CURLOPT_SSLKEYабо CURLOPT_SSH_PRIVATE_KEYFILE. Додано до cURL 7.16.1.
CURLOPT_KRB4LEVEL Рівень безпеки KRB4 (Kerberos 4). Будь-яке з наступних значень (у порядку від слабкого до найсильнішого) коректно: "clear", "safe", "confidential", "private".. Якщо цей рядок відрізняється від даних значень, буде використано значення "private". Встановлення цього параметра NULLповністю відключить безпеку KRB4. На даний момент безпека KRB4 працює лише з FTP транзакціями.
CURLOPT_POSTFIELDS Усі дані, що передаються в HTTP POST-запиті. Щоб надіслати файл, вкажіть перед ім'ям файлу @ , а також використовуйте повний шлях до файлу. Тип файлу також можна вказати за допомогою формату " ;type=mimetype", наступним за ім'ям файлу. Цей параметр може бути переданий як url-закодований рядок, на кшталт " para1=val1¶2=val2&...", і у вигляді масиву, ключами якого будуть імена полів, а значеннями - їх вміст. Якщо value є масивом, заголовок Content-Typeбуде встановлений у значення multipart/form-data. Починаючи з версії PHP 5.2.0, при передачі файлів із префіксом @ , value має бути масивом. З версії PHP 5.5.0, префікс @ застарілий і файли можна надсилати за допомогою CURLFile. Префікс @ можна вимкнути, щоб можна було передавати значення, що починаються з @ , задавши опцію CURLOPT_SAFE_UPLOADна значення TRUE.
CURLOPT_PROXY HTTP-проксі, через який надсилаються запити.
CURLOPT_PROXYUSERPWD Логін та пароль, записані у вигляді ":" , що використовуються при з'єднанні через проксі.
CURLOPT_RANDOM_FILE Ім'я файлу, який використовується для ініціалізації генератора випадкових чисел для SSL.
CURLOPT_RANGE Діапазон даних, які потрібно завантажити у форматі "X-Y", причому X, або Y можуть бути опущені. Протокол HTTP також підтримує передачу кількох діапазонів, розділених комами, вони задаються у форматі "X-Y, N-M".
CURLOPT_REFERER Вміст заголовка "Referer:", який буде використаний у HTTP-запиті.
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 Рядок, що містить 32 шістнадцяткових цифри. Рядок повинен бути контрольною сумою за алгоритмом MD5 публічного ключа віддаленого комп'ютера і libcurl буде скидати з'єднання до віддаленого хоста до тих пір, поки контрольна сума не буде відповідати публічному ключу. Ця опція призначена лише для передачі даних за допомогою SCP та SFTP. Додано до cURL 7.17.1.
CURLOPT_SSH_PUBLIC_KEYFILE Ім'я файлу для вашого публічного ключа. Якщо не встановлено, libcurl використовує за промовчанням файл $HOME/.ssh/id_dsa.pub, якщо змінна оточення HOME встановлена ​​і файл "id_dsa.pub" у поточній директорії, якщо змінна HOME не встановлена. Додано до cURL 7.16.1.
CURLOPT_SSH_PRIVATE_KEYFILE Ім'я файлу для приватного ключа. Якщо не встановлено, libcurl використовує за замовчуванням файл $HOME/.ssh/id_dsa, якщо змінна оточення HOME встановлена ​​і файл "id_dsa" в поточній директорії, якщо змінна HOME не встановлена. Якщо файл захищений паролем, установіть пароль за допомогою CURLOPT_KEYPASSWD. Додано до cURL 7.16.1.
CURLOPT_SSL_CIPHER_LIST Список шифрів, що використовується у SSL-передачах. Наприклад, RC4-SHAі TLSv1є правильними списками шифрів.
CURLOPT_SSLCERT Назва файлу з коректно відформатованим PEM-сертифікатом.
CURLOPT_SSLCERTPASSWD Пароль, необхідний для використання сертифіката CURLOPT_SSLCERT.
CURLOPT_SSLCERTTYPE Формат сертифікату. Підтримуються формати "PEM"(за замовчуванням), "DER"і "ENG". Доданий до версії cURL 7.9.3.
CURLOPT_SSLENGINE Ідентифікатор механізму шифрування для закритого ключа SSL, вказаного у параметрі CURLOPT_SSLKEY.
CURLOPT_SSLENGINE_DEFAULT Ідентифікатор механізму шифрування, який використовується для асиметричних операцій шифрування.
CURLOPT_SSLKEY Ім'я файлу із закритим ключем SSL.
CURLOPT_SSLKEYPASSWD

Таємний пароль, необхідний для використання закритого ключа SSL, вказаного параметром CURLOPT_SSLKEY.

Зауваження:

Оскільки цей параметр містить цінний пароль, пам'ятайте, що PHP-скрипт потрібно зберігати в безпечному місці.

CURLOPT_SSLKEYTYPE Тип закритого ключа SSL, вказаного у параметрі CURLOPT_SSLKEY. Підтримуються такі типи ключів: "PEM"(за замовчуванням), "DER"і "ENG".
CURLOPT_URL URL, що завантажується. Цей параметр також може бути встановлений при ініціалізації сеансу за допомогою curl_init().
CURLOPT_USERAGENT Вміст заголовка "User-Agent: ", що надсилається в HTTP-запиті.
CURLOPT_USERPWD Логін та пароль, які використовуються при з'єднанні, вказані у форматі ":" .

Для наступних значень параметра option параметр value повинен бути масивом:

Параметр Встановлюване значення value Зауваження
CURLOPT_HTTP200ALIASES Масив HTTP 200 відповідей, які трактуватимуться коректними відповідями, а чи не помилковими. Доданий до версії cURL 7.10.3.
CURLOPT_HTTPHEADER Масив HTTP-заголовків, що встановлюються, у форматі array("Content-type: text/plain", "Content-length: 100")
CURLOPT_POSTQUOTE Масив FTP-команд, які виконуються на сервері, після виконання FTP-запиту.
CURLOPT_QUOTE Масив FTP-команд, що виконуються на сервері, перед виконанням FTP-запиту.

Для наступних значень параметра option параметр value повинен бути потоковим дескриптором (повертається, наприклад, функцією fopen()):

Параметр Встановлюване значення value
CURLOPT_FILE Файл, до якого буде записано результат передачі. За замовчуванням використовується потік виводу STDOUT(Вікно браузера).
CURLOPT_INFILE Файл, з якого потрібно читати дані, під час завантаження на сервер.
CURLOPT_STDERR Альтернативний файл для виведення помилок, що використовується замість потоку помилок STDERR.
CURLOPT_WRITEHEADER Файл, до якого буде записано заголовки поточної операції.

Для наступних значень параметра option , параметр value має бути правильним ім'ям функції або замиканням:

Параметр Встановлюване значення value
CURLOPT_HEADERFUNCTION Callback-функція приймає два параметри. Першим параметром є дескриптор cURL, другим параметром є рядок із заголовками, що записуються. Заголовки повинні бути записані за допомогою цієї callback-функції. Повинна повернути кількість записаних байт.
CURLOPT_PASSWDFUNCTION Callback-функція приймає три параметри. Першим параметром є дескриптор cURL, другим параметром є рядок із запитом пароля, третім параметром є максимальна довжина пароля. Повинна повернути рядок, який містить пароль.
CURLOPT_PROGRESSFUNCTION

Callback-функція приймає п'ять параметрів. Перший є декскриптором cURL, другий – загальною кількістю байт, яку очікується завантажити з сервера, третій – кількість вже завантажених байт, четвертий – загальна кількість байт, яку очікується відправити на сервер, та п'ятий – кількість вже відправлених байт.

Зауваження:

Callback-функція викликається тільки якщо опція CURLOPT_NOPROGRESSвстановлена ​​у значення FALSE.

Щоб скасувати передачу, можна повернути ненульове значення. У цьому випадку буде виставлено помилку CURLE_ABORTED_BY_CALLBACK.

CURLOPT_READFUNCTION Callback-функція приймає три параметри. Першим параметром є дескриптор cURL, другим параметром є ресурс потоку, переданий cURL через опцію CURLOPT_INFILE, а третім параметром є максимально дозволена кількість даних для читання. Callback-функція повинна повернути рядок, що з довжиною не перевищує запитаної кількості даних, зазвичай за допомогою читання з переданого потокового ресурсу. Повинна повернути порожній рядок для сигналу про кінець файлу EOF.
CURLOPT_WRITEFUNCTION Callback-функція приймає два параметри. Першим параметром є дескриптор cURL, а другим параметром є рядок із даними, що записуються. Дані мають бути збережені за допомогою цієї функції. Вона повинна повернути точну кількість записаних байт, інакше закачування буде перервано з помилкою.

Інші значення:

Значення, що повертаються

Повертає TRUEу разі успішного завершення або FALSEу разі виникнення помилки.

список змін

Версія Опис
5.6.0 Опція CURL_SAFE_UPLOADтепер має значення за умовчанням рівне TRUE.
5.6.0 Видалено опцію CURLOPT_CLOSEPOLICYта пов'язані з нею значення.
5.5.0 Ресурс cURL доданий першим аргументом у callback-функцію CURLOPT_PROGRESSFUNCTION.
5.5.0 Додана опція CURLOPT_SHARE.
5.3.0 Додана опція CURLOPT_PROGRESSFUNCTION.
5.2.10 Додані параметри CURLOPT_PROTOCOLSі CURLOPT_REDIR_PROTOCOLS.
5.1.0 Додані параметри CURLOPT_AUTOREFERER, CURLOPT_BINARYTRANSFER, CURLOPT_FTPSSLAUTH, CURLOPT_PROXYAUTHі CURLOPT_TIMECONDITION.
5.0.0 Додані параметри CURLOPT_FTP_USE_EPRT, CURLOPT_NOSIGNAL, CURLOPT_UNRESTRICTED_AUTH, CURLOPT_BUFFERSIZE, CURLOPT_HTTPAUTH, CURLOPT_PROXYPORT, CURLOPT_PROXYTYPE, CURLOPT_SSLCERTTYPEі CURLOPT_HTTP200ALIASES.

Приклади

Приклад #1 Ініціалізація сеансу CURL та завантаження web-сторінки

// Створення нового ресурсу 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);
?>

Результат виконання цього прикладу:

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

Примітки

Зауваження:

Передача масиву в CURLOPT_POSTFIELDSзакодує дані у вигляді multipart/form-data, тоді як передача URL-кодованого рядка закодує дані у вигляді application/x-www-form-urlencoded.

cURL – це інструмент, що дозволяє взаємодіяти з різними серверами та підтримує безліч протоколів: HTTP, FTP, TELNET та ін. Спочатку cURL – це службова програма для командного рядка. Але, на щастя для нас, PHP підтримує роботу з бібліотекою cURL. У статті ми розглянемо нетривіальні приклади роботи з cURL.

Чому cURL?

Насправді, є багато інших способів відправити запит на інший сервер, щоб, наприклад, отримати вміст сторінки. Багато, в основному через лінощі, використовують прості PHP функції замість cURL:

$content = file_get_contents("http://www.example.com"); // чи $lines = file("http://www.example.com"); // або readfile("http://www.example.com");

Однак вони не дозволяють ефективно опрацьовувати помилки. Також є ряд завдань, які їм зовсім не під силу - наприклад, робота з cookies, авторизація, запити, завантаження файлів.

cUrl – потужний інструмент, який підтримує безліч протоколів та надає повну інформацію про запит.

Основи cUrl

Перш ніж перейти до складних прикладів, розглянемо базову структуру cURL запиту PHP. Для виконання cURL запиту в PHP необхідно зробити 4 основні кроки:

  1. Ініціалізація.
  2. Встановлення опцій.
  3. Виконання запиту.
  4. Очищення ресурсів.
// 1. ініціалізація $ ch = curl_init(); // 2. встановлюємо налаштування, включаючи урл curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. виконання запиту та отримання відповіді $output = curl_exec($ch); // 4. очищення ресурсів curl_close ($ ch);

Здебільшого у цій статті ми розглядатимемо крок №2, оскільки там відбувається основна магія. Список cURL опцій дуже великий, тому всі опції розглядати сьогодні ми не будемо, а використовуємо ті, які стануть у нагоді для вирішення конкретних завдань.

Відстеження помилок

При необхідності, ви можете додати такі рядки для відстеження помилок:

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

Зверніть увагу, ми використовуємо "===" замість "==", т.к. треба відрізняти порожню відповідь сервера від булевського значення FALSE, яке повертається у разі помилки.

Отримання інформації про запит

Інший необов'язковий крок — отримання інформації про запит cURL, після його виконання.

// ... curl_exec ($ ch); $info = curl_getinfo($ch); echo "Took". $info["total_time"] . "seconds for url". $info["url"]; // ...

В результаті ви отримаєте масив із наступною інформацією:

  • "url"
  • «content_type»
  • "http_code"
  • "header_size"
  • "request_size"
  • "filetime"
  • "ssl_verify_result"
  • "redirect_count"
  • «total_time»
  • "namelookup_time"
  • "connect_time"
  • "pretransfer_time"
  • "size_upload"
  • "size_download"
  • "speed_download"
  • "speed_upload"
  • "download_content_length"
  • "upload_content_length"
  • "starttransfer_time"
  • "redirect_time"

Відстеження редиректів, залежно від браузера

У цьому прикладі ми напишемо скрипт, який визначатиме перенаправлення в залежності від різних налаштувань браузера. Наприклад, деякі сайти перенаправляють відвідувачів із мобільних пристроїв, відвідувачів з інших країн.

Ми будемо використовувати опцію CURLOPT_HTTPHEADER для встановлення наших власних заголовків, включаючи User-Agent та мову та подивимося, куди перенаправляють нас сайти.

// URLs $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // браузери $browsers = array("standard" => array ("user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6)) Gecko/20091201 Firefox/3.5. 6 (.NET CLR 3.5.30729)", "language" => "en-us,en;q=0.5"), "iphone" => array ("user_agent" => "Mozilla/5.0 (iPhone; U; CPU використовується для Mac OS X; > "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "language" => "fr,fr-FR;q=0.5")); foreach ($urls as $url) ( echo "URL: $url\n"; foreach ($browsers as $test_name => $browser) ( $ch = curl_init(); // встановимо адресу curl_setopt($ch, CURLOPT_URL, $url); ")); // вміст сторінки нам не потрібний curl_setopt($ch, CURLOPT_NOBODY, 1); // потрібні тільки заголовки curl_setopt($ch, CURLOPT_HEADER, 1); // повернемо результат, замість його виведення curl_setopt($ch, CURLOPT_RETURNTRAN , 1);$output = curl_exec($ch);curl_close($ch);// визначимо перенаправлення в HTTP заголовках?if (preg_match("! echo "$test_name: redirects to $matches\n"; ) else ( echo "$test_name: no redirection\n"; ) ) echo "\n\n";

У циклі перевіряємо браузери для кожного урла. Спочатку ми встановлюємо опції для нашого запиту: URL-адресу та тестований браузер і мову.

Т.к. ми встановили спеціальну опцію, результат виконання запиту міститиме лише HTTP заголовки. За допомогою простого регулярного виразу ми можемо перевірити, чи містить відповідь рядок «Location:».

Результат виконання скрипту:

URL: http://www.cnn.com standard: redirects to http://edition.cnn.com/ iphone: redirects to http://edition.cnn.com/ french: redirects to http://edition.cnn .com/ URL: http://www.mozilla.com standard: redirects to https://www.mozilla.org/firefox/ iphone: redirects to https://www.mozilla.org/firefox/ french: redirects to https://www.mozilla.org/firefox/ URL: http://www.facebook.com standard: redirects to https://www.facebook.com/ iphone: redirects to http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr french: no redirection

Надсилаємо POST запити

При виконанні запитів GET дані можна передавати в рядку запиту. Наприклад, коли ви шукаєте в гугле, ваш запит передається в URL:

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

Щоб отримати результат цього запиту, вам навіть не знадобиться cURL, ви можете бути лінивим і використовувати "file_get_contents()".

Але деякі HTML форми використовують метод POST. У такому разі дані надсилаються в тілі повідомлення запиту, а не URL.

Напишемо скрипт, який надсилатиме POST запити. Для початку створимо простий PHP файл, який прийматиме ці запити і повертатиме відправлені йому дані. Назвемо його post_output.php :

$url = "http://localhost/post_output.php"; $post_data = array ("foo" => "bar", "query" => "FooBar", "action" => "Submit"); $ ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // робимо запит POST curl_setopt($ch, CURLOPT_POST, 1); // додаємо дані curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;

Цей скрипт виведе:

Array (=> bar => FooBar => Submit)

Цей скрипт надіслав запит POST файлу post_output.php. який вивів вміст масиву $_POST і ми отримали цю відповідь за допомогою cURL.

Завантаження файлів

Як і в попередньому прикладі, створимо файл, який прийматиме запити, upload_output.php :

Print_r($_FILES);

І сам скрипт, що завантажує файли:

$url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar", // файл для завантаження "upload" => "@/tmp/desert.jpg"); $ ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;

Якщо ви хочете завантажити файл, все що необхідно - це передати шлях до нього, так само як звичайний параметр запиту POST, поставивши спочатку @. Результат роботи скрипту:

Array ( => Array ( => desert.jpg => application/octet-stream => /tmp/phpAhEvXy => 0 => 845941))

Multi Curl

Одна з просунутих можливостей cURL в PHP - це можливість виконання кількох запитів одночасно та асинхронно.

У звичайних умовах скрипт зупиняється і чекає на виконання запиту. І якщо вам потрібно виконати багато запитів, це може тривати багато часу, т.к. ви виконуватимете послідовно. Це обмеження можна уникнути:

// створюємо обробники $ch1 = curl_init(); $ ch2 = curl_init(); // встановлюємо налаштування 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); //create the multiple cURL handle $mh = curl_multi_init(); // додаємо обробники curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $ running = null; // виконуємо запити do ( curl_multi_exec($mh, $running); ) while ($running > 0); // звільнимо ресурси curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Ідея полягає в тому, що ви можете створити безліч cURL дескрипторів, об'єднати їх під одним мультидескриптором і виконувати їх асинхронно.

Спочатку все як і зі звичайним cURL запитом - створюється дескриптор ( curl_init() ), задаються параметри ( curl_setopt() ). Далі створюється мультидескриптор ( curl_multi_init() ) і додаються раніше створені звичайні дескриптори ( curl_multi_add_handle() ). Замість звичайного виклику curl_exec() ми будемо багаторазово викликати curl_multi_exec() Ця функція інформує нас про кількість активних з'єднань за допомогою другого параметра $running. Тому цикл працює поки $ running не стане рівним 0. І, звичайно, після закінчення роботи необхідно звільнити ресурси.

У цьому прикладі ми просто виводимо результат запитів у STDOUT. Розглянемо нетривіальний випадок застосування multiCURL.

Перевірка зовнішніх посилань у WordPress

Уявіть блог з великою кількістю постів, що містять посилання на зовнішні сайти. Деякі з цих посилань можуть бути не робітниками.

Напишемо скрипт, який знайде всі неробочі посилання та покаже їх нам.

Для початку нам необхідно витягнути всі зовнішні посилання з бази даних:

// CONFIG $ db_host = "localhost"; $ db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "сайт"); $max_connections = 10; $url_list = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $active = null; // з'єднаємося з MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Could not connect: ". not select db: " . mysql_error()); ) // беремо всі пости з посиланнями в тексті $q = "SELECT post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post" "; $r = mysql_query($q) або die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // збираємо всі посилання за допомогою регулярки if (preg_match_all("/href=\"(.*?)\"/", $d["post_content"], $matches )) ( foreach ($matches as $url) ( // фільтруємо непотрібні домени $tmp = parse_url($url); if (isset($tmp["host"])) && in_array($tmp["host"], $ excluded_domains)) ( continue; ) // збираємо разом $url_list = $url; ) ) ) // видаляємо повторення $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("No URL to check"); )

У цій частині скрипта ми просто витягуємо з бази всі зовнішні посилання. Перевіримо їх:

$mh = curl_multi_init(); // 1. додамо посилання for ($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 "==Dead URLs==\n"; echo implode("\n", $dead_urls) . "\n\n"; echo "==404 URLs==\n"; echo implode("\n", $not_found_urls) . "\n\n"; echo "==Working URLs==\n"; echo implode("\n", $working_urls); echo "\n"; // 9. додає дескриптор із заданим урлом function add_url_to_multi_handle($mh, $url_list) ( static $index = 0; // якщо ще є посилання if (isset($url_list[$index]))) ( // все як звичайно $ ch = curl_init(); // встановлюємо опції curl_setopt($ch, CURLOPT_URL, $url_list[$index]);// повертаємо, а не виводимо результат curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); ch, CURLOPT_FOLLOWLOCATION, 1);// отримуємо тільки заголовки для економії часу curl_setopt($ch, CURLOPT_NOBODY, 1);

Розглянемо код докладніше (нумерація відповідає коментарям у коді):

  1. Додаємо початкову кількість дескрипторів, щоб не перевантажувати систему потоками. Кількість регулюється змінною $max_connections.
  2. У змінній $curRunning зберігається кількість працюючих потоків, $running — попереднє значення, якщо вони стануть не рівними, то один із потоків завершив роботу.
  3. Отримуємо інформацію про виконаний запит.
  4. Якщо немає відповіді сервера, посилання не робоче.
  5. Відповідь сервера - 404.
  6. Інакше посилання працює.
  7. Запит виконаний, звільняємо ресурси.
  8. Додамо новий урл до мультидескриптора.
  9. Функція add_url_to_multi_handle() додає новий дескриптор із заданим урлом до мультидескриптора.

Запустимо скрипт:

Dead URLs== xample1234.com/ ==404 URLs== www.google.com/dsfasdfafd ==Working URLs== 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/fortwesome.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/+/ accounts.google.com/ServiceLogin?service=devconsole&passive=1209600&continue=https%3A%2F%2Fcode.google.com%2Fapis%2Fconsole%2F&followup=https%3A%2F %2Fcode.google.com%2Fapis%2Fconsole%2F daneden.github.io/animate.css/ github.com/daneden/animate.css ru2.php.net/manual/ru/function.autoload.php www.google. com/recaptcha/api/verify phpunit.de/ phpunit.de/manual/current/en/phpunit-book.html

Перевірка зайняла близько двох секунд. Запуск одночасно по 10 потоків продуктивність зростає в 10 разів, порівняно зі звичайними cURL запитами. Щоб отримати вміст відповіді сервера, використовуйте функцію curl_multi_getcontent($ch) , де $ch - дескриптор, отриманий з curl_multi_info_read() .

Інші можливості cURL у PHP

HTTP автентифікація

Якщо запит HTTP вимагає автентифікації, використовуйте наступний код:

$url = "http://www.somesite.com/members/"; $ ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // відправляємо ім'я та пароль curl_setopt($ch, CURLOPT_USERPWD, "myusername: mypassword"); // якщо дозволити редирект curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // cURL відправить пароль і після перенапруження curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);

Завантаження по FTP

У PHP є своя бібліотека для роботи з FTP, але можна використовувати cURL:

// Читаємо файл $file = fopen("/path/to/file", "r"); // урл вже містить необхідні дані $url = "ftp://username: [email protected]:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // опції curl_setopt($ch, CURLOPT 1); curl_setopt($ch, CURLOPT_INFILE, $fp); ch);curl_close($ch);

Використання проксі

Запити можна виконувати через певний proxy:

$ ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // адреса проксі curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // якщо потрібна авторизація curl_setopt($ch, CURLOPT_PROXYUSERPWD, "user:pass"); $output = curl_exec($ch); curl_close ($ ch);

Колбеки (callback functions)

Є можливість використовувати колбеки під час виконання запиту, не чекаючи на його завершення. Наприклад, під час завантаження сервера ми можемо використовувати вже отримані дані, не чекаючи повного завантаження.

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

Функція колбека повинна повертати довжину рядка для правильної роботи запиту.

Щоразу, коли буде отримано чергову частину відповіді сервера, буде викликаний колбек.

Висновок

У цій статті ми розглянули просунуті можливості cURL у PHP. Наступного разу, коли вам знадобиться робити URL-адреси, використовуйте cURL.

Нам часто доводиться завантажувати різні файли з інтернету, наприклад, файли програм, що виконуються, файли скриптів, архіви з вихідниками. Але не завжди це потрібно робити через браузер. Багато ситуаціях набагато простіше виконати всі дії через термінал. Оскільки в такий спосіб ви можете автоматизувати процес. З іншого боку, веб-майстрам іноді доводиться тестувати доступність веб-сайтів, перевіряти заголовки, що відправляються і одержуються, і багато іншого.

Для вирішення таких завдань та завдань подібного кола можна скористатися утилітою curl. Вона дозволяє вирішити набагато ширше коло завдань, серед яких навіть імітація дій користувача на сайті. У цій статті ми розглянемо, як користуватися curl, що це таке і навіщо потрібна ця програма.

Насправді, curl - це більше, ніж просто утиліта командного рядка для Linux або Windows. Це набір бібліотек, в яких реалізуються базові можливості роботи з URL-адресами сторінками та передачі файлів. Бібліотека підтримує роботу з протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а також POP3, IMAP та SMTP. Вона відмінно підходить для імітації дій користувача на сторінках та інших операцій з URL-адресами.

Підтримка бібліотеки curl була додана до різних мов програмування і платформ. Утиліта curl – це незалежна обгортка для цієї бібліотеки. Саме на цій утиліті ми і зупинимося у цій статті.

Команда curl

Перед тим як перейти до опису того, як може використовуватися команда curl linux, давайте розберемо саму утиліту та її основні опції, які нам знадобляться. Синтаксис утиліти дуже простий:

$ curl опції посилання

Тепер розглянемо основні опції:

  • -# - Відображати простий прогрес-бар під час завантаження;
  • -0 - Використовувати протокол http 1.0;
  • -1 - Використовувати протокол шифрування tlsv1;
  • -2 - Використовувати sslv2;
  • -3 - Використовувати sslv3;
  • -4 - Використовувати ipv4;
  • -6 - Використовувати ipv6;
  • -A- Вказати свій USER_AGENT;
  • -b- Зберегти Cookie у файл;
  • -c- надіслати Cookie на сервер із файлу;
  • -C- продовжити завантаження файлу з місця розриву чи зазначеного усунення;
  • -m- максимальний час очікування відповіді сервера;
  • -d- Надіслати дані методом POST;
  • -D- Зберегти заголовки, повернуті сервером у файл;
  • -e- Задати поле Referer-uri, вказує з якого сайту прийшов користувач;
  • -E- Використовувати зовнішній сертифікат SSL;
  • -f- не виводити повідомлення про помилки;
  • -F- Надіслати дані у вигляді форми;
  • -G- якщо ця опція включена, всі дані, зазначені в опції -d будуть передаватися методом GET;
  • -H- передати заголовки на сервер;
  • -I- отримувати лише HTTP заголовок, а весь вміст сторінки ігнорувати;
  • -j- прочитати та надіслати cookie з файлу;
  • -J- видалити заголовок із запиту;
  • -L- приймати та обробляти перенапрямки;
  • -s- максимальна кількість перенаправлень за допомогою Location;
  • -o- виводити контент сторінки у файл;
  • -O- Зберігати контент у файл з ім'ям сторінки або файлу на сервері;
  • -p- Використовувати проксі;
  • --proto- Вказати протокол, який потрібно використовувати;
  • -R- Зберігати час останньої зміни віддаленого файлу;
  • -s- Виводити мінімум інформації про помилки;
  • -S- Виводити повідомлення про помилки;
  • -T- Завантажити файл на сервер;
  • -v- максимально докладний висновок;
  • -y- Мінімальна швидкість завантаження;
  • -Y- максимальна швидкість завантаження;
  • -z- завантажити файл, тільки якщо він був модифікований пізніше за вказаний час;
  • -V- Вивести версію.

Це далеко не всі параметри curl linux, але тут перераховано все основне, що вам доведеться використати.

Як користуватись curl?

Ми розглянули все, що стосується теорії роботи з утилітою curl, тепер настав час перейти до практики і розглянути приклади команди curl.

Найчастіше завдання - це. Завантажити файл просто. Для цього достатньо передати утиліті у параметрах ім'я файлу або html сторінки:

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

Але тут на вас чекає одна несподіванка, весь вміст файлу буде відправлено на стандартний висновок. Щоб записати його в будь-який файл, використовуйте:

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

А якщо ви хочете, щоб отриманий файл називався так само, як файл на сервері, використовуйте опцію -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

Якщо потрібно, однією командою можна завантажити кілька файлів:

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

Ще одна річ, яка може бути корисною адміністратору, - це завантаження файлу, тільки якщо він був змінений:

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

Обмеження швидкості

Ви можете обмежити швидкість завантаження до необхідної межі, щоб не перевантажувати мережу за допомогою опції -Y:

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

Тут потрібно вказати кількість кілобайт на секунду, які можна завантажувати. Також ви можете розірвати з'єднання, якщо швидкості недостатньо, для цього використовуйте опцію -Y:

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

Передача файлів

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

Або перевіримо відправку файлу по HTTP, для цього існує спеціальний сервіс:

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

У відповіді утиліта повідомить, де ви можете знайти завантажений файл.

Надсилання даних POST

Ви можете надсилати не лише файли, але й будь-які дані методом POST. Нагадаю, що цей метод використовується для надсилання даних різних форм. Для надсилання такого запиту скористайтеся опцією -d. Для тестування будемо користуватися тим самим сервісом:

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

Якщо вас не влаштовує такий варіант відправки, ви можете вдати, що відправили форму. Для цього є опція -F:

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

Тут ми передаємо формою поле password, з типом звичайний текст, так само ви можете передати кілька параметрів.

Передача та прийом куки

Cookie або Cookie використовуються сайтами для зберігання інформації на стороні користувача. Це може бути необхідним, наприклад, для аутентифікації. Ви можете приймати та передавати cookie за допомогою curl. Щоб зберегти отримані cookie у файл, використовуйте опцію -c:

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

Потім можна відправити cookie curl назад:

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

Передача та аналіз заголовків

Не завжди нам обов'язково потрібний вміст сторінки. Іноді можуть бути цікаві лише заголовки. Щоб вивести тільки їх, є опція -I:

curl -I https://сайт

А опція -H дозволяє або кілька на сервер, наприклад, можна передати заголовок If-Modified-Since, щоб сторінка поверталася тільки якщо вона була змінена:

Аутентифікація curl

Якщо на сервері потрібна автентифікація одного з найпоширеніших типів, наприклад, HTTP Basic або FTP, то curl дуже просто може впоратися з таким завданням. Для вказівки даних аутентифікації просто вкажіть їх через двокрапку в опції -u:

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

Так само буде виконуватися аутентифікація на серверах HTTP.

Використання проксі

Якщо вам потрібно використовувати проксі сервер для завантаження файлів, це теж дуже просто. Достатньо встановити адресу проксі сервера в опції -x:

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

Висновки

У цій статті ми розглянули як користуватися curl, навіщо потрібна ця утиліта та основні її можливості. Незважаючи на свою схожість з , вони дуже відрізняються. Команда curl linux призначена більше для аналізу та імітації різних дій на сервері, тоді як wget більше підходить для завантаження файлів та краулінгу сайтів.

У цій статті йтиметься про такий потужний інструмент як cURL, а також про бібліотеку для php, яка надає доступ до цього інструменту - libcurl. Навіщо все це потрібно? Для зв'язку з сервером протоколів передачі даних, наприклад, http або ftp. Інші протоколи нам не надто цікаві, якщо хтось хоче заглиблюватися в цю тему, то доведеться вже копати англомовні ресурси, а в цій статті будуть основи та приклади використання.

Що взагалі таке cURL та libcurl? Загальні моменти

Отже, бібліотека libcurl надає можливість передачі даних на сервер, і отримання відповідей від нього. Що це нам дає? Можливість емуляції поведінки користувача або! Ви можете отримувати вміст сторінок для наступного парсингу, можете отримувати заголовки відповідей сервісу та програмно авторизуватися на сайтах, робити скрипти постінгу повідомлень (наприклад, у твіттері або на форумах) або інформації. Все обмежується лише вашою фантазією!

Установка URL на Denwer (Денвер). Як почати користуватися libcurl?

Перше, що ми маємо зробити, це встановити бібліотеку. На локальному комп'ютері я користуюся збіркою Denwer, як і переважна більшість вебмастерів-початківців, на яких і розрахована стаття. Досвідчені користувачі, які самостійно встановлюють зв'язку php+apache+mysql зможуть встановити cURL, не мені пояснювати їм як це робиться;) А ми, новачки, користуємося готовими рішеннями, щоб було простіше. Тому встановлюємо libcurl наступним чином:

  • Завантажуємо готовий пакет розширень PHP5: додаткові модулі.
  • Відповідно, встановлюємо його. Нічого складного, погодьтеся:)
  • Відкриваємо в блокноті (я завжди рекомендую Notepad++) файл: X:/webservers/usr/local/php5/php.ini //де X - ваш диск, куди встановлено вебсервер

    і прибираємо крапку з комою на початку терміни:

    ;extension=php_curl.dll

  • Робимо рестарт сервера Денвер.

Готово. Щоб перевірити працездатність бібліотеки, можете викликати функцію phpinfo() і знайти там рядок: cURL support enabled. Вітаю із першою перемогою.

Опис cURL та перші кроки

Для початку роботи з інструментом, його потрібно ініціалізувати. Робиться це так:

$ ch = curl_init();

Ми використовували функцію ініціалізації сесії cURL. При цьому можна задати URL відразу, ось так:

$ch = curl_init("https://сайт");

А можна зробити це згодом, в опціях. Порядок встановлення опцій не має значення. Робиться це іншою функцією:

Curl_setopt (resource ch, string option, mixed value)

Перший параметр цієї функції, тобто resource ch, ми вже створили трохи вище, а ось параметрів option і value дуже багато. Я думаю, що не варто копіпастить сюди їх усі, а достатньо лише дати посилання на докладний опис функції, сподіваюся ніхто не образиться: curl_setopt .

Наведу приклад установки опцій на прикладі URL:

$url = "https://сайт"; curl_setopt($ch, CURLOPT_URL, $url);

Ще кілька прикладів завдання опцій: давайте отримаємо заголовок відповіді сервера, при цьому не будемо отримувати саму сторінку:

Curl_setopt ($ ch, CURLOPT_HEADER, 1); // читати заголовок curl_setopt ($ ch, CURLOPT_NOBODY, 1); // читати ТІЛЬКИ заголовок без тіла

Отже, ми ініціалізували сесію, задали потрібні нам параметри, тепер виконуємо запит, що вийшов, закриваємо сесію і виводимо результат:

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

У результаті одержуємо наш перший повністю робочий приклад використання бібліотеки libcurl:

$ ch = curl_init(); $url = "https://сайт"; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); // читати заголовок curl_setopt ($ ch, CURLOPT_NOBODY, 1); // читати ТІЛЬКИ заголовок без тіла $result = curl_exec($ch); curl_close($ch); echo $result;

Як воно працює, сподіваюся, зрозуміло, адже ми розглянули кожен крок окремо:) В результаті ми отримуємо заголовок HTTP відповіді від сервера, який трохи нижче обов'язково розберемо, щоб краще розуміти всі етапи взаємодії браузера та сервера:

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

Чудово! Ми отримали заголовок відповіді від сервера та випробували бібліотеку у дії. Чим нам це корисно? Тим, що тепер ви приблизно уявляєте собі послідовність дій під час роботи з cURL:

  • Ініціалізувати сесію (curl_init)
  • Задати потрібні нам опції (curl_setopt)
  • Виконати отриманий запит (curl_exec)
  • Завершити сесію (curl_close)

Структура заголовка HTTP запиту

Для прикладу я звернувся до сторінки ya.ru і переглянув сформований запит браузера і отриману від сервера відповідь. Ось і вони:
Запит
GET /HTTP/1.1 - Намагаємося отримати сторінку за адресою /, тобто головну, що знаходиться в корені папки. Використовуємо протокол версії 1.1.
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14— Представляємось серверу, ми — браузер Опера.
Host: ya.ru - Доменне ім'я запитуваного ресурсу.
Accept: text/html, application/xml; q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1- Список допустимих форматів ресурсу.
Accept-Language: ru-RU, ru; q = 0.9, en; q = 0.8- Список мов, що підтримуються.
Accept-Encoding: gzip, deflate- Підтримувані способи кодування.
Cookie: yandexuid=ХХХХХ — Куки, за потреби.
Connection: Keep-Alive — Просимо не розривати з'єднання та залишатися на зв'язку.
Відповідь
HTTP/1.1 200 Ok - Отримуємо відповідь з кодом 200, значить все ОК.
Server: nginx - Сервер представився - це nginx.
Date: Sun, 10 Mar 2013 14:10:50 GMT— Поточна дата та час на сервері.
Content-Type: text/html; charset=UTF-8— Тип контенту та кодування.
Connection: close - Сервер не хоче підтримувати з нами постійного з'єднання, тому відразу ж його закриває. Для наступного запиту буде встановлено нове з'єднання.
Cache-Control: no-cache,no-store,max-age=0,must-revalidate- Управління кешуванням. У цьому випадку воно вимкнено.
Expires: Sun, 10 Mar 2013 14:10:50 GMT- Дата передбачуваного закінчення терміну дії сесії. У нашому випадку воно збігається з часом відкриття, тому що сервер відразу його закрив, відразу після обробки.
Last-Modified: Sun, 10 Mar 2013 14:10:50 GMT- Час останньої модифікації.
Content-Encoding: gzip - Спосіб кодування інформації.
Повний список всіх параметрів, які можна зустріти в заголовку HTTP запиту, можна переглянути на вікіпедії .
Тепер ви приблизно уявляєте як спілкуються між собою ваш браузер та web-сервер. Це дуже корисно знати та розуміти, адже ми намагатимемося емулювати дії браузера за допомогою бібліотеки libcurl. Йдемо далі.

Приклад роботи з бібліотекою

Я вважаю, що після того, як деякі загальні моменти вже зрозумілі і начебто все зрозуміло, саме час переходити до практики і на прикладі вже відточувати свою майстерність. Особисто у мене завжди відразу руки сверблять все спробувати на практиці:)

Якщо cURL такий гарний для парсерів, то розглянемо функцію отримання коду сторінки за її адресою. При цьому на виході отримаємо масив із заголовком, вмістом сторінки та навіть коди помилок, якщо щось піде не так.

Function get_web_page($url) ( $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURRAN) // повертає веб-сторінку curl_setopt($ch, CURLOPT_HEADER, 0); // не повертає заголовки curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // переходить по редиректам curl_setopt($ch, CURLOPT_ENCODING, всі кодування curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // таймати з'єднання curl_setopt($ch, CURLOPT_TIMEOUT, 120); , 10);// зупинятися після 10-го редиректу $content = curl_exec($ch); $err = curl_errno($ch); $ch); $header["errno"] = $err; $header["errmsg"] = $errmsg;

Вхідні параметри:
url – адреса сторінки або сайту.
Значення вихідних параметрів (масив із трьома елементами):
header['errno'] - якщо щось пішло не так, то буде код помилки.
header['errmsg'] — тут буде текст помилки.
header['content'] - власне сама сторінка\файл\картинка і т.д.

Використовуємо функцію, наприклад, так:

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

Все має пройти без помилок і ви отримаєте код сторінки в змінній $page. Якщо ж спробувати отримати неіснуючу сторінку yaaaaaaaaaaaa.ru, то отримаємо помилку:

Could not resolve host: yaaaaaaaaaaaa.ru; Host not found

Все обробляється коректно та красиво:)
Далі з кодом сторінки можна робити все, що завгодно, наприклад, парсить регулярками. Але це все на наступних уроках, а поки що зупинимося на цьому.

У Вас у браузері заблокований JavaScript. Дозвольте JavaScript для роботи сайту!

Curl

PHP підтримує libcurl, бібліотеку, створену Daniel "Stenberg", яка дає можливість з'єднуватися з серверами різних типів і за різними протоколами.
libcurl в даний час підтримує протоколи http, https, ftp, gopher, telnet, dict, file та ldap.
libcurl також підтримує сертифікати HTTPS, HTTP POST, HTTP PUT, завантаження по FTP (це можна зробити також РНР-розширенням ftp), завантаження на основі форм HTTP, проксі, куки та автентифікацію user+password.

Ці функції були введені у PHP 4.0.2.

curl_init

curl_init – ініціалізує CURL-сесію.

Опис

resource curl_init()

Функція curl_init()ініціалізує нову сесію та поверне CURL-дескриптор для використання у функціях , та . Якщо необов'язковий параметр urlнадано, то опція CURLOPT_URL отримає значення цього параметра. Ви можете вручну встановлювати його за допомогою функції.

curl_setopt

curl_setopt - встановлює настройки для CURL-трансфера/transfer.

Опис

bool curl_setopt(Resource ch, string option, mixed value)

Функція curl_setopt()встановлює опції для CURL-сесії, що ідентифікується параметром ch. Параметр optionє опцією, яку ви хочете встановити, а valueце значення опції option .

Параметр valueмає бути long для наступних опцій (специфікованих параметром option):

  • CURLOPT_INFILESIZE: Якщо ви вивантажуєте файл на віддалений сайт, ця опція повинна використовуватися для того, щоб повідомити PHP, який буде очікуваний розмір infile.
  • CURLOPT_VERBOSE: Встановіть цю опцію у ненульове значення, якщо ви хочете, щоб CURL повідомляла про всі дії.
  • CURLOPT_HEADER: Встановіть цю опцію у ненульове значення, якщо ви хочете, щоб шапка/header вмикалася у висновок.
  • CURLOPT_NOPROGRESS: Встановіть цю опцію у ненульове значення, якщо ви не бажаєте, щоб PHP виводив індикатор процесу CURL-трансфера. (PHP автоматично встановлює цю опцію в ненульове значення, змінювати її необхідно лише за налагодження.)
  • CURLOPT_NOBODY: Встановіть цю опцію у ненульове значення, якщо ви не бажаєте, щоб тіло/body вмикалося у висновок.
  • CURLOPT_FAILONERROR: Встановіть цю опцію в ненульове значення, якщо ви хочете, щоб PHP завершував роботу приховано, якщо HTTP-код, що повертається, має значення вище 300. За замовчуванням сторінка повертається нормально з ігноруванням коду.
  • CURLOPT_UPLOAD: Встановіть цю опцію у ненульове значення, якщо ви хочете, щоб PHP готував файл до розвантаження.
  • CURLOPT_POST: Встановіть цю опцію у ненульове значення, якщо ви хочете, щоб PHP виконував регулярний HTTP POST. Цей POST має нормальний вигляд application/x-www-form-urlencoded , який найчастіше використовується HTML-формами.
  • CURLOPT_FTPLISTONLY: Встановіть цю опцію в ненульове значення, і PHP виводить листинг імен FTP-директорії.
  • CURLOPT_FTPAPPEND: Встановіть цю опцію в ненульове значення, і PHP приєднуватиме до видаленого/remote файлу, замість його перезапису.
  • CURLOPT_NETRC: Встановіть цю опцію в ненульове значення, і PHP скануватиме ваш файл ~./netrc з метою пошуку ваших username і password для віддаленого сайту, з яким ви встановлюєте з'єднання.
  • CURLOPT_FOLLOWLOCATION: Встановіть цю опцію в ненульове значення, щоб дотримуватися будь-якого "Location: " header, який сервер висилає як частину HTTP header" (зауважте, що це рекурсія, PHP буде слідувати за всіма "Location: "-header", які надсилаються. )
  • CURLOPT_PUT: Встановіть цю опцію у ненульове значення, щоб HTTP PUT файл. Файл для PUT може бути встановлений з допомогою CURLOPT_INFILE і CURLOPT_INFILESIZE.
  • CURLOPT_MUTE: Встановіть цю опцію в ненульове значення, і PHP працюватиме приховано щодо CURL-функцій.
  • CURLOPT_TIMEOUT: Передає long як параметр, що містить максимальний час у секундах, який ви відводите для роботи CURL-функцій.
  • CURLOPT_CONNECTTIMEOUT: Передає long як параметр, який містить максимальний час у секундах, який ви відводите для очікування під час спроби підключення. Використовуйте 0, щоб чекати нескінченно.
  • CURLOPT_LOW_SPEED_LIMIT: Передає long як параметр, який містить швидкість трансферу в байтах за секунду, нижче якого трансфер повинен працювати в процесі виконання CURLOPT_LOW_SPEED_TIME, в секундах, щоб PHP вважав його занадто повільним і переривав його.
  • CURLOPT_LOW_SPEED_TIME: Передає long як параметр, який містить час у секундах, нижче якого трансфер повинен працювати в процесі виконання CURLOPT_LOW_SPEED_LIMIT, щоб PHP вважав його надто повільним та переривав його.
  • CURLOPT_RESUME_FROM: Передає long як параметр, який містить зміщення в байтах, з якого трансфер має стартувати.
  • CURLOPT_SSLVERSION: Передає long як параметр, який містить версію SSL (2 або 3). За промовчанням PHP намагається визначити це сам, хоча в деяких випадках ви повинні встановлювати це вручну.
  • CURLOPT_SSL_VERIFYHOST: Передає long, якщо CURL повинна перевіряти Common-ім'я peer-сертифіката в SSL handshake/"рукостискання". Значення 1 вказує, що ми повинні перевірити існування спільного /common імені, значення 2 вказує, що ми повинні переконатися у збігу з наданим hostname.
  • CURLOPT_TIMECONDITION: Передає long як параметр, який визначає, як розглядається CURLOPT_TIMEVALUE Цей параметр можна встановити для TIMECOND_IFMODSINCE або TIMECOND_ISUNMODSINCE. Це лише для HTTP.
  • CURLOPT_TIMEVALUE: Передає long як параметр, який є часом у секундах, що пройшов після 1 січня 1970 року.
  • CURLOPT_RETURNTRANSFER: Передає ненульове значення, якщо ви хочете, щоб CURL безпосередньо повертала отриману інформацію, замість друку безпосередньо.

Параметр valueмає бути рядком для наступних значень параметра option :

Наступні опції чекають на дескриптор файлу, який виходить за допомогою функції fopen() :

  • CURLOPT_FILE: Файл, куди має бути розміщений висновок вашого трансферу, за замовчуванням це STDOUT.
  • CURLOPT_INFILE: Файл, з якого надходить введення вашого трансферу
  • CURLOPT_WRITEHEADER: Файл для запису header-частини виводу
  • CURLOPT_STDERR: Файл для запису помилок замість stderr.

Параметр value long write_callback (resource ch, string data)(... return strlen($data);) option :

  • CURLOPT_WRITEFUNCTION: .
  • CURLOPT_HEADERFUNCTION: .

Параметр valueмає бути функцією наступного виду string read_callback (resource ch, resource fd, long length)()для наступних значень параметра option :

  • CURLOPT_READFUNCTION: .

curl_exec

curl_exec – виконує CURL-сесію.

Опис

bool curl_exec(Resource ch)

Ця функція повинна викликатись після того, як ви ініціалізуєте сесію CURL і всі опції цієї сесії вже встановлені. Її призначення в тому, щоб просто виконати певну CURL-сесію (задану у параметрі ch).

curl_close

curl_close – закриває CURL-сесію.

Опис

void curl_close(Resource ch)

Ця функція закриває сесію CURL та звільняє всі ресурси. CURL-дескриптор chтакож видаляється.

curl_errno

curl_errno – повертає ціле число, що містить номер останньої помилки.

Опис

Приклад 1. Ініціалізація нової сесії CURL та отримання веб-сторінки.
Приклад 2. Використання модуля РНР CURL для отримання example.com
Приклад 3. Перевірка доступності URL за допомогою CURL РНР
Приклад 4. Відділення заголовка від тіла отриманого за допомогою CURL РНР
Приклад 5. Визначення адреси переходу URL-адреси за допомогою CURL РНР
питання: curl_setopt($ch,FOLLOW_LOCATION,1); Помилка: вірно з Open_basedir and safe_mode the solution: a function already developed by someone the solution n 2: the same function, modifed, works great for me..= $curl_max_loops) ( $curl_loops = 0; return FALSE; ) curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $ data = curl_exec ($ ch); list($header, $data) = explode("\n\n", $data, 2); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 301 || $http_code == 302) ( $matches = ; preg_match("/Location:(.*?)\n/", $header, $matches); $url = @parse_url(trim (array_pop($matches)));, if (!$url) ( //couldn"t process url to redirect to $curl_loops = 0; return $data; ) $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)) ; if (!$url["scheme"]) $url["scheme"] = $last_url["scheme"]; if (!$url["host"]) $url["host"] = $last_url[ "host"]; if (!$url["path"]) $url["path"] = $last_url["path"]; url["host"] . $url["path"] . ($url["query"]?"?".$url["query"]:""); debug("Redirecting to", $new_url); return curl_redir_exec($ch); ) else ( $curl_loops=0; return $data; ) ) ?>
Just use this function without de FOLLOW_LOCATION and should work. Проблема була, якщо ви збираєтеся до лінії, де ви повертаєтеся, якщо http_code було різним, ніж 301 oe 302, $data has obsolete information or none. so $debbbb does the job.
Приклад 6. Розбір cookie із заголовка за допомогою CURL РНР
Певні часи ви можете використовувати CURLOPT_COOKIEJAR і CURLOPT_COOKIEFILE becoz of the server php-settings(They say u may grab any files з сервера використовуючи ці options). CURLOPT_HEADER, 1) 3)Grab з headers cookies як це: preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $results); 4) Set them using curl_setopt ($ ch, CURLOPT_COOKIE, $ cookies);
Приклад 7. Розбір cookie із заголовка за допомогою CURL РНР
Як ЄВГЕН mentioned earlier sometimes we can"t use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE. Below is header callback function I wrote back in January that lets you maintain cookies between curl requires to all use it together with CURLOPT_FOLLOWLOCATION.This is the code: function read_header($ch, $string) ( global $location; #keep track of location/redirects global $cookiearr; $ch # this is okay because we need to # update the global $ch with # new cookies $length = strlen($string); if(!strncmp($string, "Location:", 9)) ( #keep track of last redirect $location = trim(substr($string, 9, -1)); ) if(!strncmp($string, "Set-Cookie:", 11)) ( #get the cookie $cookiestr = trim(substr( $string, 11, -1)); $cookie = explode(";", $cookiestr); $cookie = explode("=", $cookie); [$cookiename] = trim(implode("=", $cookie)); ) $cookie = ""; if(trim($string) == "") ( #execute тільки на кінці заголовка ($cookiearr as $key=>$value) ( ​​$cookie .= "$key=$value; "; ) curl_setopt($ ch, CURLOPT_COOKIE, $cookie);) return $length; ) curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_header"); Цей код обумовлює, що ви будете використовувати $ch без запуску її протягом усього часу (call curl_init only once, in the beginning). Якщо ви потребуєте нову $ch на будь-який час у вашому коді ви можете використовувати поточно збережені cookies в $cookiearr і включати їх в новий $ch. I wrote this function before I had enough experience with regular expressions with you won"t find any preg_match calls here. go через login і кілька сторінок перед тим, як йти на те, що я мав на увазі.
Приклад 8. Установка обробника завантаження заголовка за допомогою CURL РНР
Використовуючи URL, я потребую за допомогою третього-party script, який був відновлений binary data як посилання на pass on retrieved data again as attachment. Проблема була те, що третій-party script оcasssionally відновлено HTTP errors і я хотів би, щоб пограти на zero-length attachment в такому випадку. З'єднання з використанням CURLOPT_FAILONERROR and CURLOPT_HEADERFUNCTION callback helped to process the third-party script HTTP errors можливі: функція curlHeaderCallback($resURL, $strHeader) ( if (preg_match("/^HTTP/i ); header("Content-Disposition: attachment; filename="file-name.zip""); ) return strlen($strHeader); ) $resURL = curl_init("http://сайт/"); 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 "Помилка з кодом: " . $intReturnCode; )
Приклад 9. Збереження сторінки у файл із підрахунком швидкості передачі за допомогою CURL РНР
WritePageToFile("http://es.php.net", "es.php.net.txt"); функція WritePageToFile($sHTMLpage, $sTxtfile) ( $sh = curl_init($sHTMLpage); $hFile = FOpen($sTxtfile, "w"); curl_setopt($sh, CURLOPT_FILE, $hFile); curl_setopt(_SH 0); curl_exec ($sh);
"; echo "Average speed download == " . $sAverageSpeedDownload ." 
"; echo "Average Speed ​​upload == " . $sAverageSpeedUpload ."
"; echo"
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo "
"; curl_close($sh); FClose ($hFile); echo "( Натисніть на файлі "".$sTxtfile."" в той же час, як hosting". " to where this script PHP).
"; }
Приклад 9. Отримання сторінки через з'єднання SSL (https)
$ch=curl_init("https://сайт"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Вимкнути помилку "SSL certificate problem, verify that the CA cert is OK" curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Вимкнути помилку "SSL: Certificate subject name "hostname.ru" не дає змоги target host name "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);
Приклад 10. Використання сесій та cookie у curl
$cookie_filename=sys_get_temp_dir()+"/cookie.tmp"; $curl=curl_init("http://сайт"); curl_setopt ($ curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename); // зберігати отримані COOKIE у файл curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //надсилаємо серверу COOKIE отримані від нього при авторизації $out=curl_exec($curl);
Приклад 11. Надсилання файлу та багатовимірний масив у Curl. CURLOPT_POSTFIELDS + CurlFile

Якщо Вам потрібно буде відправити в POST запиті багатовимірний масив і файл, ви зіткнетеся з нерозв'язною проблемою. Якщо передавати в CURLOPT_POSTFIELDS багатовимірний масив, другий рівень буде переданий як рядок "Array". Якщо перетворити за допомогою http_build_query, Ви не зможете передати файл.

Нижче представлена ​​функція кодування двовимірного масиву з підвантаженням файлів для Curl, яка працюватиме як у старих версіях PHP 5.3, PHP 5.4, так і PHP 5.6

/** перетворює багатовимірний масив в одномірний, використовуючи складні індекси і замінює @ в префіксі на CurlFile для використання в Curl * @param $inputArray * @param string $inputKey * @return array $requestVars = array("id" => array( 1, 2, "id"=>1234), "name" => "log", "logfile" => "@/tmp/test.log"); отримаємо: ["id"]=> int(1) ["id"]=> int(2) ["id"]=> int(1234) ["name"]=> string(3) "log" [ "logfile"]=> string(13) "/tmp/test.log" ) */ function convertToStringArray($inputArray, $inputKey="") ( $resultArray=; foreach ($inputArray as $key => $value) ( $tmpKey = (bool)$inputKey ? $inputKey."[$key]" : $key; if (is_array($value)) ( $resultArray+=convertToStringArray($value, $tmpKey); ) elseif ($value = = "@")( $resultArray[$tmpKey] = (class_exists(" CURLFile ", false)) ? new CurlFile(ltrim($value, "@")) : $value; ) else ( $resultArray[$tmpKey] = $value; ) ) return $resultArray; ) // перевіряємо $requestVars = array("id" => array(1, 2,"id"=>1234), "name" => "log", "logfile" => "@/tmp/test.log"); $ ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "сайт"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars)); $res = curl_exec($ch); curl_close($ch); Прикладні приклади використання