PHP curl, утечка памяти при использовании CURLOPT_SSL_VERIFYPEER, true - PullRequest
2 голосов
/ 09 февраля 2012

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

Большое спасибо за любые предложения

1 Ответ

0 голосов
/ 02 октября 2018

Проблема по-прежнему возникает при выполнении многих подключений HTTPS.Проверьте это https://bugs.php.net/bug.php?id=76542

Придерживайтесь curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

...