我不完全確定為什麼會這樣,但是如果您遍迴信箱中的所有郵件,每次都呼叫 imap_header(),則可以先呼叫 imap_headers() 來顯著提高效能。
比較一下
<?php
$imap = imap_open("{my.server.com:143}INBOX", "user", "pass");
$n_msgs = imap_num_msg($imap);
$s = microtime(true);
for ($i=0; $i<$n_msgs; $i++) {
$header = imap_header($imap, $i);
}
$e = microtime(true);
echo ($e - $s);
imap_close($imap);
?>
使用以下程式碼:
<?php
$imap = imap_open("{my.server.com:143}INBOX", "user", "pass");
$n_msgs = imap_num_msg($imap);
imap_headers($imap)
$s = microtime(true);
for ($i=0; $i<$n_msgs; $i++) {
$header = imap_header($imap, $i);
}
$e = microtime(true);
echo ($e - $s);
imap_close($imap);
?>
根據我在數個不同主機上連線到數個不同伺服器的測試結果,第二段程式碼的執行速度總是快一半甚至更快。
或許是因為 `imap_headers()` 透過單一連線擷取所有訊息,而 `imap_header()` 則必須針對每封訊息發出新的擷取請求?我不確定為什麼先呼叫 `imap_headers()` 會更快,但我確實知道它比較快,所以我想分享這個資訊。如果有人知道原因,請告訴我....