我正在构建自己的网络邮件客户端。例如 Roundcube 或 Squirrelmail。问题是我的版本很慢,而 Roundcube 很快,我不明白为什么会这样(Roundcube 的源非常大,我无法深入了解它..)
目标 - 从邮箱中获取最后 50 条消息。我的策略:
通过 imap_num_msg() 获取邮箱中的消息数
制作从 max 到 (max-50) 的序列号数组
对于每个序列号,我运行了函数 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;