Я уже давно пользуюсь 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);
}
Так что при использовании CURLOPT_SSL_VERIFYPEER со значением true он теряет 132 кбайт каждые 18 итераций.Чтобы убедиться, что я не бью мертвую лошадь, система 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-байтовыми объектами, имеющими адрес, при этом оставаясь пустыми.Похоже, что объекты опорожняются, но не освобождаются.
Большое спасибо за любые предложения