[英]PHP Chilkat imap component memory leaking
鉴于:
会话日志被禁用。
脚本永久运行,通过 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->Disconnect();
RAM不会减少..
当它保持在大致相同的利用率水平时,只需忽略它并添加更多内存......但是当它不断增长时,您将不得不定期清除泄漏。 对于封闭源代码,您只能向供应商抱怨,他们也可能已经建立了使用其库的最佳实践。
根据Chilkat_9_5_0.Imap ,有一个属性VerboseLogging
...还有属性PeekMode
可能会影响内存利用率。
我道歉! 我更仔细地检查了这段代码,似乎 RAM 增加到特定限制! 但仍然很有趣,为什么它会增加..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.