2012-08-15 45 views
5

Tôi gặp sự cố này với vòng lặp sử dụng cURL nơi bộ nhớ tăng theo cấp số nhân. Trong kịch bản ví dụ này, nó bắt đầu sử dụng khoảng 14MB bộ nhớ và kết thúc với 28MB, với kịch bản gốc của tôi và lặp lại đến 1.000.000, bộ nhớ tăng lên 800MB, điều đó là xấu.Tăng trưởng bộ nhớ vòng lặp cURL

PHP 5.4.5
cURL 7.21.0

for ($n = 1; $n <= 1000; $n++){ 

    $apiCall = 'https://api.instagram.com/v1/users/' . $n . '?access_token=5600913.47c8437.358fc525ccb94a5cb33c7d1e246ef772'; 

    $options = Array(CURLOPT_URL => $apiCall, 
        CURLOPT_RETURNTRANSFER => true, 
        CURLOPT_FRESH_CONNECT => true 
    ); 

    $ch = curl_init(); 
    curl_setopt_array($ch, $options); 
    $response = curl_exec($ch); 
    curl_close($ch); 

    unset($ch); 
} 
+0

Bạn đã thử 'curl_multi_init' chưa? Có lẽ nó giúp. http://tr.php.net/manual/en/function.curl-multi-init.php –

+0

Tôi cố gắng curl_multi, nụ đó là cùng một vấn đề, thậm chí nó chậm hơn. – user1173536

Trả lời

0

Một giải pháp sẽ được gọi curl ít (nói 100 lần) và sau đó để làm mới trang, mà có thể cho phép bộ nhớ được giải phóng.

4

Tôi nghĩ rằng tôi đã tìm thấy bản sửa lỗi cho rò rỉ bộ nhớ. Tôi đã có cùng một vấn đề bằng cách sử dụng lib curl trong một kịch bản PHP. Sau khi lặp lại các cuộc gọi đến hàm curl_exec(), bộ nhớ sẽ cạn kiệt.

Theo một PHP bug report rò rỉ bộ nhớ này có thể được cố định unset handler Curl sau khi đóng nó, như mã tiếp theo:

... 
curl_close($ch); 
unset($ch); 
+0

Cảm ơn, nhưng điều này là trong mã của tôi, và không có hiệu lực. Bộ nhớ vẫn tăng trưởng – user1173536

0

Đây là muộn, nhưng tôi khuyên bạn nên chống lại bằng curl_close trong trường hợp này, hoặc nếu bạn làm, đặt nó bên ngoài vòng lặp for.

Chúng tôi gặp sự cố tương tự khi bộ nhớ curl bắt đầu bị rò rỉ sau nhiều vòng lặp. Chúng tôi đã sử dụng curl_multi và đóng từng bộ xử lý riêng lẻ, khiến bộ nhớ của chúng tôi trở thành những kẻ lừa đảo. Ghi đè lên xử lý với curl_init có vẻ là quá đủ. Dường như có vấn đề với curl_close.

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