2013-08-04 12 views
15

Ich habe eine Funktion, die 3 verschiedene APIs unter Verwendung cURL mehrere Male aufruft. Das Ergebnis jeder API wird an die nächste in verschachtelten Schleifen aufgerufene API übergeben, sodass cURL derzeit über 500 Mal geöffnet und geschlossen wird.Sollte ich cURL schließen oder nicht?

Sollte ich cURL für die gesamte Funktion geöffnet lassen oder ist es OK, es so oft in einer Funktion zu öffnen und zu schließen?

+3

Ziemlich vage Frage, ohne die Verwendung und wie der Code behandelt wird. –

+1

Ich tendiere dazu, auf der Zuverlässigkeitsseite zu irren, und frische Handles scheinen weniger problematisch, weil übrig gebliebener Zustand aus einer Anfrage weniger wahrscheinlich ist, zukünftige Anforderungen zu verschmutzen, wenn Sie einen neuen Griff machen. Nachdem dies gesagt wurde, habe ich einen Prozess, der regelmäßig wochenlang läuft und fast eine Million HTTP-Anfragen auf demselben Curl-Handle macht. Sie sind sehr einfache HTTP-Anfragen an eine einzelne API in einer einzigen Domäne. Ich habe keine Probleme erlebt. – goat

+0

Mögliche Duplikate von [Wann cURLs Funktion curl \ _close verwenden?] (Http://stackoverflow.com/questions/3849857/when-to-use-curls-function-curl-close) –

Antwort

20

Es gibt eine Leistungssteigerung bei der Wiederverwendung desselben Griffs. Siehe: Reusing the same curl handle. Big performance increase?

Wenn Sie nicht die Anforderungen müssen synchron sein, sollten Sie die curl_multi_ * Funktionen (z curl_multi_init, curl_multi_exec usw.), die auch eine große Leistungssteigerung bieten.

UPDATE:

Ich habe versucht, ein neues Handle mit der Verwendung für jede Anforderung curl benching und den gleichen Griff mit dem folgenden Code:

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

und bekam folgende Ergebnisse:

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

Die Wiederverwendung des gleichen Handles bietet tatsächlich eine erhebliche Leistungssteigerung, wenn mehrere Verbindungen zum selben Server hergestellt werden. Ich habe versucht, auf verschiedenen Servern verbinden:

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

Und bekam folgendes Ergebnis:

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

noch eine ganz erhebliche Leistungssteigerung.

+0

Ich frage mich, ob Curl verwendet wird, halten -alive Verbindungen. Das allein könnte den größten Teil des Leistungsschubs ausmachen. – goat

+0

Ich glaube, cURL verwendet Keep-Alive, aber jeder Aufruf von curl_exec() initiiert eine neue Anfrage (weil Optionen möglicherweise geändert haben, etc.) Insbesondere bei der Verbindung zu einem anderen Server müsste dies der Fall sein. – AlliterativeAlice

+0

Danke an alle. Während ich eine Verbindung zum selben Server, aber mit einer anderen URL herstelle, bin ich erstaunt über die Benchmarks, die Otome veröffentlicht hat. Allerdings mag ich den Zuverlässigkeitspunkt, den Chris veröffentlicht hat ..... – makenoiz

Verwandte Themen