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.
Dość niejasne pytanie, nie widząc użycia i sposobu obsługi kodu. –
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
Możliwy duplikat [Kiedy użyć curl funkcji curl \ _close?] (Http://stackoverflow.com/questions/3849857/when-to-use-curls-function-curl-close) –