【发布时间】:2020-01-11 15:49:48
【问题描述】:
给定:
- 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);
}
}
使用上面的代码,我们每 5 秒获取一次电子邮件,并且 RAM 消耗不断增加。但它不能,因为我们覆盖了 $mime 变量。一旦 imap 未设置 - RAM 将下降到第一个值。
get_VerboseLogging - 默认情况下为 false。而 Peek 模式我也尝试设置为 false。没有任何帮助解决或找出问题。
即使在$imap->Disconnect(); 之后,RAM 也不会减少..
【问题讨论】:
-
如果您可以提供一个 minimal reproducible example 来证明这一点,则可以判断它是您的代码中的错误还是其他地方的错误。没有这些信息,就不可能说出正确的方法。
-
只取几封大邮件,我提供了代码,就够了。它将不断增加 RAM。我将添加这样的完整代码
-
请阅读链接:您提供的代码片段都不好(不足以重现)和完整的代码(可能包含不相关的部分)!
-
@Ulrich Eckhardt,我添加了经过我测试的简单代码