2013-08-04 2 views
15

cURL을 여러 번 사용하여 3 개의 다른 API를 호출하는 함수가 있습니다. 각 API의 결과는 중첩 된 루프에서 호출되는 다음 API로 전달되므로 cURL은 현재 500 번 이상 열리고 닫힙니다.cURL을 닫아야합니까?

전체 기능에 대해 cURL을 열어 두어야하나요, 아니면 한 번에 여러 번 열거 나 닫을 수 있습니까?

+3

사용법 및 코드 처리 방법을 보지 않고 매우 모호한 질문입니다. –

+1

나는 신뢰성 측면에서 실수하는 경향이 있으며 신선한 핸들을 만들면 요청에서 남은 상태가 미래 요청을 오염시킬 가능성이 적기 때문에 신선한 핸들이 덜 문제가되는 것처럼 보입니다. 그 말로는, 나는 몇 주 동안 정기적으로 실행되는 프로세스를 가지고 있으며, 같은 컬링 핸들에서 백만 건의 HTTP 요청을 처리합니다. 단일 도메인의 단일 API에 대한 매우 일반적인 http 요청입니다. 나는 아무 문제도 경험하지 않았다. – goat

+0

[CURLs 함수를 사용할 수있는 경우] 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_를 사용하여 기능을 고려해도 큰 성능 향상을 제공한다 (예를 들어 curl_multi_init, curl_multi_exec 등).

UPDATE :

나는 각 요청에 대해 새로운 핸들을 사용하여 다음과 같은 코드로 동일한 핸들을 사용하여 컬을 benching 시도 :

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

컬이 keep을 사용하고 있는지 궁금합니다. - 연결 유지. 이것만으로도 대부분의 성능 향상을 설명 할 수 있습니다. – goat

+0

나는 cURL이 keep-alive를 사용한다고 믿지만, curl_exec()를 호출 할 때마다 새로운 요청이 시작된다. (옵션이 바뀌었기 때문이다.) 특히 다른 서버에 연결할 때 그렇다. – AlliterativeAlice

+0

모두에게 감사드립니다. 동일한 서버이지만 다른 URL에 연결하는 동안 Otome은 게시 한 벤치 마크에 놀랐습니다. 그러나 나는 크리스가 게시 한 신뢰성 포인트를 정말로 좋아한다. ..... – makenoiz