PHP curl,使用CURLOPT_SSL_VERIFYPEER时内存泄漏,为true

时间:2012-02-09 19:14:39

标签: php memory-leaks libcurl

我已经使用cloudfusion很长一段时间了,需要切换到较新版本的AWS sdk并遇到内存泄漏问题。据报道内存泄漏大约一年,没有真正的解决方案。经过大量阅读,运行测试和调查结果后,以下简单守护进程再现了问题

#! /usr/bin/env php
<?php class httpsTest{
    function curlHttps($memLeak=false){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, 'https://sqs.us-east-1.amazonaws.com');
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $memLeak);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_exec($curl);
        curl_close($curl);
    }
}
gc_enable();
$myPid = getmypid();$i=0;
$test  = new httpsTest();
while ($test){
    $test->curlHttps(true);
    echo $i++ ." PHP Info MemUsage: ".memory_get_usage() ."    Linux Info ";
    system('cat /proc/' .$myPid .'/status|grep '.'"VmSize"');
    sleep(1);
}

因此,当使用值为true的CURLOPT_SSL_VERIFYPEER时,它每18次迭代会泄漏132千字节。为了确保我没有击败死马,fedora 14系统已经使用php 5.3.10,libcurl 7.24.0.-1.0,nss-3.12.10-7,openssl-1.0.0e-1进行了更新。

我无法想象之前没有人遇到过这个问题,虽然当你只依靠php内存报告它看起来很好。为了确保我已经向php专家报告过了,但看起来php正在做正确的事情并且泄漏是在使用过的库中创建的。

我可以做些什么来收集解决问题的有用信息,我检查了泄漏的堆,并且可以清楚地看到泄漏和没有泄露情况的差异。在泄露的情况下,堆的顶部充满了大多数具有地址的16字节对象,同时进一步为空。所以它看起来像是被清空但没有被释放。

非常感谢任何建议

1 个答案:

答案 0 :(得分:0)

进行许多HTTPS连接时,该问题仍在发生。签出https://bugs.php.net/bug.php?id=76542

粘贴到curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);