Imap加载邮箱内容的性能php-imap |拉拉韦尔

问题描述

我正在编码自己的邮箱系统。

我想加载INBox文件夹。我已经将结果分页/限制为每页40个,但是与真正的Webmail提供商相比,性能仍然很差。

我已经进行了一些研究,如果不加载标志和附件(尤其是附件),则性能似乎很好。

查看40封电子邮件的结果:

// 3 sec~
$selectedFolder->query()->whereAll()->setFetchFlags(false)->setFetchBody(false)->leaveUnread()

// 3 sec~
$selectedFolder->query()->whereAll()->setFetchFlags(true)->setFetchBody(false)->leaveUnread()

// 9 sec~
$selectedFolder->query()->whereAll()->setFetchFlags(true)->setFetchBody(true)->leaveUnread()

巨大的差异来自setFetchBody(true),但是如果我想显示一下电子邮件是否包含附件的快速信息,则需要使用正文,该怎么办?邮件提供商如何取得如此出色的表现?

我唯一能想到的解决方案是:将电子邮件缓存在数据库表中。也许运行cronjob来更新缓存并直接从数据库获取电子邮件,这是怎么做的?

解决方法

如果我对您的理解正确,那么您的问题就是性能。有多种方法可以实现它:

  1. 缓存-尝试缓存应用程序重复几次的所有内容。 Api结果,内容,文件..同时,您应该小心使用它。速度和存储能力之间始终存在困境。
  2. 仅加载您需要的内容。仅显示邮件列表时,无需下载内容,附加文件,历史记录。标题,主题和发件人对于最终用户来说就足够了。当客户按下“显示电子邮件”按钮时,可能会显示电子邮件的其他部分
  3. 分页。您不需要加载所有邮件。
  4. 并行性您可以并行运行4个查询。从理论上讲,您可以处理4倍以上的电子邮件。

这个列表只是大冰山的顶部。完美无止境,优化可能是无止境的。但是我认为,从一开始,这应该足以使结果至少接近其他邮件服务。 另外,我建议您在github上查看其他项目的源代码。在其中很多地方,您可以突出显示其他想法和优化技巧: