【问题标题】:slow php imap email fetching ( >10 seconds )缓慢的 php imap 电子邮件获取(>10 秒)
【发布时间】:2015-03-13 19:20:41
【问题描述】:

我正在构建自己的网络邮件客户端。例如 Roundcube 或 Squirrelmail。问题是我的版本很慢,而 Roundcube 很快,我不明白为什么会这样(Roundcube 的源非常大,我无法深入了解它..)

目标 - 从邮箱中获取最后 50 条消息。我的策略:

  1. 通过imap_num_msg()获取邮箱中的邮件数量

  2. 制作从max到(max-50)的序列号数组

  3. 对于每个序列号,我运行了函数 imap_header() 和 imap_fetchstructure()

需要 10-15 秒。它允许我获取每条消息的标题、日期、是否有附件、发件人、发件人等信息。

然而,Roundcube 显示相同的信息,但加载时间只有 3 秒左右。我的策略似乎非常错误。我怎样才能更快地做到这一点?我很确定为每个序列号运行 imap_header 和 imap_fetchstructure 一定很慢,但我认为没有其他方法可以获取该信息。我正在做这样的事情:

function getMessageBySequenceNumber($imapStream, $sequence_number){

    $header = imap_header($imapStream, $sequence_number);
    $structure = imap_fetchstructure($imapStream, $sequence_number);

    /* 
    ... some code parsing $structure to find out whether this emails has any attachments or not 
    */

    return [
        'uid' => imap_uid($imapStream, $i),
        'subject' => $header->subject,
        'timestamp' => $header->udate,
        'unseen' => $header->Unseen,
        'star' => $header->Flagged,
        'draft' => $header->Draft,
        'size' => $header->size,
        'has_attachments_bool' => $has_attachments_bool,
    ];
}

$imapStream = imap_open();
$first_sequence_number = imap_num_msg(); // lets imagine it returns 100
$last_sequence_number = $first_sequence_number-50;
$sequence_numbers = [100,99,88 ..., 51, 50];

$messages = [];
foreach($sequence_numbers as $sequence_number){
    $messages[] = getMessageBySequenceNumber($imapStream, $sequence_number);
}

return $messages;

【问题讨论】:

  • 你必须分享一些代码,否则不可能看到什么会触发陷阱。我认为正在发生的一件事是您加载了太多数据。只需完整加载前最多 5 条消息,然后加载单个消息。
  • 您一次应该能够获取多条消息。
  • 嗯 - 怎么样?这就是问题所在。 imap_header() 和 imap_fetchstructure() 似乎一次只允许一条消息。

标签: php imap roundcube


【解决方案1】:

您正在逐一获取消息。这意味着您的 PHP 代码必须等待远程 IMAP 服务器回复您,然后您的 PHP 代码将处理(部分)响应,将数据发送回服务器等。

使用允许批处理操作的 IMAP 库,并阅读 RFC 3501 以了解如何使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 2013-02-16
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多