Полный цикл в digital

Curl в PHP

Работа с курл состоит всего из трех основных функций:

  1. curl_init() инициализирует сеанс работы с библиотекой и записывает его в переменную, дальнейшая работа ведется с переменной
  2. curl_setopt() настройки делаются с помощью этой функции, которая принимает три параметра:
    1. Первый параметр, переменная с сеансом curl_init()
    2. Второй параметр, название параметра для настройки в виде константы PHP
    3. Третий параметр, значение параметра настройки
  3. curl_exec() выполняет запрос к ресурсу в соответствии с настройками

Все доступные переменные

curl_init()

curl_init() - инициализирует CURL-сессию.

resource curl_init([string url])

Функция curl_init() инициализирует новую сессию и возвратит CURL-дескриптор для использования в функциях curl_setopt(), curl_exec(), curl_close(). Если необязательный параметр url предоставлен, то опция CURLOPT_URL получит значение этого параметра. Вы можете вручную устанавливать его с помощью функции curl_setopt().

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_TIMEVALUE, или по умолчанию будет использоваться TIMECOND_IFMODSINCE
  • CURLOPT_RETURNTRANSFER Передаёт ненулевое значение, если вы хотите, чтобы CURL непосредственно возвращала полученную информацию, вместо её печати напрямую

Параметр value должен быть строкой для следующих значений параметра option

  • CURLOPT_URL Это URL, который PHP должен получать. Вы можете также устанавливать эту опцию при инициализации сессии функцией curl_init().
  • CURLOPT_USERPWD Передаёт в РНР строку, отформатированную в виде [username]:[password], для использования при соединении
  • CURLOPT_PROXYUSERPWD Передаёт в РНР строку, отформатированную в виде [username]:[password], для соединения с HTTP-прокси
  • CURLOPT_RANGE Передаёт специфицированный вами диапазон. Он должен быть в формате "X-Y", где X или Y могут отсутствовать. HTTP-трансферы поддерживают также различные интервалы, разделённые запятыми, как, например, X-Y,N-M
  • CURLOPT_POSTFIELDS Передаёт строку, содержащую полные данные для передачи операцией HTTP "POST
  • CURLOPT_REFERER Передаёт строку, содержащую "referer/ссылающийся" header, используемый в HTTP-запросе
  • CURLOPT_USERAGENT Передаёт строку, содержащую "user-agent" header, используемый в HTTP-запросе
  • CURLOPT_FTPPORT Передаёт строку, содержащую значение, которое будет использоваться для получения IP-адреса для инструкции ftp "POST". POST-инструкция указывает удалённому серверу: соединиться со специфицированным IP-адресом. Строка может быть обычным IP-адресом, hostname/именем хоста, именем сетевого интерфейса (под UNIX), или просто обычным "-", используемым для системного IP-адреса по умолчанию
  • CURLOPT_COOKIE Передаёт строку с содержимым куки/cookie, установленным в HTTP header"е
  • CURLOPT_SSLCERT Передаёт строку, содержащую filename форматированного сертификата PEM
  • CURLOPT_SSLCERTPASSWD Передаёт строку, содержащую password, необходимый для работы сертификата CURLOPT_SSLCERT
  • CURLOPT_COOKIEFILE Передаёт строку, содержащую имя файла с данными куки. Этот cookie-файл может иметь формат Netscape, или содержать обычные шапки/headers в HTTP-стиле, забитые в файл
  • CURLOPT_CUSTOMREQUEST Передаёт строку, используемую вместо GET или HEAD при выполнении HTTP-запроса. Это делается для выполнения DELETE или других, более скрытых HTTP-запросов. Верными значениями являются GET, POST и так далее; то есть не вводите здесь полную строку HTTP-запроса. Например, ввод "GET /index.html HTTP/1.0" будет некорректным. (не делайте это, если не уверены, что ваш сервер поддерживает эту команду.)
  • CURLOPT_PROXY Передаёт имя HTTP-прокси туннельным запросам
  • CURLOPT_INTERFACE Передаёт имя исходящего сетевого интерфейса для использования. Это может быть имя интерфейса, IP-адрес или имя хоста
  • ( curl_setopt($ch, CURLOPT_INTERFACE, $extip) )
  • CURLOPT_KRB4LEVEL Передаёт KRB4 (Kerberos 4) уровень секретности. Это любая из следующих строк (в порядке от менее до более мощной): "clear", "safe", "confidential", "private".
    Если эта строка не совпадает с какой-либо из указанных, то используется "private". Если вы установите здесь NULL, это отключит KRB4-безопасность. KRB4-безопасность работает в настоящее время только с транзакциями FTP
  • CURLOPT_HTTPHEADER Передаёт массив полей HTTP-header"а для установки
  • CURLOPT_QUOTE Передаёт массив FTP-команд для выполнения на сервере до выполнения FTP-запроса
  • CURLOPT_POSTQUOTE Передаёт массив FTP-команд для выполнения на сервере после выполнения FTP-запроса

