PHP Chilkat imap组件内存泄漏

PHP Chilkat imap组件内存泄漏,php,ubuntu,imap,chilkat,Php,Ubuntu,Imap,Chilkat,鉴于: ubuntu 18.04 PHP 7.2.2(cli)(构建时间:2019年5月12日14:29:04)(ZTS) Chilkat组件9.5.0.78 会话日志已禁用 脚本永久运行,通过ssh连接并保持打开状态 定期调用以下函数: protected function fetchSingle(int $uid) { $e = $this->imap->fetchSingleAsMime($uid, true); } 这只是为了证明linux top上的RES和%ME

鉴于:

  • ubuntu 18.04
  • PHP 7.2.2(cli)(构建时间:2019年5月12日14:29:04)(ZTS)
  • 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);
        }
    }
    

    当它保持在大约相同的利用率级别时,只需忽略它并添加更多RAM…但当它继续增长时,您必须定期清除泄漏。对于封闭源代码,您只能向供应商投诉,因为供应商可能已经建立了使用其库的最佳实践

    根据,有一个属性
    VerboseLogging


    。。。而且属性
    peek模式
    可能会影响内存利用率。

    很抱歉!我更仔细地检查了这段代码,似乎RAM增加到了特定的限制!但这仍然很有趣,为什么它在增加。

    你完全正确!RAM永久性地增加。如果没有供应商的帮助,我只能执行类似于重新打开进程的操作…@Mikael它可能也与此有关,这意味着:邮箱大小。即使使用封闭源代码,也可以附加调试器,尽管无法修复任何问题。您给出的链接只是对IMAP协议的解释。我不认为有什么关于内存泄漏的事情problem@Mikael我发现屏幕截图中的内存使用情况甚至都不极端(这远不是OOM),IMAP的工作方式与POP3不同,因为它更希望有一个连接,而且它获取的不仅仅是索引。我更想知道SSH隧道而不是IMAPS,因为邮件服务器通常都有一个公共IP。在屏幕截图上,这并不极端,只是为了说明我的意思。在具有250GB RAM的实时服务器上,它的增长势不可挡。。Ssh是套接字连接,它使用缓冲区。。我真的认为问题出在chilkat CkImap Objective中。如果您可以提供一个示例来演示这一点,那么就有可能知道这是代码中的错误还是其他地方的错误。如果没有这些信息,就不可能知道正确的方法。只需获取几封大邮件,我提供了代码,就足够了。它将持续增加RAM。我将添加这样的完整代码请阅读链接:您提供的snippits都不好(不足以复制),也不完整代码(可能包含不相关的部分)@Ulrich Eckhardt,我添加了我测试过的简单代码