curl_setopt_array
(PHP 5 >= 5.1.3, PHP 7, PHP 8)
curl_setopt_array — Устанавливает несколько параметров для сеанса cURL
Описание
Список параметров
Массив ( array ), определяющий устанавливаемые параметры и их значения. Ключи должны быть корректными константами для функции curl_setopt() или их целочисленными эквивалентами.
Возвращаемые значения
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 | handle теперь ожидает экземпляр CurlHandle ; раньше, ожидался ресурс ( resource ). |
Примеры
Пример #1 Инициализация новой сессии cURL и загрузка веб-страницы
// создание нового ресурса cURL
$ch = curl_init ();
Примечания
Смотрите также
User Contributed Notes 9 notes
So something like this will definitely fail. This is because array_merge effectively resets all the keys in the array into running numbers:
In case that you need to read SSL page content from https with curl, this function can help you:
You might be tempted to use array_merge with arrays where CURLOPT constants are the keys, but beware.
([], [ CURLOPT_FOO => «foo» ], [ CURLOPT_BAR => «bar» ]);
?>
Since these constants are numeric, array_merge will happily reindex:
Once upon a time I’ve got an error like «Problem with the SSL CA cert (path? access rights?)». Since what I was doing was pretty much an administrative task with no actual security issues involved, I decided to disallow certificate validation and this is where the most interesting stuff began.
First I did it like this and it worked:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
Next I thought, «But hey, I don’t want any hardcoded stuff here. Let’s use it in a configurable way!». And so I did something like this:
// in configuration
$CURL_OPTIONS = array(CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_SSL_VERIFYHOST => 0);
And I was so happy, there was no error anymore. and do you think I was happy for a long time? If so, then you’re wrong. It stopped giving an error, while it didn’t start to work!
I checked the actual data but they were allright. Then I thought: «Is it the curl_setopt_array() problem? Let’s make it a cycle.» The way it is mentioned in this help, actually.
And. it did not work the same way as with the curl_setopt_array() call. And the data were still allright.
So, if by chance you can’t set CURL options with the curl_setopt_array() call, then now you know what to do and you know it is definitely not you who is to blame.
curl_share_setopt
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
curl_share_setopt — Установить опции разделяемого обработчика cURL
Описание
Устанавливает опции разделяемого обработчика cURL.
Список параметров
| Опция | Описание |
|---|---|
| CURLSHOPT_SHARE | Задаёт тип данных, которые необходимо разделять. |
| CURLSHOPT_UNSHARE | Задаёт тип данных, которые больше не надо разделять. |
| Значение | Описание |
|---|---|
| CURL_LOCK_DATA_COOKIE | Разделяет данные cookie. |
| CURL_LOCK_DATA_DNS | Разделяет кеш DNS. Обратите внимание, что если вы используете множественный обработчик cURL, то все добавленные обработчики по умолчанию будут разделять DNS-кеш. |
| CURL_LOCK_DATA_SSL_SESSION | Разделяет идентификаторы сессии SSL, сокращая время, затрачиваемое на подтверждение (handshake) SSL при повторном соединении к тому же самому серверу. Обратите внимание, что идентификаторы сессии SSL будут по умолчанию переиспользоваться тем же самым обработчиком. |
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 | share_handle expects a CurlShareHandle instance now; previously, a resource was expected. |
Примеры
Пример #1 Пример использования curl_share_setopt()
В этом примере мы создаём разделяемый обработчик cURL, добавляем в него два обычных обработчика и запускаем их. Они будут использовать одни и те же куки.
Curl setopt array php
Описание bool curl_setopt ( resource ch, string option, mixed value )
Для перечисленных ниже параметров, value должен быть целым числом:
CURLOPT_INFILESIZE : при закачке файла на удаленный сервер, следует использовать этот параметр для указания ожидаемого размера файла.
CURLOPT_VERBOSE : При установке этого параметра в ненулевое значение cURL будет выводить подробные сообщения о всех производимых действиях.
CURLOPT_HEADER : При установке этого параметра в ненулевое значение результат будет включать полученные заголовки.
CURLOPT_NOPROGRESS : При установке этого параметра в ненулевое значение не будет выводиться индикатор прогресса операции.
Замечание: В PHP этот параметр устанавливается в ненулевое значение по умолчнию. Изменять его значение рекомендуется только при отладке.
CURLOPT_NOBODY : При установке этого параметра в ненулевое значение результат не будет включать документ (например, вам нужно получить только заголовки).
CURLOPT_FAILONERROR : При установке этого параметра в ненулевое значение, получение HTTP кода более 300 считается ошибкой.
CURLOPT_UPLOAD : Установка этого параметра в ненулевое значение означает, что будет производиться закачка файла на удаленный сервер.
CURLOPT_FTPLISTONLY : При установке этого параметра в ненулевое значение будет получен список файлов в директории FTP сервера.
CURLOPT_FTPAPPEND : При установке этого параметра в ненулевое значение данные будут добавляться к файлу на FTP сервере, в противном случае файл будет перезаписан.
CURLOPT_NETRC : При установке этого параметра в ненулевое значение будет сделана попытка найти имя пользователя и пароль к удаленному серверу в файле
CURLOPT_FOLLOWLOCATION : При установке этого параметра в ненулевое значение, при получении HTTP заголовка «Location: » будет происходить перенаправление на указанный этим заголовком URL (это действие выполняется рекурсивно, для каждого полученного заголовка «Location:»).
CURLOPT_MUTE : При установке этого параметра в ненулевое значение, все сообщения cURL будут подавляться.
CURLOPT_TIMEOUT : Задает масимальное время выполнения операции в секундах.
CURLOPT_RESUME_FROM : Задает позицию в файле в байтах, с которой начнется передача данных.
CURLOPT_SSLVERSION : Целое число, указывающее, какую версию SSL использовать (2 или 3). По умолчанию версия SSL определяется автоматически, но в некоторых случаях требуется явное указание.
CURLOPT_TIMEVALUE : Задает время в секундах с 1 января 1970 г. Это значение будет использовано в соответствии со значением параметра CURLOPT_TIMECONDITION (по умолчанию TIMECOND_IFMODSINCE).
CURLOPT_RETURNTRANSFER : При установке этого параметра в ненулевое значение CURL будет возвращать результат, а не выводить его.
Для перечисленных ниже параметров, value должен быть строкой:
CURLOPT_USERPWD : Стока с именем пользователя и паролем в виде [username]:[password].
CURLOPT_PROXYUSERPWD : Стока с именем пользователя и паролем к HTTP прокси-серверу в виде [username]:[password].
CURLOPT_POSTFIELDS : Строка, содержащая данные для HTTP POST запроса.
CURLOPT_REFERER : Задает значение HTTP заголовка «Referer: «.
CURLOPT_USERAGENT : Задает значение HTTP заголовка «User-Agent: «.
CURLOPT_FTPPORT : Задает значение, которое будет использоваться для определения IP адреса для команды «PORT» протокола ftp. Команда «PORT» сообщает серверу, с каким IP адресом он должен устанавливать соединение. Это может быть IP адрес, имя хоста, имя сетевого интерфейса (под Unix), или просто ‘-‘ для использования IP адреса по умолчанию.
CURLOPT_COOKIE : Содержимое заголовка «Cookie: «, который будет отправлен с HTTP запросом.
CURLOPT_SSLCERT : Имя файла с сертификатом в формате PEM.
CURLOPT_COOKIEFILE : Имя файла, содержащего данные cookie. Данные могут быть либо в формате Netscape, либо просто HTTP-заголовки.
Замечание: Перед использованием этого параметра убедитесь, что сервер, к которому вы обращаетесь, поддерживает требуемый метод.
CURLOPT_PROXY : Имя HTTP прокси, через который будут направляться запросы.
CURLOPT_INTERFACE : Имя используемого сетевого интерфейса. Может быть именем интерфейса, IP адресом или именем хоста.
CURLOPT_HTTPHEADER : Массив с HTTP заголовками.
CURLOPT_QUOTE : Массив с FTP командами, которые будут выполнены перед выполнением основного запроса.
CURLOPT_POSTQUOTE : Массив с FTP командами, которые будут выполнены после выполнения основного запроса.
Для перечисленных ниже параметров, value должен быть дескриптором файла, возвращенным функцией fopen() :
CURLOPT_FILE : Файл, в который будет выведен результат операции. По умолчанию STDOUT.
CURLOPT_INFILE : Файл, содержащий данные для передачи.
CURLOPT_WRITEHEADER : Файл, в который будут выведены полученные заголовки.
CURLOPT_STDERR : Файл, в который будут выводиться сообщения об ошибках. По умолчанию STDERR.
Пример 1. Инициализация сеанса CURL и загрузка web-страницы
| // инициализация сеанса $ch = curl_init (); cURL в PHP: примеры POST, GET запросов с headers, cookie, JSON и многопоточностьюВ этой статье мы рассмотрим эффективные приемы работы с cURL, отправление POST, GET и т.д. запросов, работу с cookie, заголовки, JSON а также в конце статьи будут некоторые полезные инструменты, которые могут значительно облегчить вам работу с HTTP запросами. GET запрос при помощи cURLДля того, чтобы отправить запрос, нужно создать объект при помощи функции curl_init(), а затем следует настроить его. Все настройки, которые вы можете найти по этой ссылке. Там вы найдете опции, которые мы будем устанавливать функцией curl_setopt, в дальнейших примерах. Пример простого GET запроса при помощи cURL: Если в результате сервер вернет нам редирект, то мы по нему автоматически не перейдем. А иногда это бывает полезно. Чтобы cURL автоматически шел по редиректу нужно установить опцию CURLOPT_FOLLOWLOCATION. С установленной опцией скрипт автоматически перейдет по вернувшемуся редиректу и вернет ответ уже с итоговой страницы. POST запрос при помощи cURLТеперь давайте отправим post запрос на адрес https://httpbin.org/anything Отлично, с GET и POST запросами в cURL мы немного освоились. Теперь разберемся с заголовками, которые мы можем отсылать в запросе. Заголовки устанавливаются при помощи опции CURLOPT_HTTPHEADER Чтобы получше узнать, для чего нужна эта опция давайте попробуем отправить POST запрос в формате JSON cURL: POST запрос в формате JSONОтличия конфигурации JSON запроса от обычного POST запроса заключается в том, что мы кодируем поля при помощи json_encode() И добавляем заголовок Content-Type: application/json cURL: GET запрос в формате JSONGET запрос в формате JSON отправляется так же как и POST запрос, просто нужно CURLOPT_CUSTOMREQUEST установить в ‘GET’ cURL и другие виды HTTP запросов: PUT, DELETE, HEAD, PATCH, OPTIONS, CONNECT и т.д.Стоп, Дмитрий, прекрати выдумывать виды запросов! Ничего я не выдумываю: HTTP протокол предполагает множество типов HTTP запросов просто POST и GET являются более распространенными. Чтобы отправить PUT запрос, нужно установить опцию CURLOPT_PUT таким образом: Это делается по тому же принципу, как и CURLOPT_POST. Но что делать с остальным зоопарком запросов? Разве у cURL есть CURLOPT_DELETE или CURLOPT_HEAD? Нет. Для того, чтобы отправлять другие виды запросов есть другая опция: CURLOPT_CUSTOMREQUEST Вместо строки curl_setopt($curl, CURLOPT_POST, true); мы явно задаем имя запроса опцией CURLOPT_CUSTOMREQUEST: Замечание: Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса. Как получить заголовки ответаВ предыдущем примере мы научились посылать заголовки. Самый правильный способ принять заголовки: Иногда можно встретить другой вариант получения заголовков ответа. К сожалению, они не совсем правильные и могут работать некорректно в некоторых случаях. Рассмотрим такой пример: Мы сначала определяем размер заголовка, с помощью CURLINFO_HEADER_SIZE затем вырезаем его из ответа. К сожалению, это может не срабатывать, когда используется прокси или в некоторых случаях редиректа. Скачивание больших файлов с помощью cURLДля того, чтобы скачать большой файл пригодится этот способ: Обратите внимание, если вы будете использовать file_get_contents для скачивания файлов, то файл сначала загружается в оперативную память, а потом сохраняется на диск. Поэтому если файл действительно большой, то скорее всего вашему серверу не хватит памяти. Также к памяти будет требователен следующий код: Здесь мы скачиваем файл при помощи cURL в оперативную память, а затем сохраняем его на диск. Не смотря на то, что этот способ не годится для скачивания больших файлов, с помощью него можно вполне сохранить простую веб страницу. Параллельные cURL запросы в PHPДля чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов: И если мы будем по очереди отправлять запросы, то второй запрос начнется только после того, как закончился первый и так далее, а это существенно увеличивает время работы скрипта. Как выполнить 3 запроса одновременно? В этом нам поможет curl_multi_ Давайте решим конкретную задачу при помощи параллельных curl запросов. Нам нужно отправить одновременно 3 запроса. Такие параллельные запросы выполняются значительно быстрее чем поочередные. cURL запросы с сохранением и загрузкой cookie из файлаcURL позволяет нам установить cookie при передачи запросов, а также автоматически принимать и устанавливать cookie, которые нам возвращает сервер, сохраняя их между запросами. Давайте рассмотрим такой пример: Теперь cookie у нас хранятся в файле cookie.txt в директории со скриптом (если вы ничего не меняли). Если мы совершаем повторные запросы, то cURL автоматически берет и отправляет cookie на сервер, как и обычный браузер. Таким образом мы можем авторизироваться на сайте и сохранить сеанс между запросами. Передача cookie без файловИммитация браузера с помощью cURLИногда сайт, к которому мы обращаемся может фильтровать запросы, защищаясь от парсинга. Если для этого используются упрощенные способы защиты, например проверка User-Agent, то мы можем легко притвориться, что являемся реальным польователем, который взаимодействует с сайтом через браузер, мы можем послать заголовки и cookie, которые обычно посылает браузер. В данном примере установлены заголовки, которые посылает Chrome. В простых ситуациях этого хватает. Но если используется защита при помощи javascript или что-то более продвинутое, то здесь cURL бессилен, и следует использовать либо BAS либо Zennoposter. Либо если вы хотите попытать счастье с PHP, то Selenium. Не используйте эти знания в противоправных целях. cURL запросы через проксиПростой пример для отправки запросов через proxy. Если ваш прокси предполагает авторизацию, то раскомментируйте соответствующие строчки. Отправка файловАвторизация с помощью cURLHTTP АвторизацияЧтобы с помощью cURL авторизироваться на сайте, который использует Basic HTTP-аутентификацию нужно установить опцию CURLOPT_USERPWD, в которой будет наш логин и пароль. OAuth авторизацияАвторизация через формуДавайте применим полученные нами знания и авторизируемся на каком-нибудь сайте. Для этого нужно посмотреть куда форма отправляет данные и отправить туда то же самое. Допустим на сайте есть такая форма: Тогда наш cURL запрос должен быть сформирован так: Автоматическое построение запросовПеревод консольной команды curl в PHPИ вот еще один сервис, который переводит консольную команду curl в PHP: https://incarnate.github.io/curl-to-php/ Так вы можете создать простые запросы на cURL в PHP не создавая их вручную. ЛайфхакВ консоли браузера, во вкладке сеть, вы можете кликнуть правой кнопкой мыши и скопировать любой запрос в виде команды cURL, а потом с помощью сервиса curl-to-php перевести запрос в PHP. Теперь вы вообще можете сконвертировать в cURL абсолютно любой запрос, который посылает ваш браузер. Как работать с cURL гораздо прощеВы можете спросить: почему у cURL такие кривые и страшные методы? У вас может возникнуть желание взять и создать обертку для работы с cURL, чтобы вы могли не писать каждый раз большие куски некрасивого кода, а писать все проще, например так: К счастью, такая обертка уже написана и найти ее можно здесь: https://github.com/php-curl-class/php-curl-class Просто установите ее при помощи: composer require php-curl-class/php-curl-class и не работайте с кривыми кусками кода, которые таковы вероятно потому, что cURL изначально консольное приложение. POST и GET запросы без cURLС помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents. При помощи file_get_contents мы также можем отправить POST запрос. Подробнее о том, какие опции можно передавать в stream_context_create, вы можете изучить здесь: http://docs.php.net/manual/ru/context.http.php Другие инструменты для работы с запросами в PHPДля работы с запросами есть еще более мощный инструмент: Guzzle Несколько примеров на GuzzleGET запросы на GuzzleРазные типы запросов на GuzzleАсинхронные запросы на GuzzleЕсли интересно, то читайте: Guzzle Quick Start Пишите комментарии, если что-то осталось не понятно. Posting an array with curl_setoptThe attached code is returning «Notice: Array to string conversion in. «. Simply my array is being handled to the remote server as a string containing «Array» word. the rest of the variables are fine. 5 Answers 5
The following statement: takes an array of POST parameters and for each of them there must be a string name and a STRING value. You are passing an array value instead, so the PHP processor is forced to convert it to a string using some lame built-in algorithm, which incurs issuance of the before-mentioned notice («Array to string conversion in. «). So, in order to properly pass that array ($anarray) to the other side, you have to take care of its encoding (into a string) yourself, as well as the other side has to take care of its decoding (from a string). My approach in such situations is JSON. It is suitable enough in almost all cases. All you have to do is apply the following technique: And then, on the other side of the connection you would retrieve the original array the following way: |