Следующие опции ожидают дескриптора файла, который получается с помощью функции 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() - возвращает целое число, содержащее номер последней ошибки.

int curl_errno ( resource ch)

curl_error()

curl_error() - возвращает строку содержащую номер последней ошибки для текущей сессии.

string curl_error (resource ch)

curl_getinfo()

curl_getinfo() - получает информацию, касающуюся специфической передачи/transfer.

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:

  • 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['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: <br />";
        echo $info['http_code'] . " " . $http_codes[$info['http_code']];
    }
}

curl_version()

curl_version() - возвращает версию текущей CURL.

string curl_version (void)
curl_version=Array
(
[version_number] => 472065
[age] => 3
[features] => 4179869
[ssl_version_number] => 0
[version] => 7.52.1
[host] => x86_64-pc-linux-gnu
[ssl_version] => OpenSSL/1.0.2u
[libz_version] => 1.2.8
[protocols] => Array
(
[0] => dict
[1] => file
[2] => ftp
[3] => ftps
[4] => gopher
[5] => http
[6] => https
[7] => imap
[8] => imaps
[9] => ldap
[10] => ldaps
[11] => pop3
[12] => pop3s
[13] => rtmp
[14] => rtsp
[15] => scp
[16] => sftp
[17] => smb
[18] => smbs
[19] => smtp
[20] => smtps
[21] => telnet
[22] => tftp
)
)

