2015-03-13 73 views
0

我正在建立自己的網絡郵件客戶端。例如,像Roundcube或Squirrelmail。問題是我的版本很慢,而Roundcube速度很快,我不明白爲什麼(Roundcube的源代碼非常大,我無法潛入其中)。緩慢的PHP IMAP電子郵件抓取(> 10秒)

目標 - 從最後50條消息中獲取郵箱。我的策略:通過imap_num_msg()在郵箱中郵件的

  1. 獲取數

  2. 序列號的

    ,並使陣列從最大到(MAX-50)

  3. 對於每一個序列號我跑功能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; 
+0

你必須分享一些代碼,否則不可能看到什麼可能引發陷阱。我相信發生的一件事是您正在加載太多數據。只需加載第一條最多5條消息,然後加載各條消息。 – flyandi 2015-03-13 19:26:22

+0

添加了一些代碼.. – user3702861 2015-03-13 19:49:50

+1

您應該可以一次獲取多條消息。 – Max 2015-03-13 20:44:17

回答

0

你逐個獲取消息。這意味着您的PHP代碼必須等待遠程IMAP服務器回答您,然後您的PHP代碼將處理(部分)響應,將數據發送回服務器等。

使用IMAP庫它允許批量操作,並閱讀RFC 3501以瞭解如何使用它。