Я довольно давно использую 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-байтовыми объектами, имеющими адрес, будучи еще более пустыми. Таким образом, похоже, что объекты очищаются, но не освобождаются.
Большое спасибо за любое предложение