Предопределённые константы

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

  • CURLOPT_PORT (integer)
  • CURLOPT_FILE (integer)
  • CURLOPT_INFILE (integer)
  • CURLOPT_INFILESIZE (integer)
  • CURLOPT_URL (integer)
  • CURLOPT_PROXY (integer)
  • CURLOPT_VERBOSE (integer)
  • CURLOPT_HEADER (integer)
  • CURLOPT_HTTPHEADER (integer)
  • CURLOPT_NOPROGRESS (integer)
  • CURLOPT_NOBODY (integer)
  • CURLOPT_FAILONERROR (integer)
  • CURLOPT_UPLOAD (integer)
  • CURLOPT_POST (integer)
  • CURLOPT_FTPLISTONLY (integer)
  • CURLOPT_FTPAPPEND (integer)
  • CURLOPT_NETRC (integer)
  • CURLOPT_FOLLOWLOCATION (integer)
  • CURLOPT_FTPASCII (integer)
  • CURLOPT_PUT (integer)
  • CURLOPT_MUTE (integer)
  • CURLOPT_USERPWD (integer)
  • CURLOPT_PROXYUSERPWD (integer)
  • CURLOPT_RANGE (integer)
  • CURLOPT_TIMEOUT (integer)
  • CURLOPT_POSTFIELDS (integer)
  • CURLOPT_REFERER (integer)
  • CURLOPT_USERAGENT (integer)
  • CURLOPT_FTPPORT (integer)
  • CURLOPT_LOW_SPEED_LIMIT (integer)
  • CURLOPT_LOW_SPEED_TIME (integer)
  • CURLOPT_RESUME_FROM (integer)
  • CURLOPT_COOKIE (integer)
  • CURLOPT_SSLCERT (integer)
  • CURLOPT_SSLCERTPASSWD (integer)
  • CURLOPT_WRITEHEADER (integer)
  • CURLOPT_SSL_VERIFYHOST (integer)
  • CURLOPT_COOKIEFILE (integer)
  • CURLOPT_SSLVERSION (integer)
  • CURLOPT_TIMECONDITION (integer)
  • CURLOPT_TIMEVALUE (integer)
  • CURLOPT_CUSTOMREQUEST (integer)
  • CURLOPT_STDERR (integer)
  • CURLOPT_TRANSFERTEXT (integer)
  • CURLOPT_RETURNTRANSFER (integer)
  • CURLOPT_QUOTE (integer)
  • CURLOPT_POSTQUOTE (integer)
  • CURLOPT_INTERFACE (integer)
  • CURLOPT_KRB4LEVEL (integer)
  • CURLOPT_HTTPPROXYTUNNEL (integer)
  • CURLOPT_FILETIME (integer)
  • CURLOPT_WRITEFUNCTION (integer)
  • CURLOPT_READFUNCTION (integer)
  • CURLOPT_PASSWDFUNCTION (integer)
  • CURLOPT_HEADERFUNCTION (integer)
  • CURLOPT_MAXREDIRS (integer)
  • CURLOPT_MAXCONNECTS (integer)
  • CURLOPT_CLOSEPOLICY (integer)
  • CURLOPT_FRESH_CONNECT (integer)
  • CURLOPT_FORBID_REUSE (integer)
  • CURLOPT_RANDOM_FILE (integer)
  • CURLOPT_EGDSOCKET (integer)
  • CURLOPT_CONNECTTIMEOUT (integer)
  • CURLOPT_SSL_VERIFYPEER (integer)
  • CURLOPT_CAINFO (integer)
  • CURLOPT_COOKIEJAR (integer)
  • CURLOPT_SSL_CIPHER_LIST (integer)
  • CURLOPT_BINARYTRANSFER (integer)
  • CURLCLOSEPOLICY_LEAST_RECENTLY_USED (integer)
  • CURLCLOSEPOLICY_LEAST_TRAFFIC (integer)
  • CURLCLOSEPOLICY_SLOWEST (integer)
  • CURLCLOSEPOLICY_CALLBACK (integer)
  • CURLCLOSEPOLICY_OLDEST (integer)
  • CURLINFO_EFFECTIVE_URL (integer)
  • CURLINFO_HTTP_CODE (integer)
  • CURLINFO_HEADER_SIZE (integer)
  • CURLINFO_REQUEST_SIZE (integer)
  • CURLINFO_TOTAL_TIME (integer)
  • CURLINFO_NAMELOOKUP_TIME (integer)
  • CURLINFO_CONNECT_TIME (integer)
  • CURLINFO_PRETRANSFER_TIME (integer)
  • CURLINFO_SIZE_UPLOAD (integer)
  • CURLINFO_SIZE_DOWNLOAD (integer)
  • CURLINFO_SPEED_DOWNLOAD (integer)
  • CURLINFO_SPEED_UPLOAD (integer)
  • CURLINFO_FILETIME (integer)
  • CURLINFO_SSL_VERIFYRESULT (integer)
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD (integer)
  • CURLINFO_CONTENT_LENGTH_UPLOAD (integer)
  • CURLE_OK (integer)
  • CURLE_UNSUPPORTED_PROTOCOL (integer)
  • CURLE_FAILED_INIT (integer)
  • CURLE_URL_MALFORMAT (integer)
  • CURLE_URL_MALFORMAT_USER (integer)
  • CURLE_COULDNT_RESOLVE_PROXY (integer)
  • CURLE_COULDNT_RESOLVE_HOST (integer)
  • CURLE_COULDNT_CONNECT (integer)
  • CURLE_FTP_WEIRD_SERVER_REPLY (integer)
  • CURLE_FTP_ACCESS_DENIED (integer)
  • CURLE_FTP_USER_PASSWORD_INCORRECT (integer)
  • CURLE_FTP_WEIRD_PASS_REPLY (integer)
  • CURLE_FTP_WEIRD_USER_REPLY (integer)
  • CURLE_FTP_WEIRD_PASV_REPLY (integer)
  • CURLE_FTP_WEIRD_227_FORMAT (integer)
  • CURLE_FTP_CANT_GET_HOST (integer)
  • CURLE_FTP_CANT_RECONNECT (integer)
  • CURLE_FTP_COULDNT_SET_BINARY (integer)
  • CURLE_PARTIAL_FILE (integer)
  • CURLE_FTP_COULDNT_RETR_FILE (integer)
  • CURLE_FTP_WRITE_ERROR (integer)
  • CURLE_FTP_QUOTE_ERROR (integer)
  • CURLE_HTTP_NOT_FOUND (integer)
  • CURLE_WRITE_ERROR (integer)
  • CURLE_MALFORMAT_USER (integer)
  • CURLE_FTP_COULDNT_STOR_FILE (integer)
  • CURLE_READ_ERROR (integer)
  • CURLE_OUT_OF_MEMORY (integer)
  • CURLE_OPERATION_TIMEOUTED (integer)
  • CURLE_FTP_COULDNT_SET_ASCII (integer)
  • CURLE_FTP_PORT_FAILED (integer)
  • CURLE_FTP_COULDNT_USE_REST (integer)
  • CURLE_FTP_COULDNT_GET_SIZE (integer)
  • CURLE_HTTP_RANGE_ERROR (integer)
  • CURLE_HTTP_POST_ERROR (integer)
  • CURLE_SSL_CONNECT_ERROR (integer)
  • CURLE_FTP_BAD_DOWNLOAD_RESUME (integer)
  • CURLE_FILE_COULDNT_READ_FILE (integer)
  • CURLE_LDAP_CANNOT_BIND (integer)
  • CURLE_LDAP_SEARCH_FAILED (integer)
  • CURLE_LIBRARY_NOT_FOUND (integer)
  • CURLE_FUNCTION_NOT_FOUND (integer)
  • CURLE_ABORTED_BY_CALLBACK (integer)
  • CURLE_BAD_FUNCTION_ARGUMENT (integer)
  • CURLE_BAD_CALLING_ORDER (integer)
  • CURLE_HTTP_PORT_FAILED (integer)
  • CURLE_BAD_PASSWORD_ENTERED (integer)
  • CURLE_TOO_MANY_REDIRECTS (integer)
  • CURLE_UNKNOWN_TELNET_OPTION (integer)
  • CURLE_TELNET_OPTION_SYNTAX (integer)
  • CURLE_OBSOLETE (integer)
  • CURLE_SSL_PEER_CERTIFICATE (integer)
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг