2010-10-03 34 views
9

Khi nào cần đóng kết nối curl và giải phóng tài nguyên mà nó tiêu thụ?sự khác biệt giữa việc thực hiện curl_close() một lần hoặc thường xuyên?

Tại sao tôi hỏi câu hỏi này, khá đơn giản vì tôi đã nói, bộ thu gom PHP thực hiện tất cả điều này và đôi khi không cần phải đóng kết nối DB hoặc gọi phương thức __destruct để giải phóng tài nguyên.

Vì, khoảnh khắc đó tôi thực sự bắt đầu nghĩ về nơi tôi cần phải gọi nó sau đó? Tại thời điểm này tôi quan tâm với câu hỏi đó kể từ khi tôi viết một thư viện nhỏ cho curl và tôi muốn hiểu khi nào tôi cần phải sử dụng chức năng curl_close().

Cảm ơn tất cả các bạn đã thảo luận và giải thích về nó.

Trả lời

5

theo như tôi hiểu. GC chỉ dọn dẹp các tài nguyên không còn được sử dụng/tham chiếu nữa. như bất cứ khi nào các biến curl rơi ra khỏi phạm vi, nó sẽ được làm sạch. Nhưng điều đó chỉ có thể xảy ra sau khi tập lệnh kết thúc hoặc bất cứ khi nào phiên bị hủy (tùy thuộc vào phạm vi).

Nhưng để được ở bên an toàn, chỉ cần làm theo ý nghĩa thông thường .. đóng nó khi nó không còn cần thiết.

+5

Nhưng, đó không phải là mã không cần thiết? – Eugene

+7

@Eugene - Bạn không đóng cửa trước sau khi ra ngoài? ;) – Christian

+4

@Christian Sciberras Tùy thuộc. – Eugene

7

Kết quả cho 100 lần curl_exec (lấy url với một công tắc bộ nhớ cache):

Thi trong mỗi vòng lặp:

for ($i = 0; $i < 100; ++$i) { 
    $c = curl_init(); 
    curl_setopt($c, CURLOPT_URL, "http://www.google.com/?rand=" . rand()); 
    curl_exec($c); 
    curl_close($c); 
} 

8,5 giây

Thực thi một lần duy nhất:

$c = curl_init(); 
for ($i = 0; $i < 100; ++$i) { 
    curl_setopt($c, CURLOPT_URL, "http://www.google.com/?rand=" . rand()); 
    curl_exec($c); 
} 
curl_close($c); 

5.3 giây


Quyết định: nếu bạn đang chạy tấn của các cuộc gọi, sau đó sử dụng phương pháp nhanh như một tối ưu hóa. (source)

-1

Tùy thuộc. Trong trường hợp của tôi kể từ khi tôi được khởi dụ curl trong tùy chỉnh của tôi CurlClient constructor

$this->ch = curl_init(); 

Và sau đó sử dụng cùng một đối tượng $curlClient cho nhiều cuộc gọi api, đóng dụ

curl_close($this->ch); 

sẽ ảnh hưởng đến cuộc gọi API khác. Các phương thức sử dụng cùng một đối tượng sẽ không hoạt động, vì vậy tôi không đóng nó.

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