Подтвердить что ты не робот

Должен ли я закрывать cURL или нет?

У меня есть функция, которая вызывает 3 разных API, используя cURL несколько раз. Каждый результат API передается следующему API, называемому вложенными циклами, поэтому cURL в настоящее время открывается и закрывается более 500 раз.

Должен ли я оставить cURL открытым для всей функции или нормально ли открывать и закрывать ее столько раз в одной функции?

4b9b3361

Ответ 1

Увеличение производительности для повторного использования одного и того же дескриптора. Смотрите: Повторное использование одного и того же ручка завитка. Большое увеличение производительности?

Если вам не нужны синхронные запросы, рассмотрите возможность использования функций curl_multi_ * (например, curl_multi_init, curl_multi_exec и т.д.), которые также обеспечивают большую производительность.

UPDATE:

Я попробовал скалолазание с использованием нового дескриптора для каждого запроса и используя тот же дескриптор со следующим кодом:

ob_start(); //Trying to avoid setting as many curl options as possible
$start_time = microtime(true);
for ($i = 0; $i < 100; ++$i) {
    $rand = rand();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.google.com/?rand=" . $rand);
    curl_exec($ch);
    curl_close($ch);
}
$end_time = microtime(true);
ob_end_clean();
echo 'Curl without handle reuse: ' . ($end_time - $start_time) . '<br>';

ob_start(); //Trying to avoid setting as many curl options as possible
$start_time = microtime(true);
$ch = curl_init();
for ($i = 0; $i < 100; ++$i) {
    $rand = rand();
    curl_setopt($ch, CURLOPT_URL, "http://www.google.com/?rand=" . $rand);
    curl_exec($ch);
}
curl_close($ch);
$end_time = microtime(true);
ob_end_clean();
echo 'Curl with handle reuse: ' . ($end_time - $start_time) . '<br>';

и получили следующие результаты:

Curl without handle reuse: 8.5690529346466
Curl with handle reuse: 5.3703031539917

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

$url_arr = array(
    'http://www.google.com/',
    'http://www.bing.com/',
    'http://www.yahoo.com/',
    'http://www.slashdot.org/',
    'http://www.stackoverflow.com/',
    'http://github.com/',
    'http://www.harvard.edu/',
    'http://www.gamefaqs.com/',
    'http://www.mangaupdates.com/',
    'http://www.cnn.com/'
);
ob_start(); //Trying to avoid setting as many curl options as possible
$start_time = microtime(true);
foreach ($url_arr as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_exec($ch);
    curl_close($ch);
}
$end_time = microtime(true);
ob_end_clean();
echo 'Curl without handle reuse: ' . ($end_time - $start_time) . '<br>';

ob_start(); //Trying to avoid setting as many curl options as possible
$start_time = microtime(true);
$ch = curl_init();
foreach ($url_arr as $url) {
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_exec($ch);
}
curl_close($ch);
$end_time = microtime(true);
ob_end_clean();
echo 'Curl with handle reuse: ' . ($end_time - $start_time) . '<br>';

И получил следующий результат:

Curl without handle reuse: 3.7672290802002
Curl with handle reuse: 3.0146431922913

Все еще довольно значительное увеличение производительности.