2013-08-04 40 views
15

Tôi có một chức năng gọi 3 API khác nhau sử dụng cURL nhiều lần. Mỗi kết quả của API được chuyển đến API tiếp theo được gọi trong vòng lặp lồng nhau, vì vậy cURL hiện được mở và đóng hơn 500 lần.Tôi có nên đóng cURL hay không?

Tôi có nên để cURL mở cho toàn bộ chức năng không hay mở và đóng nó quá nhiều lần trong một hàm?

+3

Câu hỏi khá mơ hồ mà không thấy việc sử dụng và cách mã được xử lý. –

+1

Tôi có xu hướng sai về phía độ tin cậy và các xử lý mới có vẻ ít vấn đề hơn vì trạng thái còn sót lại từ một yêu cầu dường như ít có khả năng gây ô nhiễm các yêu cầu trong tương lai nếu bạn thực hiện xử lý mới. Với điều đó, tôi có một quy trình thường xuyên chạy trong nhiều tuần, tạo ra gần một triệu yêu cầu http trên cùng một trình xử lý curl. Chúng là những yêu cầu http rất đơn giản đối với một api đơn trên một tên miền duy nhất. Tôi đã không gặp vấn đề gì. – goat

+0

Có thể trùng lặp của [Khi nào sử dụng chức năng cURLs curl \ _đóng?] (Http://stackoverflow.com/questions/3849857/when-to-use-curls-function-curl-close) –

Trả lời

20

Có tăng hiệu suất để sử dụng lại cùng một tay cầm. Xem: Reusing the same curl handle. Big performance increase?

Nếu bạn không cần yêu cầu đồng bộ, hãy xem xét sử dụng các hàm curl_multi_ * (ví dụ: curl_multi_init, curl_multi_exec, v.v.).

UPDATE:

Tôi đã cố gắng benching curl với việc sử dụng một tay cầm mới cho mỗi yêu cầu và sử dụng tay cầm cùng với đoạn mã sau:

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

và nhận được kết quả như sau:

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

Vì vậy, việc sử dụng lại cùng một tay cầm thực sự cung cấp tăng hiệu suất đáng kể khi kết nối với cùng một máy chủ nhiều lần. Tôi cố gắng kết nối đến các máy chủ khác nhau:

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

Và có kết quả sau:

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

Vẫn còn khá một hiệu suất tăng đáng kể.

+0

Tôi tự hỏi nếu curl đang sử dụng giữ kết nối trực tiếp. Điều đó một mình có thể chiếm hầu hết các tăng hiệu suất. – goat

+0

Tôi tin rằng cURL sử dụng keep-alive, nhưng mỗi cuộc gọi đến curl_exec() khởi tạo một yêu cầu mới (vì các tùy chọn có thể đã thay đổi, vv) Đặc biệt khi kết nối với một máy chủ khác, điều này có thể xảy ra. – AlliterativeAlice

+0

Cảm ơn mọi người. Trong khi tôi đang kết nối với cùng một máy chủ nhưng khác nhau url, Im ngạc nhiên bởi các tiêu chuẩn Otome đăng. Tuy nhiên tôi thực sự thích điểm tin cậy mà Chris đã đăng ..... – makenoiz

Các vấn đề liên quan