У меня есть функция, которая вызывает 3 разных API, используя cURL несколько раз. Каждый результат API передается следующему API, называемому вложенными циклами, поэтому cURL в настоящее время открывается и закрывается более 500 раз.
Должен ли я оставлять cURL открытым для всей функции или нормально открывать и закрывать ее столько раз в одной функции?
Существует увеличение производительности для повторного использования одного и того же дескриптора. См. Повторное использование одной ручки. Большое увеличение производительности?
Если вам не нужны синхронные запросы, попробуйте использовать функции curl_multi_ * (например, curl_multi_init , curl_multi_exec и т. Д.), Которые также обеспечивают большой прирост производительности.
ОБНОВИТЬ:
Я попробовал скалолазание с использованием нового дескриптора для каждого запроса и используя тот же дескриптор со следующим кодом:
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
Все еще довольно существенное увеличение производительности.