Что такое код curl_getinfo

Содержание

PHP функция curl_getinfo

(PHP 4> = 4.0.4, PHP 5)

curl_getinfo — Получить информацию о ручке Curl подключение ресурсов

объяснение

Получить последнюю передачу информации.

параметры

ч

К curl_init () возвращает завиток ручку.

выбирать

Этот параметр может быть одним из следующих констант:

  • 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_HEADER_OUT — отправлено строку запроса
  • Размер проблемы в запросах HTTP запроса CURLINFO_REQUEST_SIZE
  • CURLINFO_SSL_VERIFYRESULT — Результаты, установив запрос подтверждения сертификата на SSL возвращен CURLOPT_SSL_VERIFYPEER
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD — от Content-Length: скачать поле длины чтения в
  • CURLINFO_CONTENT_LENGTH_UPLOAD — загрузить размер Описание
  • CURLINFO_CONTENT_TYPE — скачать Content-Type: значение, NULL указывает , что сервер не отправил действительный Content-Type: заголовок

Возвращаемое значение

Если неавтоматического устанавливается в строку и возвращает его значение. В противном случае, Возвращает ассоциативный массив со следующими элементами (которые соответствуют выбрать):

  • «Веб-сайт»
  • «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

(PHP 4 >= 4.0.4, PHP 5)

curl_getinfo — Возвращает информацию о последней операции

Описание string curl_getinfo ( resource ch [, int opt] )

Возвращает информацию о последней операции, 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 :

Получаем HTTP статус-коды сайта с помощью PHP и CURL

Используя нижеприведенный код вы сможете проверить, существует сайт или нет. Также можно проверить, есть ли на сайте редирект.

Используя нижеприведенный код вы сможете проверить, существует сайт или нет. Также можно проверить, есть ли на сайте редирект. Это может быть полезно для сайтов-каталогов, которые хотите проверить урлы, которые больше не являются активными или обновить свои ссылки. С помощью CURL мы получаем все статус коды для какого либо сайта, а затем ищем совпадения со списком HTTP статус-кодов.

$toCheckURL = «http://google.com» ; // Домен для проверки

// поработаем с CURL

curl_setopt( $ch , CURLOPT_URL, $toCheckURL );

curl_setopt( $ch , CURLOPT_HEADER, true);

curl_setopt( $ch , CURLOPT_NOBODY, true);

curl_setopt( $ch , CURLOPT_RETURNTRANSFER, true);

curl_setopt( $ch , CURLOPT_FOLLOWLOCATION, true);

curl_setopt( $ch , CURLOPT_MAXREDIRS, 10); // разрешаем только 10 редиректов за раз во избежание бесконечного цикла

$data = curl_exec( $ch );

$http_code = curl_getinfo( $ch , CURLINFO_HTTP_CODE); // Получаем HTTP-код

$new_url = curl_getinfo( $ch , CURLINFO_EFFECTIVE_URL);

// Массив возможных HTTP статус кодовв

$codes = array (0=> ‘Domain Not Found’ ,

101=> ‘Switching Protocols’ ,

203=> ‘Non-Authoritative Information’ ,

205=> ‘Reset Content’ ,

206=> ‘Partial Content’ ,

300=> ‘Multiple Choices’ ,

301=> ‘Moved Permanently’ ,

304=> ‘Not Modified’ ,

307=> ‘Temporary Redirect’ ,

400=> ‘Bad Request’ ,

402=> ‘Payment Required’ ,

405=> ‘Method Not Allowed’ ,

406=> ‘Not Acceptable’ ,

407=> ‘Proxy Authentication Required’ ,

408=> ‘Request Timeout’ ,

411=> ‘Length Required’ ,

412=> ‘Precondition Failed’ ,

413=> ‘Request Entity Too Large’ ,

414=> ‘Request-URI Too Long’ ,

415=> ‘Unsupported Media Type’ ,

416=> ‘Requested Range Not Satisfiable’ ,

417=> ‘Expectation Failed’ ,

500=> ‘Internal Server Error’ ,

501=> ‘Not Implemented’ ,

502=> ‘Bad Gateway’ ,

503=> ‘Service Unavailable’ ,

504=> ‘Gateway Timeout’ ,

505=> ‘HTTP Version Not Supported’ );

