【问题标题】:PHP curl, memory leak when using CURLOPT_SSL_VERIFYPEER, truePHP curl,使用 CURLOPT_SSL_VERIFYPEER 时的内存泄漏,true
【发布时间】:2012-03-02 07:12:02
【问题描述】:

我使用 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 KB。为了确保我没有打败死马,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 字节的对象,它们有一个地址,同时又是空的。所以看起来对象正在被清空但没有被释放。

非常感谢您的任何建议

【问题讨论】:

    标签: php memory-leaks libcurl


    【解决方案1】:

    在进行许多 HTTPS 连接时,问题仍然存在。看看这个https://bugs.php.net/bug.php?id=76542

    坚持curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

    【讨论】:

      猜你喜欢
      • 2011-05-28
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2016-02-10
      • 2023-03-17
      相关资源
      最近更新 更多