【问题标题】:PHP Chilkat imap component memory leakingPHP Chilkat imap 组件内存泄漏
【发布时间】:2020-01-11 15:49:48
【问题描述】:

给定:

  1. ubuntu 18.04
  2. PHP 7.2.2 (cli)(构建时间:2019 年 5 月 12 日 14:29:04)(ZTS)
  3. Chilkat 组件 9.5.0.78

会话日志被禁用。

脚本永久运行,通过 ssh 连接并保持打开状态。

定期调用以下函数:

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

这只是为了证明,linux top 上的 RES 和 %MEM 不断增加:

还有非常重要的时刻:

获取几封大邮件后,如果有执行则下一个代码:

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

然后 RES 和 %MEM 下降到初始值!

但没有

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

RES 和 %MEM 保持高值!

从逻辑上讲,我可以预测 imap CkImap 对象内部的问题...

我能做什么?定期取消设置 CkImap 对象并重新连接不是很好的解决方案...

为什么会这样?也许 chilkat 将数据存储在自己的某个地方?我应该调用一些方法来清除它?

可重现的代码:

<?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 秒获取一次电子邮件,并且 RAM 消耗不断增加。但它不能,因为我们覆盖了 $mime 变量。一旦 imap 未设置 - RAM 将下降到第一个值。

get_VerboseLogging - 默认情况下为 false。而 Peek 模式我也尝试设置为 false。没有任何帮助解决或找出问题。

即使在$imap-&gt;Disconnect(); 之后,RAM 也不会减少..

【问题讨论】:

  • 如果您可以提供一个 minimal reproducible example 来证明这一点,则可以判断它是您的代码中的错误还是其他地方的错误。没有这些信息,就不可能说出正确的方法。
  • 只取几封大邮件,我提供了代码,就够了。它将不断增加 RAM。我将添加这样的完整代码
  • 请阅读链接:您提供的代码片段都不好(不足以重现)和完整的代码(可能包含不相关的部分)!
  • @Ulrich Eckhardt,我添加了经过我测试的简单代码

标签: php ubuntu imap chilkat


【解决方案1】:

当它保持在大致相同的利用率水平时,只需忽略它并添加更多 RAM ...但是当它继续增长时,您将不得不定期清除泄漏。对于封闭源代码,您只能向供应商投诉,他们可能也已经建立了使用其库的最佳实践。

根据Chilkat_9_5_0.Imap,有一个属性VerboseLogging

...还有属性PeekMode 可能会影响内存利用率。

【讨论】:

  • 你完全正确! RAM 正在永久增加。没有供应商的帮助,我只能做一些类似重新打开过程的事情......
  • @Mikael 它也可能与RFC 4549 - Synchronization Operations for Disconnected IMAP4 Clients 有关,这意味着:邮箱大小。即使使用封闭源代码,也可以附加调试器 - 尽管无法修复任何东西。
  • 您提供的链接只是IMAP协议的解释。我不认为可能存在内存泄漏问题
  • @Mikael 我发现屏幕截图中的内存使用情况甚至不算极端(这与 OOM 相差甚远),而且 IMAP 的工作方式与 POP3 不同,因为它更希望建立连接 - 它获取的不仅仅是指数。我更想知道 SSH 隧道而不是 IMAPS,因为邮件服务器通常有一个公共 IP。
  • 在截图上并不极端,只是为了说明我的意思。在具有 250GB RAM 的实时服务器上,它的增长势不可挡.. Ssh 是套接字连接,它使用缓冲区.. 我真的认为问题出在 chilkat CkImap 对象中
【解决方案2】:

我道歉!我已经更仔细地检查了这段代码,并且似乎 RAM 增加了直到特定限制!但仍然很有趣,为什么它会增加..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2016-02-10
    • 2023-03-17
    • 2012-04-17
    • 2012-01-12
    • 2017-01-28
    • 2016-03-30
    相关资源
    最近更新 更多