我已经使用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字节对象,同时进一步为空。所以它看起来像是被清空但没有被释放。
非常感谢任何建议
答案 0 :(得分:0)
进行许多HTTPS连接时,该问题仍在发生。签出https://bugs.php.net/bug.php?id=76542
粘贴到curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);