// Ищем совпадения с нашим списком

if (isset( $codes [ $http_code ])) <

echo ‘Сайт вернул ответ: ‘ . $http_code . ‘ — ‘ . $codes [ $http_code ]. ‘
‘ ;

preg_match_all( «/HTTP/1.[1|0]s(d<3>)/» , $data , $matches );

array_pop ( $matches [1]);

if ( count ( $matches [1]) > 0) <

// Идем дальше по списку, чтобы посмотреть, какие мы еще статус коды получили

foreach ( $matches [1] as $c ) <

echo $c . ‘ — ‘ . $codes [ $c ]. ‘
‘ ;

PHP CURL – функции и примеры использования

Предлагаю немного поговорить о языке программирования PHP, а конкретно затронуть тему расширения CURL, т.е. возможность взаимодействовать с различными серверами по различным протоколам из самого скрипта PHP.

Илон Маск рекомендует:  Что такое код bzdecompress

Перед тем как приступить к рассмотрению curl хочу напомнить, что язык PHP мы с Вами уже затрагивали, например, в материале про выгрузку в Excel на PHP или возможность аутентификации на PHP, а теперь давайте поговорим о возможности посылать запросы на PHP.

Что такое CURL?

CURL – это библиотека функций PHP, с помощью которой можно посылать запросы, например, HTTP, из PHP скрипта. CURL поддерживает такие протоколы как HTTP, HTTPS, FTP и другие. Посылать HTTP запросы можно методами GET, POST, PUT.

CURL может пригодиться в случаях когда необходимо вызвать удаленный скрипт и получить результат или просто сохранить HTML код вызываемой страницы, в общем каждый может найти свое применение но смысл один это то что можно послать запросы в процессе выполнения скрипта.

Подключение библиотеки CURL в PHP

Для того чтобы использовать библиотеку CURL ее соответственно нужно подключить.

Примечание! В качестве примера мы будем использовать PHP 5.4.39 на Windows 7, а в качестве Web-сервера у нас будет выступать Apache 2.2.22.

Первое что нужно сделать, это скопировать библиотеки ssleay32.dll, libeay32.dll, libssh2.dll они расположены в директории с PHP, в системный каталог Windows, а именно в C:\Windows\System32.

Затем в php.ini подключить библиотеку php_curl.dll, т.е. раскомментировать следующую строку

Библиотека не подключена

Все, перезапускаем Apache, вызываем функцию phpinfo() и в случае успешного подключения у Вас должен появиться раздел curl

Если его нет, то это означает только одно, что библиотека не загрузилась, самая распространенная причина этого небыли скопированы вышеперечисленные DLL в системный каталог Windows.

Пример CURL – запрашиваем удаленную страницу для вывода на экран

В данном примере мы просто запросим удаленную страницу по протоколу HTTP методом GET и выведем ее содержимое на экран.

У нас имеется каталог test в нем 2 PHP файла это test_curl.php и test.php, где test_curl.php и есть скрипт где мы будем использовать curl, а test.php удаленный скрипт который мы будем вызывать. Код я подробно прокомментировал.

Код test_curl.php

Код test.php

В итоге если вы запустите test_curl.php у Вас выведется на экран надпись «Заголовок 1», можете поэкспериментировать с передачей параметров id (в данном случае 2 или 3).

Пример CURL – вызываем удаленный скрипт и получаем результат

Сейчас давайте попробуем вызвать скрипт и получить результат, для того чтобы потом его обработать, для примера давайте использовать метод POST. Названия файлов оставим такими же.

Код test_curl.php

Код test.php

И если мы запустим test_curl.php то на экран у нас выведется 111, т.е. 1.11 полученное в результате обращения к удаленному скрипту, умноженное на 100.

