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
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,我添加了我测试过的简单代码