【发布时间】: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