2012-08-15 11 views
5

メモリが指数関数的に増加するcURLを使用するループでこの問題が発生します。このサンプルスクリプトでは、約14MBのメモリを使用し始め、28MBで終了し、元のスクリプトで1.000.000まで繰り返すと、メモリは800MBに増えますが、これは悪いです。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

'curl_multi_init'を試しましたか?多分それは助けます。 http://tr.php.net/manual/en/function.curl-multi-init.php –

+0

私はcurl_multiを試してみます。同じ問題ですが、それはもっと遅くなっています。 – user1173536

答えて

0

一つの解決策は、メモリが解放されることを可能にされ、カールあまりを呼び出すために(100回を言う)してからページを更新することです。

4

私はメモリリークの修正を見つけたと思います。私はPHPスクリプトでcurl libを使用して同じ問題を抱えています。 curl_exec()関数を繰り返し呼び出すと、メモリが使い尽くされます。

PHP bug reportによると、このメモリリークは、次のコードのように、それを閉じた後カールハンドラを設定解除に固定することができる。

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

ありがとうございますが、これは私のコードであり、効果はありません。メモリはまだ成長 – user1173536

0

これは遅れているが、私はあなたの場合、このインスタンスでcurl_closeを使用しないことをお勧めします、またはそれをforループの外側に置きます。

私たちは、多くのループの後にカールメモリーが漏れ始めたのと同様の問題がありました。私たちはcurl_multiを使い、個々のハンドラを閉じていました。これが私たちの記憶を傷つけました。ハンドラーをcurl_initで上書きするだけで十分だと思われます。 curl_closeに問題があるようです。