2013-08-04 22 views
15

Ho una funzione che chiama 3 API diverse utilizzando cURL più volte. Il risultato di ogni API viene passato alla prossima API chiamata in cicli nidificati, quindi CURL è attualmente aperto e chiuso oltre 500 volte.Devo chiudere cURL o no?

Devo lasciare cURL aperto per l'intera funzione o è OK aprirlo e chiuderlo tante volte in una funzione?

+3

Domanda piuttosto vaga senza vedere l'utilizzo e il modo in cui viene gestito il codice. –

+1

Tendo ad errare sul lato dell'affidabilità, e le maniglie nuove sembrano meno problematiche perché lo stato avanzato di una richiesta sembra meno probabile che inquini le richieste future se si fa un nuovo handle. Detto questo, ho un processo che viene eseguito regolarmente per settimane, facendo quasi un milione di richieste http sullo stesso handle di ricciolo. Sono richieste HTTP molto semplici a una singola API su un singolo dominio. Non ho riscontrato problemi. – goat

+0

Possibile duplicato di [Quando utilizzare curl funzione cURL \ _close?] (Http://stackoverflow.com/questions/3849857/when-to-use-curls-function-curl-close) –

risposta

20

C'è un aumento delle prestazioni per riutilizzare lo stesso handle. Vedi: Reusing the same curl handle. Big performance increase?

Se non è necessario le richieste di essere sincrona, è possibile utilizzare il curl_multi_ * funzioni (ad esempio curl_multi_init, curl_multi_exec, etc.) che forniscono anche una grande spinta di prestazioni.

UPDATE:

Ho provato a tenere in panchina ricciolo con l'utilizzo di una nuova maniglia per ogni richiesta e utilizzando lo stesso handle con il seguente codice:

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

e ottenuto i seguenti risultati:

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

Quindi riutilizzare lo stesso handle fornisce effettivamente un aumento sostanziale delle prestazioni quando ci si connette allo stesso server più volte. Ho provato il collegamento a server diversi:

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

e ottenuto il seguente risultato:

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

Ancora abbastanza un aumento delle prestazioni sostanziale.

+0

Mi chiedo se il ricciolo sta usando tenere -alive connessioni Questo da solo potrebbe spiegare la maggior parte della spinta alla performance. – goat

+0

Credo che cURL usi keep-alive, ma ogni chiamata a curl_exec() avvia una nuova richiesta (perché le opzioni potrebbero essere cambiate, ecc.) Soprattutto quando ci si connette a un server diverso, questo dovrebbe essere il caso. – AlliterativeAlice

+0

Grazie a tutti. Mentre mi collego allo stesso server ma a un URL diverso, sono stupito dai benchmark di Otome pubblicati. Comunque mi piace molto il punto di affidabilità che Chris ha postato ..... – makenoiz