PHP Утечка памяти в компоненте Chilkat imap - PullRequest
0 голосов
/ 09 января 2020

Дано:

  1. Ubuntu 18.04
  2. PHP 7.2.2 (cli) (построено: 12 мая 2019 14:29:04) (ZTS)
  3. Компонент Chilkat 9.5.0.78

Журнал сеанса отключен.

Сценарий работает постоянно, соединение через s sh и остается открытым.

Следующее функция вызывается периодически:

protected function fetchSingle(int $uid)
{
    $e = $this->imap->fetchSingleAsMime($uid, true);
}

Это просто для демонстрации того, что RES и% MEM на вершине linux продолжают расти:

enter image description here

И очень важный момент:

после получения нескольких больших писем, если выполняется, затем следующий код:

$this->imap = null;
unset($this->imap);
sleep(324);

Затем RES и% MEM go до исходных значений!

Но без

$this->imap = null;
unset($this->imap);

RES и% MEM остаются высокими значениями!

Логически я могу предсказать эту проблему внутри объекта imap CkImap ...

Что я могу сделать ? Периодически сбрасывать объект CkImap и переподключать - не хорошее решение ...

Почему это так? Может, чилкат хранит данные где-то в себе? И я должен вызвать какой-то метод, чтобы очистить его?

Воспроизводимый код:

<?php

require "core/Chilkat.php";

$ckGlobal = new CkGlobal();

$ckGlobal->UnlockBundle('XXXX');

$imap = new CkImap();
$imap->put_Utf8(true);
$imap->put_Ssl(true);
$imap->put_Port(993);
$imap->put_PeekMode(true);

$imap->Connect('imap');

$imap->Login('login', 'password');

$imap->SelectMailbox('Inbox');

// UID of last message
preg_match('/UID (\d+)/', $imap->sendRawCommand("FETCH * (UID)"), $result);


$i = 0;
while(true){
    var_dump('FETCHING');
    $mime = $imap->fetchSingleAsMime($result[1], true);
    var_dump('SLEEP');
    sleep(5);
    if(++$i >= 5) {
        var_dump('UNSET');
        $imap = null;
        unset($imap);
        sleep(666);
    }
}

С помощью приведенного выше кода мы получаем электронную почту каждые 5 секунд, и потребление ОЗУ не останавливается. Но это не должно быть, потому что мы перезаписываем переменную $ mime. И когда imap не установлен - ОЗУ возвращается к первому значению.

get_VerboseLogging - по умолчанию это false. И режим Peek я тоже пытался установить в false. Ничто не помогло решить или выяснить проблему.

Даже после $imap->Disconnect(); ОЗУ не уменьшится ..

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Прошу прощения! Я проверил этот код более тщательно и, кажется, объем оперативной памяти увеличился до указанного предела c! Но все же интересно, почему оно увеличивается ..

0 голосов
/ 09 января 2020

Когда он остается примерно на одном и том же уровне использования, просто игнорируйте его и добавьте больше ОЗУ ... но когда он продолжает расти, вам придется периодически очищать утечку. С закрытым исходным кодом вы можете жаловаться только на поставщика, который, возможно, также установил лучшие практики использования своей библиотеки.

Согласно Chilkat_9_5_0.Imap , есть свойство VerboseLogging

... а также свойство PeekMode может повлиять на использование памяти.

...