А теперь давайте поговорим о функциях и константах к ним.

Часто используемые функции CURL и константы

  • curl_init — Инициализирует сеанс;
  • curl_close — Завершает сеанс;
  • curl_exec — Выполняет запрос;
  • curl_errno — Возвращает код ошибки;
  • curl_setopt — Устанавливает параметр для сеанса, например:
    • CURLOPT_HEADER – значение 1 означает, что необходимо вернуть заголовки;
    • CURLOPT_INFILESIZE — параметр для указания ожидаемого размера файла;
    • CURLOPT_VERBOSE — значение 1 означает что CURL будет выводить подробные сообщения о всех производимых операциях;
    • CURLOPT_NOPROGRESS – отключение индикатора прогресса операции, значение 1;
    • CURLOPT_NOBODY – если Вам не нужен документ, а нужны только заголовки, то поставьте значение 1;
    • CURLOPT_UPLOAD — для закачки файла на сервер;
    • CURLOPT_POST – выполнить запрос методом POST;
    • CURLOPT_FTPLISTONLY — получение списка файлов в директории FTP сервера, значение 1;
    • CURLOPT_PUT — выполнить запрос методом PUT, значение 1;
    • CURLOPT_RETURNTRANSFER — возвратить результат, не выводя в браузер, значение 1;
    • CURLOPT_TIMEOUT – максимальное время выполнения в секундах;
    • CURLOPT_URL – указание адреса для обращения;
    • CURLOPT_USERPWD — строка с именем пользователя и паролем в виде [username]:[password];
    • CURLOPT_POSTFIELDS – данные для POST запроса;
    • CURLOPT_REFERER — задает значение HTTP заголовка «Referer: »;
    • CURLOPT_USERAGENT — задает значение HTTP заголовка «User-Agent: »;
    • CURLOPT_COOKIE — содержимое заголовка «Cookie: », который будет отправлен с HTTP запросом;
    • CURLOPT_SSLCERT- имя файла с сертификатом в формате PEM;
    • CURLOPT_SSL_VERIFYPEER – значение 0, для того чтобы запретить проверку сертификата удаленного сервера (по умолчанию 1);
    • CURLOPT_SSLCERTPASSWD — пароль к файлу сертификата.
  • curl_getinfo — Возвращает информацию об операции, вторым параметром может выступать константа для указания, что именно нужно показать, например:
    • CURLINFO_EFFECTIVE_URL — последний использованный URL;
    • CURLINFO_HTTP_CODE — последний полученный код HTTP;
    • CURLINFO_FILETIME — дата модификации загруженного документа;
    • 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 — суммарный размер всех отправленных запросов;
    • CURLINFO_SSL_VERIFYRESULT — результат проверки SSL сертификата, запрошенной с помощью установки параметра CURLOPT_SSL_VERIFYPEER;
    • CURLINFO_CONTENT_LENGTH_DOWNLOAD — размер загруженного документа, прочитанный из заголовка Content-Length;
    • CURLINFO_CONTENT_LENGTH_UPLOAD — размер закачиваемых данных;
    • CURLINFO_CONTENT_TYPE — содержимое полученного заголовка Content-type, или NULL в случае, когда этот заголовок не был получен.

Подробнее о функциях CURL и константах к ним можете посмотреть на официальном сайте PHP — php.net

На этом все, для начинающих я думаю достаточно Удачи!

CURLINFO_RESPONSE_CODE explained

CURLINFO_RESPONSE_CODE — get the last response code

SYNOPSIS

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RESPONSE_CODE, long *codep);

DESCRIPTION

Pass a pointer to a long to receive the last received HTTP, FTP or SMTP response code. This option was previously known as CURLINFO_HTTP_CODE in libcurl 7.10.7 and earlier. The stored value will be zero if no server response code has been received. Note that a proxy’s CONNECT response should be read with CURLINFO_HTTP_CONNECTCODE and not this.

Support for SMTP responses added in 7.25.0.

PROTOCOLS

