Php curl медленно работает

Как не ждать ответа от curl в php?

PHP скрипт обращается к API почтовых сервисов через curl, время ответа очень долгое, хотя сам ответ и не нужен. Главное отправить данные.

Из за этого сайт работает медленно, работа curl занимает долгое время.

//Отправка запроса private function sendRequest($path, $method = "GET", $data = array(), $useToken = true) < $url = $this ->apiUrl . "/" . $path; $method = strtoupper($method); $curl = curl_init(); if ($useToken && !empty($this -> token)) < $headers = array("Authorization: Bearer ".$this ->token); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); > switch ($method) < case "POST": curl_setopt($curl, CURLOPT_POST, count($data)); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); break; case "PUT": curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); break; case "DELETE": curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); break; default: if (!empty($data)) < $url .= "?" . http_build_query($data); >break; > curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HEADER, 1); $response = curl_exec($curl); $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); $headerCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); $responseBody = substr($response, $header_size); curl_close($curl); if ($headerCode == 401 && $this -> refreshToken == 0) < $this ->refreshToken += 1; $this -> getToken(); $return = $this -> sendRequest($path, $method, $data); > else < $return = new stdClass(); $return ->data = json_decode($responseBody); $return -> http_code = $headerCode; > return $return; >

Источник

Очень долго выполняется curl + https

Если я поставлю CURLOPT_TIMEOUT = 5, то 3 секунды, если 1, то сразу (правда, не всегда, иногда не успевает). В браузере же ответ приходит почти мгновенно.
Если заменить адрес на https://vk.com, ответ тоже придёт мгновенно. Пробовал всякие заголовки и опции добавлять — всё безрезультатно!
В чём проблема?

Не работает curl с HTTPS. Как быть?
Всем привет! Есть код curl для авторизации. Код работает, но возникла проблема с https. Пытаюсь.

Не выполняется curl запрос
<?php $myCurl = curl_init(); $data = array( ‘saleid’=>’326422184’.

cURL в цикле. Не до конца выполняется цикл
почему данный код выводит страницу только 22 раза из 76?<?php $start = microtime(true);.

Очень важно — cURL и Cookie.
Ребята, оооочень важный вопрос! Я пишу такую, например, штуку: $ya =.

причин может быть очень много, на самом деле. в вашем случае, судя по тому, что вы говорите про таймаут, вам скорее всего поможет выставление заголовка Connection: close. (через CURLOPT_HTTPHEADER это делается, хотя может есть и специальная опция).
также, не очень понятно, зачем вы представляетесь 5ым эксплорером, и может быть, это конкретно какая-то проблема, связанная с версиями http протокола. представляйтесь либо новым браузером, либо вообще уберите эту настройку. curl будет представляться самим собой, что для http-api,по идее должно быть нормально
также, curl, возможно, использует не все установленные в системе root-ca сертификаты, и с этим какие-то проблемы. попробуйте выставить CURLOPT_SSL_VERIFYHOST и CURLOPT_SSL_VERIFYPEER в false.
впрочем, я проверил, без юзернейма выдало такой же результат, как и в браузере:

echo -ne "GET /api/regru2/domain/check?input_format=json HTTP/1.1\r\nHost:api.reg.ru\r\nUser-Agent:Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n\r\n" | openssl s_client -quiet -connect api.reg.ru:443

возможно, у меня просто более новая версия openssl, и поэтому у меня все нормально, а у вас нет.
Поэтому, если ничего из вышеприведенного вам не помогло (впрочем, Connection:close конечно не вариант, если вы делаете несколько запросов и вам важна скорость), укажите версию curl, лог curl-я при включении CURLOPT_VERBOSE, и версию openssl, с которой curl слинкован. версии эти можно увидеть в выводе phpinfo().

Читайте также:  Java file system repository

Источник

Как правильно оптимизировать cURL?

К сути:
через curl я подключаюсь к API МойСклад чтобы сохранить там товар с сайта.

$url = "https://online.moysklad.ru/api/remap/1.1/entity/counterparty?filter=externalCode%3D"; $curl = curl_init(); curl_setopt_array($curl , array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( "Authorization: Basic " . base64_encode('login:pass'), "content-type: application/json" ), )); $searchid = curl_exec($curl ); // тут обработка полученных данных // далее передача обработанных данных с помощью масива $arrayjson curl_setopt_array($curl , array( CURLOPT_URL => "https://online.moysklad.ru/api/remap/1.1/entity/counterparty", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $arrayjson, CURLOPT_HTTPHEADER => array( "Authorization: Basic " . base64_encode('login:pass'), "content-type: application/json;charset=utf-8" ), )); $newcounter = curl_exec($curl );

весь файл выполняется 13 секунд.

Как я понял, проблема в том, что каждый раз происходит авторизация, но я никак не могу понять (найти в гугле), как сделать всё на одной авторизации?
Заранее спасибо.

Средний 2 комментария

Источник

Как ускорить cURL в php?

Я пытаюсь внедрить твит из Twitter. Итак, я использую cURL, чтобы вернуть json. Я написал небольшой тест, но тест занимает около 5 секунд, а также когда я запускаю локально. Итак, я не уверен, что я делаю неправильно здесь.

public function get_tweet_embed($tw_id) < $json_url = "https://api.twitter.com/1/statuses/oembed.json?id=&align=left&omit_script=true&hide_media=false"; $ch = curl_init( $json_url ); $start_time = microtime(TRUE); $JSON = curl_exec($ch); $end_time = microtime(TRUE); echo $end_time - $start_time; //5.7961111068726 return $this->get_html($JSON); > private function get_html($embed_json)

