2013-08-04 12 views
15

Mam funkcję, która wiele razy wywołuje 3 różne interfejsy API, używając cURL. Wynik każdego interfejsu API jest przekazywany do następnego API wywoływanego w pętlach zagnieżdżonych, więc cURL jest obecnie otwierany i zamykany ponad 500 razy.Czy powinienem zamknąć CURL, czy nie?

Czy powinienem zostawić cURL otwarty na całą funkcję, czy też można go otworzyć i zamknąć tyle razy w jednej funkcji?

+3

Dość niejasne pytanie, nie widząc użycia i sposobu obsługi kodu. –

+1

Mam tendencję do błądzenia po stronie niezawodności, a świeże uchwyty wydają się mniej problematyczne, ponieważ pozostały stan z żądania wydaje się mniej prawdopodobne, aby zanieczyszczać przyszłe żądania, jeśli zrobisz świeży uchwyt. Mając to na uwadze, mam proces, który regularnie działa przez kilka tygodni, wykonując prawie milion żądań http na tym samym uchwycie. Są to bardzo proste żądania HTTP do pojedynczego interfejsu API w pojedynczej domenie. Nie napotkałem żadnych problemów. – goat

+0

Możliwy duplikat [Kiedy użyć curl funkcji curl \ _close?] (Http://stackoverflow.com/questions/3849857/when-to-use-curls-function-curl-close) –

Odpowiedz

20

Występuje wzrost wydajności w celu ponownego użycia tego samego uchwytu. Zobacz: Reusing the same curl handle. Big performance increase?

Jeśli nie trzeba żądania być synchroniczny, należy rozważyć użycie curl_multi_ * funkcje (np curl_multi_init, curl_multi_exec, itd.), Które również zapewniają duży wzrost wydajności.

UPDATE:

Próbowałem benching pozwijane z użyciem nowego uchwytu na każde żądanie i przy użyciu tego samego uchwytu z następującego kodu:

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>'; 

i mam następujące wyniki:

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

Dzięki temu ponowne użycie tego samego uchwytu zapewnia znaczny wzrost wydajności podczas wielokrotnego łączenia z tym samym serwerem. Próbowałem podłączenia do różnych serwerach:

$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>'; 

I got następujący wynik:

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

nadal dość znaczny wzrost wydajności.

+0

Zastanawiam się czy curl używa keep -ustające połączenia. Już samo to może przyczynić się do większego zwiększenia wydajności. – goat

+0

Wierzę, że cURL używa keep-alive, ale każde wywołanie curl_exec() inicjuje nowe żądanie (ponieważ opcje mogły się zmienić, itp.) Zwłaszcza w przypadku łączenia się z innym serwerem, musiałoby tak być. – AlliterativeAlice

+0

Dziękuję wszystkim. Kiedy łączę się z tym samym serwerem, ale innym adresem URL, jestem zdumiony wynikami testów Otome. Jednak bardzo podoba mi się punkt niezawodności, który Chris napisał ..... – makenoiz

Powiązane problemy