HTTP, FTP and SMTP

EXAMPLE

AVAILABILITY

Added in 7.10.8. CURLINFO_HTTP_CODE was added in 7.4.1.

RETURN VALUE

Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.

Время запроса cURL, получая подробности из curl_getinfo ()

Я написал небольшой скрипт для диагностики времени подключения моего сайта, и вот результат:

Используемый код выглядит следующим образом:

Я не совсем понимаю результат выше.

  1. Почему время до первого байта (TTFB) равно общему времени?
  2. Является ли вышеуказанное время накопительным? Если да, время передачи равно 0 мс?
  3. Что означает предпереходное время?
Илон Маск рекомендует:  Что такое код swftextfield

Выход из curl_getinfo($ch) :

Решение

не время раунда для тщательного анализа запроса. 0ms а также 0.5ms возрасты друг от друга для компьютеров; читать сырые числа, чтобы избежать путаницы.

1) Если HTTP-запрос возвращает один ресурс (в отличие от полной веб-страницы), TTFB и Total Time — это одно и то же, если только объем данных, возвращаемых сервером, не был значительно больше.

2) Да, это накопительно. Увеличьте объем данных, возвращаемых URL, и вы увидите, что время передачи также увеличится с 0 мс

3) Время ожидания ответа сервера после того, как он принял запрос

Другие решения

  • Почему время до первого байта (TTFB) равно общему времени?

Это зависит от общих данных. Если ваши общие переданные данные почти равны нулю, то они будут равны.

  • Является ли вышеуказанное время накопительным? Если да, время передачи равно 0 мс?

Да, это накопительно. Если данные большие, то они бы увеличились.

Время перед передачей означает время в секундах от начала до начала передачи файла.

Для получения дополнительной информации о Curl GetInfo

Это также зависит от скорости вашего соединения.

Вы также должны проверить эти значения.

  1. CURLINFO_SIZE_UPLOAD — Общее количество загруженных байтов
  2. CURLINFO_SIZE_DOWNLOAD — Общее количество загруженных байтов
  3. CURLINFO_SPEED_DOWNLOAD — средняя скорость загрузки
  4. CURLINFO_SPEED_UPLOAD — средняя скорость загрузки

Таким образом, вы поймете свою скорость и размер данных.

Обновить:

Благодаря вашему обновленному выводу мы можем четко понимать, что данные почти не загружаются и не загружаются. Так что время стало более понятным.

Получение HTTP кода в PHP с помощью curl

Я использую CURL, чтобы получить статус сайта, если он вверх/вниз или перенаправление на другой сайт. Я хочу, чтобы это было максимально упрощено, но это не работает хорошо.

у меня это обернуто в функцию. Он отлично работает, но производительность не самая лучшая, потому что он загружает всю страницу, вещь, если я удалю $output = curl_exec($ch); возвращает 0 все время.

кто-нибудь знает, как сделать лучше производительность?

7 ответов:

сначала убедитесь, что URL-адрес действительно действителен (строка, а не пустой, хороший синтаксис), это быстро проверить на стороне сервера. Например, выполнение этого первого может сэкономить много времени:

убедитесь, что вы извлекаете только заголовки, а не содержимое тела:

для получения более подробной информации о получении статуса URL http-кода я ссылаюсь на другой пост, который я сделал (это также помогает со следующими перенаправлениями):

ez code

Просто о сложном.

Продвинутое использование cURL в PHP

cURL — это инструмент, позволяющий взаимодействовать с различными серверами и поддерживающий множество протоколов: HTTP, FTP, TELNET и др. Изначально cURL — это служебная программа для командной строки. Но, к счастью для нас, PHP поддерживает работу с библиотекой cURL. В этой статье мы рассмотрим нетривиальные примеры работы с cURL.

Почему cURL?

На самом деле, есть много других способов отправить запрос на другой сервер чтобы, например, получить содержимое страницы. Многие, в основном из-за лени, используют простые PHP функции, вместо cURL:

Однако они не позволяют эффективно обрабатывать ошибки. Также есть ряд задач, которые им вовсе не под силу — например, работа с cookies, авторизация, post запросы, загрузка файлов.

cUrl — мощный инструмент, который поддерживает множество протоколов и предоставляет полную информацию о запросе.

Основы cUrl

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

  1. Инициализация.
  2. Установка опций.
  3. Выполнение запроса.
  4. Очистка ресурсов.

В основном в этой статье мы будем рассматривать шаг №2, так как там происходит основная магия. Список cURL опций очень большой, поэтому все опции рассматривать сегодня мы не будем, а используем те, которые пригодятся для решения конкретных задач.

Отслеживание ошибок

При необходимости, вы можете добавить следующие строки для отслеживания ошибок:

Обратите внимание, мы используем «===» вместо «==», т.к. надо отличать пустой ответ сервера от булевского значения FALSE, которое возвращается в случае ошибки.

Получение информации о запросе

Другой необязательный шаг — получение информации о cURL запросе, после его выполнения.

В результате вы получите массив со следующей информацией:

  • «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 и язык и посмотрим, куда перенаправляют нас сайты.

В цикле проверяем браузеры для каждого урла. Сперва мы устанавливаем опции для нашего запроса: URL и тестируемый браузер и язык.

Т.к. мы установили специальную опцию, результат выполнения запроса будет содержать только HTTP заголовки. С помощью простого регулярного выражения мы можем проверить содержит ли ответ строку «Location:».

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

Отправляем POST запросы

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

Чтобы получить результат этого запроса, вам даже не понадобится cURL, вы можете быть ленивым и использовать «file_get_contents()».

Но некоторые HTML формы используют метод POST. В таком случае данные отправляются в теле сообщения запроса, а не в самом URL.

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

Далее напишем PHP скрипт, который отправит cURL запрос:

Данный скрипт выведет:

Данный скрипт отправил POST запрос файлу post_output.php. который вывел содержимое массива $_POST и мы получили этот ответ с помощью cURL.

Загрузка файлов

Загрузка файлов очень похожа на предыдущий скрипт, т.к. загрузка файлов всегда выполняется с помощью POST запросов.

Так же как и в предыдущем примере, создадим файл, который будет принимать запросы, upload_output.php :

И сам скрипт, загружающий файлы:

Если вы хотите загрузить файл, все что необходимо — это передать путь к нему, так же как обычный параметр POST запроса, поставив вначале «@». Результат работы скрипта:

Multi cURL

Одна из продвинутых возможностей cURL в PHP — это возможность выполнения нескольких запросов одновременно и асинхронно.

В обычных условиях скрипт останавливается и ждет выполнения запроса. И если вам надо выполнить много запросов, то это может занять много времени, т.к. вы будете выполнять последовательно. Это ограничение можно обойти:

Идея состоит в том, что вы можете создать множество cURL дескрипторов, объединить их под одним мульти-дескриптором и выполнять их асинхронно.

Илон Маск рекомендует:  Что такое код asp clientip

Сначала все как и с обычным cURL запросом — создается дескриптор (curl_init()), задаются параметры (curl_setopt()). Далее создается мульти-дескриптор (curl_multi_init()) и добавляются ранее созданные обычные дескрипторы (curl_multi_add_handle()). Вместо обычного вызова curl_exec() мы будем многократно вызывать curl_multi_exec() данная функция информирует нас о количестве активных соединений с помощью второго параметра — $running. Поэтому цикл работает пока $running не станет равным 0. И, конечно, после окончания работы необходимо освободить ресурсы.

В данном примере мы просто выводим результат запросов в STDOUT. Рассмотрим нетривиальный случай применения multi cURL.

Проверка внешних ссылок в WordPress

Представьте себе блог с большим количеством постов, содержащих ссылки на внешние сайты. Некоторые из этих ссылок могут быть не рабочими.

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

Для начала нам необходимо вытащить все внешние ссылки из базы данных:

В этой части скрипта мы просто вытаскиваем из базы все внешние ссылки. Проверим их:

