我正在建立自己的網絡郵件客戶端。例如,像Roundcube或Squirrelmail。問題是我的版本很慢,而Roundcube速度很快,我不明白爲什麼(Roundcube的源代碼非常大,我無法潛入其中)。緩慢的PHP IMAP電子郵件抓取(> 10秒)
目標 - 從最後50條消息中獲取郵箱。我的策略:通過imap_num_msg()在郵箱中郵件的
獲取數
- 序列號的
,並使陣列從最大到(MAX-50)
對於每一個序列號我跑功能imap_header()和imap_fetchstructure()
需要10-15秒。它允許我獲取每個消息的標題,日期,是否有附件,從,到和其他信息。
但是,Roundcube顯示相同的信息,但加載時間僅爲3秒左右。我的策略似乎是非常錯誤的。我該如何做得更快?我敢肯定,它必須是緩慢的RAN 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條消息,然後加載各條消息。 – flyandi 2015-03-13 19:26:22
添加了一些代碼.. – user3702861 2015-03-13 19:49:50
您應該可以一次獲取多條消息。 – Max 2015-03-13 20:44:17