【问题标题】:Imap loading mailbox contents performance | php-imap | laravelImap 加载邮箱内容性能 | php-imap |拉拉维尔
【发布时间】:2021-02-03 05:40:53
【问题描述】:

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

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

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

查看 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 来更新缓存并直接从数据库中获取电子邮件,这是如何完成的?

【问题讨论】:

  • 我会建立一个数据库结构并将电子邮件/附件的内容添加到其中,访问本地信息比每次查找它们要快得多;)。现在有一个 cron 作业,每分钟轮询一次以下载以前未下载的任何消息。然后,当您实际阅读一条消息时,将一条消息发送回邮箱,说明它已被阅读以及您需要的任何其他功能

标签: php laravel imap


【解决方案1】:

如果我理解正确,您的问题是性能。并且有不同的方法来实现它:

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

而这份清单只是冰山一角。完美无止境,优化可以无止境。但我认为首先,这应该足以让结果至少接近其他邮件服务。 另外,我建议您查看 github 上其他项目的源代码。您可以在其中突出显示其他优化想法和技巧:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2021-05-21
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    相关资源
    最近更新 更多