4 ответа

Что касается среды, я заметил в PHP, что cURL обычно работает очень быстро в большинстве сред, за исключением тех мест, где есть низкий процессор, и наблюдается более низкая производительность сети. Например, на localhost на моей установке MAMP, завиток выполняется быстро, на более крупном экземпляре amazon, завиток выполняется быстро. Но на небольшом дерьмовом хостинге я видел, что у него проблемы с производительностью, где заметно медленнее подключаться. Хотя, я точно не знаю, почему это медленнее. Кроме того, он был уверен, что на 5 секунд меньше. чтобы определить, является ли его PHP или ваша среда, вы должны попробовать взаимодействовать с curl через командную строку. По крайней мере, вы сможете исключить PHP-код, являющийся проблемой, если его еще 5 секунд.

Читайте также:  Python not use self

Окончательное решение для ускорения — это

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); 

Источник

Как ускорить cURL в php?

Я пытаюсь получить твит для вставки из твиттера. Итак, я использую cURL, чтобы вернуть JSON. Я написал небольшой тест, но тест занимает около 5 секунд, а также при локальном запуске. Итак, я не уверен, что я делаю не так здесь.

public function get_tweet_embed($tw_id) < $json_url = "https://api.twitter.com/1/statuses/oembed.json?id=&align=left&omit_script=true&hide_media=false"; $ch = curl_init( $json_url ); $start_time = microtime(TRUE); $JSON = curl_exec($ch); $end_time = microtime(TRUE); echo $end_time - $start_time; //5.7961111068726 return $this->get_html($JSON); > private function get_html($embed_json)

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

6 ответов

Что касается среды, я заметил в PHP, что cURL, как правило, работает очень быстро в большинстве сред, за исключением мест с низким ЦП и более низкой производительностью сети. Например, на локальном хосте в моей установке MAMP, curl работает быстро, на более крупном экземпляре amazon, curl работает быстро. Но на маленьком дрянном хостинге я видел проблемы с производительностью, когда он заметно медленнее подключался. Хотя я не уверен, почему именно так медленнее. Кроме того, это не было на 5 секунд медленнее.

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

Лучшее ускорение, которое у меня когда-либо было, это повторное использование одной и той же ручки. замещать $ch = curl_init( $json_url ); с curl_setopt($ch, CURLOPT_URL, $url); , Тогда вне функций есть один $ch = curl_init(); , Вам нужно будет сделать $ch глобальный в функции для доступа к нему.

Повторное использование ручки curl сохраняет соединение с сервером открытым. Это работает, только если между запросами сервер совпадает с вашим.

Читайте также:  Html on page ready

Окончательное решение для ускорения это

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); 

Попробуйте установить curl_setopt($ch, CURLOPT_ENCODING, ») это включить сжатие GZIP

Для ускорения cURL я рекомендую создать специальный класс для API (например, ApiClient ) и используйте один общий обработчик cURL, меняйте только URL для каждого запроса. Также отключите запросы для разрешения имени и используйте gzipped ответ.

Мне нужно было обрабатывать около 1 миллиона объектов каждый день с одного API-сервера, что ограничивает нас в использовании только одного одновременного соединения. Я создал этот класс. Я надеюсь, что это поможет другим в оптимизации их запросов curl.

class ApiClient < const CURL_TIMEOUT = 3600; const CONNECT_TIMEOUT = 30; const HOST = 'api.example.com'; const API_TOKEN = 'token'; /** @var resource CURL handler. Reused every time for optimization purposes */ private $ch; /** @var string URL for API. Calculated at creating object for optimization purposes */ private $url; public function __construct() < $this->url = 'https://' . self::HOST . '/v1/entity/view?token=' . self::API_TOKEN . '&id='; // Micro-optimization: every concat operation takes several milliseconds // But for millions sequential requests it can save a few seconds $host = [implode(':', [ // $host stores information for domain names resolving (like /etc/hosts file) self::HOST, // Host that will be stored in our "DNS-cache" 443, // Default port for HTTPS, can be 80 for HTTP gethostbyname(self::HOST), // IPv4-address where to point our domain name (Host) ])]; $this->ch = curl_init(); curl_setopt($this->ch, CURLOPT_ENCODING, ''); // This will use server's gzip (compress data) // Depends on server. On some servers can not work curl_setopt($this->ch, CURLOPT_RESOLVE, $host); // This will cut all requests for domain name resolving curl_setopt($this->ch, CURLOPT_TIMEOUT, self::CURL_TIMEOUT); // To not wait extra time if we know // that api-call cannot be longer than CURL_TIMEOUT curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, self::CONNECT_TIMEOUT); // Close connection if server doesn't response after CONNECT_TIMEOUT curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true); // To return output in `curl_exec` > /** @throws \Exception */ public function requestEntity($id) < $url = $this->url . $id; curl_setopt($this->ch, CURLOPT_URL, $url); $data = curl_exec($this->ch); if (curl_error($this->ch)) < throw new \Exception('cURL error (' . curl_errno($this->ch) . '): ' . curl_error($this->ch)); > return $data; > public function __destruct() < curl_close($this->ch); > > 

Также, если у вас нет ограничений, чтобы иметь только одно соединение с сервером, вы можете использовать curl_multi_* функции.

Источник

Оцените статью