Что такое curl. как работает команда curl: определение и примеры
Содержание:
- 9. Перенаправления (redirects)
- 5 последних уроков рубрики «PHP»
- Предварительные сведения
- Скрытые поля формы
- How to Read Data from a File
- Параллельные cURL запросы в PHP
- Twitter: проверяем отношения между двумя пользователями
- Как работать с cURL гораздо проще
- Что такое curl?
- Установка cURL на Denwer (Денвер). Как начать пользоваться libcurl?
- Отправить и получить cookie
- Получение и отправка заголовков
- POST запросы cUrl в PHP
- Формы
- Пару слов о других полезных опциях cURL
- curl_getinfo
- PHP cURL multiple async requests
9. Перенаправления (redirects)
Отвечая на ваш запрос, сервер вместо самой страницы может вернуть
указание, куда браузер должен пойти дальше, чтобы попасть на нужную
страницу. Заголовок, который указывает браузеру такое перенаправление
— это ‘Location:’.
По умолчанию curl не идет по адресу, указанному в ‘Location:’, а
просто показывает страницу как обычно. Но можно его направить
следующим образом:
# curl -L www.sitethatredirects.com
Если вы используете curl для POST-запросов на сайт, который сразу же
перенаправляет на другую страницу, вы можете смело использовать
связку -L и -d/-F. Curl сформирует POST-запрос для первой страницы, а
затем GET-запрос для последующей.
5 последних уроков рубрики «PHP»
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак
В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение
В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Предварительные сведения
Протокол HTTP
HTTP — это протокол, используемый при обмене данных между веб-сервером и программой-клиентом (например, браузером). Он состоит из строк ASCII-текста, отсылаемых от клиента к серверу для запроса какого-либо действия. При получении запроса сервер отвечает клиенту несколькими служебными текстовыми строками, а затем выдает запрошенное содержимое.
Используя ключ , можно увидеть, какие именно команды curl отсылает серверу. Этот ключ дает возможность разобраться в особенностях взаимодействия curl и веб-сервера и помогает отладить запрос.
URL
URL (Uniform Resource Locator — единый указатель ресурса) задает адрес определенного ресурса в Интернет. Например, URL веб-страницы cURL, записывается так: .
Формы
Формы представляют собой наборы полей, размещенные на веб-странице. Пользователь вводит в эти поля данные, затем нажимает на кнопку «OK» или «Отправить», после чего данные отправляются на сервер. Сервер принимает данные и решает, как поступить дальше: искать ли информацию в базе данных, показать ли введенный адрес на карте или использовать информацию для аутентификации пользователя. Разумеется, «решает» — означает, что на стороне сервера должна быть какая-то программа, которая принимает и обрабатывает присланные данные. Простейший пример: форма запроса поисковика Google.
Справка
Справку по curl можно получить, набрав в командной строке
$ curl --help
или
$ curl --manual
— приглашение командной строки.
Скрытые поля формы
Скрытые поля в формах являются одним из наиболее распространенных способов передачи информации о состоянии HTML-приложения. Такие поля не заполняются, они невидимы для пользователя, но передаются так же, как и обычные поля.
Пример формы с одним видимым и одним скрытым полями:
<form method="POST" action="foo.cgi"> <input type=text name="year"> <input type=hidden name="person" value="daniel"> <input type=submit name="press" value="OK"> </form>
Чтобы отправить POST-запрос с помощью curl, вам не нужно задумываться о том, скрыто поле или нет — для curl все поля одинаковы:
$ curl -d "year=1990&press=OK&person=daniel" URL
How to Read Data from a File
Suppose you want to make requests in the command-line using cURL, but you have the data to send stored in a file. You can use the Content-Type to specify the media type and then pass the file path containing the data. For this example, I will illustrate using a JSON object.
The JSON file (data.json) contains the following values:
{
«username»: «linuxhint»,
«password»: «password»}
To send this data from a JSON file, we can use the -d and then pass the filename as shown in the command below:
curl -X POST -H “Content-Type: applicationjson” -d “@data.json” https://linuxhint.comrestrictedlogin.php
You can also use the –data-binary option.
curl -X POST -H “Content-Type: applicationjson” —data-binary “@/homeuserdata.json” https://linuxhint.comrestrictedlogin.php
You can also use a text file to send the data; all you need to specify is the Content-Type as text/plain.
For example, a text file (data.txt) containing the following values
username=linuxhint&password=password
Using the cURL command, simply send the request as:
curl -X POST -H “Content-Type: textplain” -d “data.txt” https://linuxhint.comrestrictedlogin.php
You can use other file types you can use such as XML, HTML, and many more.
Параллельные cURL запросы в PHP
Для чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов:
$urls = [ 'https://httpbin.org/anything?1', 'https://httpbin.org/anything?2', 'https://httpbin.org/anything?3', ];
И если мы будем по очереди отправлять запросы, то второй запрос начнется только после того, как закончился первый и так далее, а это существенно увеличивает время работы скрипта.
Выглядит это так:
$results = []; foreach ($urls as $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $results = curl_exec($ch); curl_close($ch); } var_dump($results);
Теперь в $results у нас содержится массив, где ключи — это url адреса, а значения — результаты запросов. Однако запросы выполняются долго. Но мы можем это ускорить.
Как выполнить 3 запроса одновременно? В этом нам поможет
Давайте решим конкретную задачу при помощи параллельных curl запросов. Нам нужно отправить одновременно 3 запроса.
$urls = [ 'https://httpbin.org/anything?1', 'https://httpbin.org/anything?2', 'https://httpbin.org/anything?3', ]; // array of curl handles $multiCurl = []; // data to be returned $results = []; // multi handle $mh = curl_multi_init(); foreach ($urls as $url) { $multiCurl = curl_init(); curl_setopt($multiCurl, CURLOPT_URL, $url); curl_setopt($multiCurl, CURLOPT_HEADER, 0); curl_setopt($multiCurl, CURLOPT_RETURNTRANSFER, 1); curl_multi_add_handle($mh, $multiCurl); } $index = null; do { curl_multi_exec($mh, $index); } while ($index > 0); // get content and remove handles foreach ($multiCurl as $k => $ch) { $results = curl_multi_getcontent($ch); curl_multi_remove_handle($mh, $ch); } // close curl_multi_close($mh); var_dump($results); // в $results у нас содержатся ответы на наши 3 запроса
Такие параллельные запросы выполняются значительно быстрее чем поочередные.
Twitter: проверяем отношения между двумя пользователями
Если вам нужно узнать, читает ли ваши твиты определенный пользователь, то можно задействовать API Twitter. Данный скрипт выводит , если два пользователя, указанные на строчках 17 и 18, находятся в дружеских отношениях на Twitter. В противном случае возвращается .
function make_request($url) { $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $result = curl_exec($ch); curl_close($ch); return $result; } /* Получаем соответствие */ function get_match($regex,$content) { preg_match($regex,$content,$matches); return $matches; } /* Персоны для проверки */ $person1 = 'phpsnippets'; $person2 = 'catswhocode'; /* Отправляем запрос на twitter */ $url = 'https://api.twitter.com/1/friendships/exist'; $format = 'xml'; /* Проверка */ $persons12 = make_request($url.'.'.$format.'?user_a='.$person1.'&user_b='.$person2); $result = get_match('/<friends>(.*)<\/friends>/isU',$persons12); echo $result; // Возвращаем "true" или "false"
Как работать с cURL гораздо проще
Вы можете спросить: почему у cURL такие кривые и страшные методы? У вас может возникнуть желание взять и создать обертку для работы с cURL, чтобы вы могли не писать каждый раз большие куски некрасивого кода, а писать все проще, например так:
$curl = new Curl(); $curl->get('https://www.example.com/search', );
Или так:
$curl = new Curl(); $curl->post('https://www.example.com/login/', );
К счастью, такая обертка уже написана и найти ее можно здесь: https://github.com/php-curl-class/php-curl-class
Просто установите ее при помощи:
и не работайте с кривыми кусками кода, которые таковы вероятно потому, что cURL изначально консольное приложение.
Что такое curl?
На самом деле, curl – это больше чем просто утилита командной строки для Linux или Windows. Это набор библиотек, в которых реализуются базовые возможности работы с URL страницами и передачи файлов. Библиотека поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах и других операций с URL адресами.
Поддержка библиотеки curl была добавлена в множество различных языков программирования и платформ. Утилита curl – это независимая обвертка для этой библиотеки. Именно на этой утилите мы и остановимся в этой статье.
Установка cURL на Denwer (Денвер). Как начать пользоваться libcurl?
Первое, что мы должны сделать, это установить библиотеку. На локальном компьютере я пользуюсь сборкой Denwer, как и подавляющее большинство начинающих вебмастеров, на которых и рассчитана статья. Опытные пользователи, которые самостоятельно устанавливают связку php+apache+mysql смогут установить и cURL, не мне объяснять им как это делается 😉 А мы, новички, пользуемся готовыми решениями, чтобы было проще. Поэтому, устанавливаем libcurl следующим образом:
- Соответственно, устанавливаем его. Ничего сложного, согласитесь 🙂
- Открываем в блокноте (я всегда рекомендую Notepad++) файл:
X:/webservers/usr/local/php5/php.ini //где X - ваш диск, куда установлен вебсервер
и убираем точку с запятой в начале сроки:
;extension=php_curl.dll
- Делаем рестарт сервера Денвер.
Готово. Чтобы проверить работоспособность библиотеки можете вызвать функцию phpinfo() и найти там строчку: cURL support enabled. Поздравляю с первой победой.
Для сохранения куки в файле необходимо указать путь к этому файлу в соответствующих параметрах CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR.
$ch = curl_init('https://asgeto.ru'); curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch);
Параметр CURLOPT_COOKIE используется для принудительной передачи значения куки:
$ch = curl_init('https://asgeto.ru'); curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=61445603b6a0809b061080ed4bb93da3'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch);
Получение и отправка заголовков
По умолчанию, заголовки ответа сервера не показываются. Но это можно исправить:
> curl -i google.com HTTP/1.1 301 Moved Permanently Location: http://www.google.com/ Content-Type: text/html; charset=utf-8 Date: Sun, 16 Sep 2018 08:28:18 GMT Expires: Tue, 16 Oct 2018 08:28:18 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 219 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="http://www.google.com/">here</A>. </BODY></HTML>
Если содержимое страницы не нужно, а интересны только заголовки (будет отправлен запрос):
> curl -I http://www.example.com/ HTTP/1.1 200 OK Date: Sun, 16 Sep 2018 08:20:52 GMT Server: Apache/2.4.34 (Win64) mod_fcgid/2.3.9 X-Powered-By: PHP/7.1.10 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Set-Cookie: PHPSESSID=svn7eb593i8d2gv471rs94og58; path=/ Set-Cookie: visitor=fa867bd917ad0d715830a6a88c816033; expires=Mon, 16-Sep-2019 08:20:53 GMT; Max-Age=31536000; path=/ Set-Cookie: lastvisit=1537086053; path=/ Content-Length: 132217 Content-Type: text/html; charset=utf-8
Посмотреть, какие заголовки отправляет CURL при запросе, можно с помощью опции , которая выводит более подробную информацию:
> curl -v google.com
- Строка, начинающаяся с означает заголовок, отправленный серверу
- Строка, начинающаяся с означает заголовок, полученный от сервера
- Строка, начинающаяся с означает дополнительные данные от CURL
* Rebuilt URL to: http://google.com/ * Trying 173.194.32.206... * TCP_NODELAY set * Connected to google.com (173.194.32.206) port 80 (#0)
> GET / HTTP/1.1 > Host: google.com > User-Agent: curl/7.61.1 > Accept: */* > < HTTP/1.1 301 Moved Permanently < Location: http://www.google.com/ < Content-Type: text/html; charset=utf-8 < Date: Mon, 17 Sep 2018 15:11:49 GMT < Expires: Wed, 17 Oct 2018 15:11:49 GMT < Cache-Control: public, max-age=2592000 < Server: gws < Content-Length: 219 < X-XSS-Protection: 1; mode=block < X-Frame-Options: SAMEORIGIN < <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="http://www.google.com/">here</A>. </BODY></HTML>
* Connection #0 to host google.com left intact
Если этой информации недостаточно, можно использовать опции или .
А вот так можно отправить свой заголовок:
> curl -H "User-Agent: Mozilla/5.0" http://www.example.com/
POST запросы cUrl в PHP
$array = array( 'login' => 'user', 'password' => '123' ); $ch = curl_init('https://asgeto.ru'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $array); // Или предать массив строкой: // curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;
Функция file_get_contents() так же умеет отправлять POST запросы. Для этого нужно использовать заголовки:
$headers = stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded' . PHP_EOL, 'content' => 'login=user&password=123', ), )); echo file_get_contents('https://asgeto.ru', false, $headers);
Формы
Формы — основной способ представления web-сайта как HTML-страницы
с полями, в которые пользователь вводит данные, и затем нажимает на
кнопку ‘OK’ или ‘Отправить’, после чего данные отсылаются на сервер.
Затем сервер использует принятые данные и решает, как действовать
дальше: искать информацию в базе данных, показать введенный адрес на
карте, добавить сообщение об ошибке или использовать информацию для
аутентификации пользователя. Разумеется, на стороне сервера имеется
какая-то программа, которая принимает ваши данные.
4.1 GET
GET-форма использует метод GET, например следующим образом:
<form method="GET" action="junk.cgi"> <input type=text name="birthyear"> <input type=submit name=press value="OK"> </form>
Если вы откроете этот код в вашем браузере, вы увидите форму с
текстовым полем и кнопку с надписью «OK». Если вы введете
‘1905’ и нажмете OK, браузер создаст новый URL, по которому и
проследует. URL будет представляться строкой, состоящей из пути
предыдущего URL и строки, подобной
«junk.cgi?birthyear=1905&press=OK».
Например, если форма располагалась по адресу
«www.hotmail.com/when/birth.html», то при нажатии на кнопку
OK вы попадете на URL
«www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK».
Большинство поисковых систем работают таким образом.
Чтобы curl сформировал GET-запрос, просто введите то, что
ожидалось от формы:
# curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
4.2 POST
Метод GET приводит к тому, что вся введенная информация
отображается в адресной строке вашего браузера. Может быть это
хорошо, когда вам нужно добавить страницу в закладки, но это
очевидный недостаток, когда вы вводите в поля формы секретную
информацию, либо когда объем информации, вводимый в поля, слишком
велик (что приводит к нечитаемому URL).
Протокол HTTP предоставляет метод POST. С помощью него клиент
отправляет данные отдельно от URL и поэтому вы не увидете их в
адресной строке.
Форма, генерирующая POST-запрос, похожа на предыдущую:
<form method="POST" action="junk.cgi"> <input type=text name="birthyear"> <input type=submit name=press value=" OK "> </form>
Curl может сформировать POST-запрос с теми же данными следующим
образом:
# curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi
Этот POST-запрос использует ‘Content-Type
application/x-www-form-urlencoded’, это самый широко используемый
способ.
Данные, которые вы отправляете к серверу, должны быть правильно
закодированы, curl не будет делать это за вас. К примеру, если вы
хотите, чтобы данные содержали пробел, вам нужно заменить этот пробел
на %20 и т.п. Недостаток внимания к этому вопросу — частая ошибка,
из-за чего данные передаются не так, как надо.
4.3 Загрузка файлов с помощью POST (File Upload POST)
В далеком 1995 был определен дополнительный способ передавать
данные по HTTP. Он задокументирован в RFC 1867, поэтому этот способ
иногда называют RFC1867-posting.
Этот метод в основном разработан для лучшей поддержки загрузки
файлов. Форма, которая позволяет пользователю загрузить файл,
выглядит на HTML примерно следующим образом:
<form method="POST" enctype='multipart/form-data' action="upload.cgi"> <input type=file name=upload> <input type=submit name=press value="OK"> </form>
Заметьте, что тип содержимого Content-Type установлен в
multipart/form-data.
Чтобы отослать данные в такую форму с помощью curl, введите
команду:
# curl -F upload=@localfilename -F press=OK
4.4 Скрытые поля
Обычный способ для передачи информации о состоянии в
HTML-приложениях — использование скрытых полей в формах. Скрытые поля
не заполняются, они невидимы для пользователя и передаются так же,
как и обычные поля.
Простой пример формы с одним видимым полем, одним скрытым и
кнопкой ОК:
<form method="POST" action="foobar.cgi"> <input type=text name="birthyear"> <input type=hidden name="person" value="daniel"> <input type=submit name="press" value="OK"> </form>
Чтобы отправить POST-запрос с помощью curl, вам не нужно думать о
том, скрытое поле или нет. Для curl они все одинаковы:
# curl -d "birthyear=1905&press=OK&person=daniel"
4.5 Узнать, как выглядит POST-запрос
Когда вы хотите заполнить форму и отослать данные на сервер с
помощью curl, вы наверняка хотите, чтобы POST-запрос выглядел точно
также, как и выполненный с помощью браузера.
Простой способ увидеть свой POST-запрос, это сохранить
HTML-страницу с формой на диск, изменить метод на GET, и нажать
кнопку ‘Отправить’ (вы можете также изменить URL, которому будет
передаваться данные).
Вы увидите, что данные присоединились к URL, отделенные символами
‘?’, как и предполагается при использовании GET-форм.
Пару слов о других полезных опциях cURL
HTTP Аутентификация
Если на URL адресе есть 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 должно быть следующее содержание $url = "ftp://username:password@mydomain.com:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); // указывам ASCII мод curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ch); curl_close($ch);
Используем Прокси
Вы можете выполнить свой URL запрос через прокси:
$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);
Функции обратного вызова
Также существует возможность указать функцию, которая будет срабатывать ещё до завершения работы cURL запроса. Например, пока содержание ответа загружается, вы можете начать использовать данные, не дожидаясь полной загрузки.
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://net.tutsplus.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_getinfo
curl_getinfo — получает информацию, касающуюся специфической передачи/transfer.
Описание
string curl_getinfo (resource ch, int opt)
-
CURLINFO_EFFECTIVE_URL — Последний
использованный URL -
CURLINFO_HTTP_CODE — Последний полученный код
HTTP -
CURLINFO_FILETIME — Дата модификации
загруженного документа, если она неизвестна, возвращается -1. -
CURLINFO_TOTAL_TIME — Полное время выполнения
операции в секундах. -
CURLINFO_NAMELOOKUP_TIME — Время разрешения
имени сервера в секундах. -
CURLINFO_CONNECT_TIME — Время, затраченное на
установку соединения, в секундах -
CURLINFO_PRETRANSFER_TIME — Время, прошедшее
от начала операции до готовности к фактической передаче данных, в
секундах -
CURLINFO_STARTTRANSFER_TIME — Время, прошедшее
от начала операции до момента передачи первого байта данных, в
секундах -
CURLINFO_REDIRECT_TIME — Общее время,
затраченное на перенапрвления, в секундах -
CURLINFO_SIZE_UPLOAD — Количество байт при
закачке -
CURLINFO_SIZE_DOWNLOAD — Количество байт при
загрузке -
CURLINFO_SPEED_DOWNLOAD — Средняя скорость
закачки -
CURLINFO_SPEED_UPLOAD — Средняя скорость
загрузки -
CURLINFO_HEADER_SIZE — Суммарный размер всех
полученных заголовков -
CURLINFO_REQUEST_SIZE — Суммарный размер всех
отправленных запросов, в настоящее время используется только для HTTP запросов -
CURLINFO_SSL_VERIFYRESULT — Результат
проверки SSL сертификата, запрошенной с помощью установки
параметра CURLOPT_SSL_VERIFYPEER -
CURLINFO_CONTENT_LENGTH_DOWNLOAD —
размер загруженного документа, прочитанный из заголовка
Content-Length -
CURLINFO_CONTENT_LENGTH_UPLOAD — Размер
закачиваемых данных -
CURLINFO_CONTENT_TYPE — Содержимое
полученного заголовка Content-type, или NULL в случае, когда этот
заголовок не был получен
При вызове без необязательного аргумента opt
возвращается ассоциативный массив со следующими индексами, которые
соответствуют значениям аргумента opt:
-
«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»
Пример использования curl_getinfo:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLINFO_HEADER_OUT, true); // если этот параметр не указать не работает! curl_exec($ch); var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
Пример использования curl_getinfo:
$ch = curl_init(); // create cURL handle (ch) if (!$ch) { die("Couldn't initialize a cURL handle"); } // set some cURL options $ret = curl_setopt($ch, CURLOPT_URL, "http://mail.yahoo.com"); $ret = curl_setopt($ch, CURLOPT_HEADER, 1); $ret = curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $ret = curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); $ret = curl_setopt($ch, CURLOPT_TIMEOUT, 30); // execute $ret = curl_exec($ch); if (empty($ret)) { // some kind of an error happened die(curl_error($ch)); curl_close($ch); // close cURL handler } else { $info = curl_getinfo($ch); curl_close($ch); // close cURL handler if (empty($info)) { die("No HTTP code was returned"); } else { // load the HTTP codes $http_codes = parse_ini_file("path/to/the/ini/file/I/pasted/above"); // echo results echo "The server responded: <br />"; echo $info . " " . $http_codes]; } }
PHP cURL multiple async requests
The function creates a new multi handle, which
allows the processing of multiple cURL handles asynchronously.
multi_async.php
<?php $urls = [ "http://webcode.me", "https://example.com", "http://httpbin.org", "https://www.perl.org" ]; $options = ; $mh = curl_multi_init(); $chs = []; foreach ($urls as $url) { $ch = curl_init($url); curl_setopt_array($ch, $options); curl_multi_add_handle($mh, $ch); $chs[] = $ch; } $running = false; do { curl_multi_exec($mh, $running); } while ($running); foreach ($chs as $h) { curl_multi_remove_handle($mh, $h); } curl_multi_close($mh); foreach ($chs as $h) { $status = curl_getinfo($h, CURLINFO_RESPONSE_CODE); echo $status . "\n"; } foreach ($chs as $h) { echo "----------------------\n"; echo curl_multi_getcontent($h); }
In the example, we create asynchronous requests to four websites. We print their
status codes and headers.
$mh = curl_multi_init();
We initiate the multi handle.
foreach ($urls as $url) { $ch = curl_init($url); curl_setopt_array($ch, $options); curl_multi_add_handle($mh, $ch); $chs[] = $ch; }
We create standard handles for each URLs and add them to the multi handle with
.
$running = false; do { curl_multi_exec($mh, $running); } while ($running);
We execute all queries asynchronously, and continue when all are complete.
foreach ($chs as $h) { curl_multi_remove_handle($mh, $h); } curl_multi_close($mh);
We close the handles.
foreach ($chs as $h) { $status = curl_getinfo($h, CURLINFO_RESPONSE_CODE); echo $status . "\n"; }
We get the status codes.
foreach ($chs as $h) { echo "----------------------\n"; echo curl_multi_getcontent($h); }
We get the headers.
$ php multi_req.php 200 200 200 200 ---------------------- HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Mon, 08 Feb 2021 16:37:31 GMT Content-Type: text/html Content-Length: 348 Last-Modified: Sat, 20 Jul 2019 11:49:25 GMT Connection: keep-alive ETag: "5d32ffc5-15c" Accept-Ranges: bytes ---------------------- HTTP/2 200 content-encoding: gzip accept-ranges: bytes age: 285367 cache-control: max-age=604800 content-type: text/html; charset=utf-8 date: Mon, 08 Feb 2021 16:36:11 GMT etag: "3147526947" expires: Mon, 15 Feb 2021 16:36:11 GMT last-modified: Thu, 17 Oct 2019 07:18:26 GMT server: ECS (dcb/7F83) x-cache: HIT content-length: 648 ---------------------- HTTP/1.1 200 OK Date: Mon, 08 Feb 2021 16:36:11 GMT Content-Type: text/html; charset=utf-8 Content-Length: 9593 Connection: keep-alive Server: gunicorn/19.9.0 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true ---------------------- HTTP/2 200 server: Combust/Plack (Perl) content-type: text/html; charset=utf-8 last-modified: Mon, 08 Feb 2021 15:29:36 GMT x-content-type-options: nosniff x-frame-options: deny x-xss-protection: 1 strict-transport-security: max-age=15768000 via: 1.1 varnish, 1.1 varnish accept-ranges: bytes date: Mon, 08 Feb 2021 16:36:11 GMT age: 2713 x-served-by: cache-lga21948-LGA, cache-vie21642-VIE x-cache: HIT, HIT x-cache-hits: 2, 1 x-timer: S1612802172.507868,VS0,VE1 content-length: 12011