2013-08-04 6 views
15

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

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

+3

Довольно неопределенный вопрос, не видя использования и способа обработки кода. –

+1

Я склонен ошибаться на стороне надежности, а свежие ручки кажутся менее проблематичными, потому что оставшееся состояние из запроса кажется менее вероятным загрязнять будущие запросы, если вы делаете новую ручку. С учетом сказанного, у меня есть процесс, который регулярно работает в течение нескольких недель, делая около миллиона http-запросов на одном ручке. Это очень простые HTTP-запросы к одному api в одном домене. Я не испытывал никаких проблем. – goat

+0

Возможный дубликат [Когда использовать функцию cURLs curl \ _close?] (Http://stackoverflow.com/questions/3849857/when-to-use-curls-function-curl-close) –

ответ

20

Увеличение повторного использования одного и того же ручка. См: Reusing the same curl handle. Big performance increase?

Если вам не нужны запросы синхронными, рассмотреть вопрос об использовании 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 

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

+0

Интересно, использует ли curl keep -аливные соединения. Это само по себе может объяснить большую часть повышения производительности. – goat

+0

Я считаю, что cURL использует keep-alive, но каждый вызов curl_exec() инициирует новый запрос (поскольку параметры могут быть изменены и т. Д.). Особенно при подключении к другому серверу это должно быть так. – AlliterativeAlice

+0

Спасибо всем. Пока я подключаюсь к одному и тому же серверу, но с другим URL-адресом, я поражен тестами Otome. Однако мне действительно нравится точка надежности, которую Chris написал ..... – makenoiz