慢速php imap电子邮件提取(> 10秒)

时间:2015-03-13 19:20:41

标签: php imap roundcube

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

目标 - 从邮箱中获取最近50封邮件。我的策略:

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

  2. 从最大值到(max-50)

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

  5. 需要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;
    

1 个答案:

答案 0 :(得分:0)

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

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