2013-08-04 2 views
15

cURLを使用して3つの異なるAPIを呼び出す関数があります。各APIの結果は、ネストされたループで呼び出される次のAPIに渡されるため、cURLは現在500回以上開いて閉じます。cURLを閉じてもいいですか?

関数全体に対してcURLを開いたままにするか、1つの関数で何度も開いて閉じることができますか?

+3

使い方やコードの処理方法を見ずにかなり曖昧な質問です。 –

+1

私は信頼性の面で誤っている傾向があります。フレッシュなハンドルは、残った状態が新しいハンドルを作成すると将来の要求を汚染する可能性が低いように思われるため、問題が少ないようです。それで、私は同じカールハンドルで100万近くのHTTPリクエストを作り、定期的に数週間実行するプロセスを持っています。これらは単一のドメイン上の単一のAPIへの非常に単純なhttp要求です。私は何の問題も経験していない。 – goat

+0

カールがキープを使用しているかどうか疑問に思うのですが、[curl \ _closeを使用する場合は?](http://stackoverflow.com/questions/3849857/when-to-use-curls-function-curl-close) –

答えて

20

同じハンドルを再利用するとパフォーマンスが向上します。参照:Reusing the same curl handle. Big performance increase?

あなたが(など、curl_multi_exec、例えばcurl_multi_init)curl_multi_ *関数を使用することを検討して、同期する要求を必要としない場合も、大きなパフォーマンスの向上を提供します。

UPDATE:

私はリクエストごとに新しいハンドルを使用して、次のコードと同じハンドルを使ってカールをベンチングみました:

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

、以下の結果を得ました

同じハンドルを再使用すると、実際に同じサーバーに複数回接続するとパフォーマンスが大幅に向上します。

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

そして、次の結果だ:私は別のサーバーに接続しようとした

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

まだかなり大幅な性能向上を。

+0

有効な接続。これだけでも、パフォーマンスが大幅に向上します。 – goat

+0

私はcURLがキープアライブを使用していると信じていますが、curl_exec()を呼び出すたびに新しいオプションが開始されます(オプションが変更されているなど)。 – AlliterativeAlice

+0

ありがとうございます。私は同じサーバーに接続していますが、別のURLに接続している間、私はOtomeが掲示したベンチマークに驚いています。しかし、私はクリスが掲示した信頼性の点が本当に好きです..... – makenoiz

関連する問題