2013-08-04 27 views
15

Birden çok kez cURL kullanarak 3 farklı API'yi çağıran bir işlev var. Her bir API'nin sonucu iç içe döngüler olarak adlandırılan bir sonraki API'ye geçirilir, böylece cURL şu anda 500 kez açılır ve kapatılır.CURL'yi kapatmalı mıyım yoksa yapmamalı mıyım?

Tüm işlev için cURL'yi açık bırakmalı mıyım yoksa tek bir işlevde açmak ve kapatmak için Tamam mı?

+3

Kullanımı ve kodun nasıl ele alındığını görmeden oldukça belirsiz bir soru. –

+1

Güvenilirlik tarafında hatalıyım ve yeni saplar daha az sorunlu görünüyor, çünkü bir istekte bulunan artık durum, yeni bir tanıtımı gerçekleştirirseniz, gelecekteki istekleri kirletme olasılığının düşük olduğunu gösteriyor. Bununla birlikte, haftalarca düzenli olarak çalışan ve aynı kıvrılma tutamında yaklaşık bir milyon http isteği yapan bir işlem var. Tek bir alanda tek bir api için çok sade http istekleridir. Sorun yaşamadım. – goat

+0

Olası çoğaltılabilir [cURLs işlevini ne zaman kullanacağız curl \ _close?] (Http://stackoverflow.com/questions/3849857/when-to-use-curls-function-curl-close) –

cevap

20

Aynı tanıtıcıyı yeniden kullanmak için bir performans artışı var. Bkz: Eşzamanlı olarak isteklerini gerekmiyorsa Reusing the same curl handle. Big performance increase?

, * curl_multi_ kullanarak işlevlerini dikkate de büyük performans artışı sağlar (ör curl_multi_init, curl_multi_exec, vs.).

GÜNCELLEME:

ben her istek için yeni bir kolu kullanarak ve aşağıdaki kodla aynı tanıtıcı kullanarak bombeyle benching çalıştı:

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

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

ve aşağıdaki sonuçları aldık

Aynı tanıtıcıyı yeniden kullanmak, aslında aynı sunucuya birden çok kez bağlanırken önemli bir performans artışı sağlar. Ben farklı sunuculara bağlanırken çalıştı:

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

Ve aşağıdaki sonuç var:

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

Yine oldukça önemli bir performans artışı.

+0

Kıvrılma tutmayı kullanıp kullanmadığını merak ediyorum -alive bağlantılar. Bu sadece performans artışının çoğunu hesaba katabilir. – goat

+0

CURL'nin canlılığını koruduğuna inanıyorum, fakat curl_exec() 'e yapılan her çağrı yeni bir istek başlatır (seçenekler değişmiş olabilir, vb.). Özellikle farklı bir sunucuya bağlanırken bu durum geçerli olur. – AlliterativeAlice

+0

Herkese teşekkürler. Aynı sunucuya ama farklı bir url'e bağlanırken, Otome'nin referansları ile hayran kaldım. Ancak ben Chris gönderildi ..... güvenilirlik noktasını gerçekten seviyorum – makenoiz

İlgili konular