Рассмотрим код подробнее (нумерация соответствует комментариям в коде):

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

Проверка заняла около 2 секунд. Запуская одновременно по 10 потоков производительность возрастает в 10 раз, по сравнению с обычными cURL запросами. Чтобы получить содержимое ответа сервера используйте функцию curl_multi_getcontent($ch), где $ch — дескриптор, полученный из curl_multi_info_read().

Другие возможности cURL в PHP

HTTP аутентификация

Если HTTP запрос требует аутентификацию, используйте следующий код:

Загрузка по FTP

В PHP есть своя библиотека для работы с FTP, но можно использовать и cURL:

Использование прокси

Запросы можно выполнять через определенный proxy:

Колбэки (callback functions)

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

Колбэк функция должна возвращать длину строки для правильной работы запроса.

Каждый раз, когда будет получена очередная часть ответа сервера, будет вызван колбэк.

Заключение

В этой статье мы рассмотрели продвинутые возможности cURL в PHP. В следующий раз, когда вам понадобится делать URL запросы — используйте cURL.

CURLINFO_RESPONSE_CODE Libcurl и curl_getinfo РНР () для FTP-передачи

Безопасно ли предположить , что значение РНР curl_getinfo() возвращает для ключа массива «HTTP_CODE» является значение CURLINFO_RESPONSE_CODE Libcurl в?

Другими словами: это значение с CURLINFO_HTTP_CODE использованием curl_getinfo() в PHP соответствует значению CURLINFO_RESPONSE_CODE использования curl_easy_getinfo() в Libcurl?

И поэтому смысл и для передачи FTP?

И значение после передачи FTP является код ответа FTP ?

Фактическое постоянное имя CURLINFO_HTTP_CODE (не CURLINFO_RESPONSE_CODE , что для libcurl ). Хотя есть HTTP в имени, вы можете получить коды ответов FTP там , а также:

Что такое код curl_getinfo

(PHP 4 >= 4.0.4, PHP 5)

curl_getinfo — Возвращает информацию о последней операции

Описание string curl_getinfo ( resource ch [, int opt] )

Возвращает информацию о последней операции, 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 :

Here are the response codes ready for pasting in an ini-style file. Can be used to provide more descriptive message, corresponding to ‘http_code’ index of the arrray returned by curl_getinfo().
These are taken from the W3 consortium HTTP/1.1: Status Code Definitions, found at
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

[Informational 1xx]
100=»Continue»
101=»Switching Protocols»

[Successful 2xx]
200=»OK»
201=»Created»
202=»Accepted»
203=»Non-Authoritative Information»
204=»No Content»
205=»Reset Content»
206=»Partial Content»

[Redirection 3xx]
300=»Multiple Choices»
301=»Moved Permanently»
302=»Found»
303=»See Other»
304=»Not Modified»
305=»Use Proxy»
306=»(Unused)»
307=»Temporary Redirect»

[Client Error 4xx]
400=»Bad Request»
401=»Unauthorized»
402=»Payment Required»
403=»Forbidden»
404=»Not Found»
405=»Method Not Allowed»
406=»Not Acceptable»
407=»Proxy Authentication Required»
408=»Request Timeout»
409=»Conflict»
410=»Gone»
411=»Length Required»
412=»Precondition Failed»
413=»Request Entity Too Large»
414=»Request-URI Too Long»
415=»Unsupported Media Type»
416=»Requested Range Not Satisfiable»
417=»Expectation Failed»

[Server Error 5xx]
500=»Internal Server Error»
501=»Not Implemented»
502=»Bad Gateway»
503=»Service Unavailable»
504=»Gateway Timeout»
505=»HTTP Version Not Supported»

And an example usage:
= 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 [ ‘http_code’ ])) <
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:
» ;
echo $info [ ‘http_code’ ] . » » . $http_codes [ $info [ ‘http_code’ ]];
>

You can get some documentation about what these values mean in the libcurl C API documentation here:

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL